Redis客户端Redisson的简单应用

Redisson是一个基于Netty和Redis的客户端,提供了分布式工具的Java实现。通过引入对应的依赖并设置序列化方式,我们可以创建Redisson对象进行单机或Sentinel模式的连接。在Spring配置中注入RedissonClient,可以方便地在不同环境中动态创建和使用。
部署运行你感兴趣的模型镜像

    Redisson是在基于NIO的Netty框架之上,充分的利用了Redis键值数据库提供的一系列优势,在Java实用工具包常用接口的基础上,为使用者提供了一系列具有分布式特性的常用工具类。简单来说,我们通过Redisson能够更方便的操作redis。具体介绍可以参考https://github.com/redisson/redisson

1、引入依赖

   3.7.0 支持JDK1.8, 1.9, 1.10+

    2.12.0 支持JDK 1.6,1.7,1.8,1.9,1.10,Android

        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.7.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.5</version>
        </dependency>

Redisson默认使用jackson方式进行序列化,在使用3.7版本时,如果只引入redisson,运行时会报如下错误:

Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.ObjectMapper.setVisibility(Lcom/fasterxml/jackson/databind/introspect/VisibilityChecker;)Lcom/fasterxml/jackson/databind/ObjectMapper;
	at org.redisson.codec.JsonJacksonCodec.init(JsonJacksonCodec.java:159)
	at org.redisson.codec.JsonJacksonCodec.<init>(JsonJacksonCodec.java:109)
	at org.redisson.codec.JsonJacksonCodec.<init>(JsonJacksonCodec.java:94)
	at org.redisson.codec.JsonJacksonCodec.<clinit>(JsonJacksonCodec.java:61)
	at org.redisson.config.Config.<init>(Config.java:110)
	at org.redisson.Redisson.<init>(Redisson.java:117)
	at org.redisson.Redisson.create(Redisson.java:156)

引入jackson 2.9.5版本jar包可解决此问题,原因是redisson的jar包中默认的jackson版本是2.7.9,版本太低。

2、手动方式创建Redisson对象

        Config config = new Config();
        config.useSingleServer().setAddress("redis://10.200.41.33:15020");
        RedissonClient client = Redisson.create(config);
        RAtomicLong aLong = client.getAtomicLong("redisson-aa");
        aLong.set(100L);
        System.out.println("---------"+aLong.get());
        RBucket<Test> bucket =  client.getBucket("redisson-object");
        bucket.set(new Test("hello", 20), 10, TimeUnit.SECONDS);
        Test atest = bucket.get();
        System.out.println("----------"+atest);

config.useSingleServer代表使用的是单机模式的Redis,如果要使用sentinel模式的redis,则调用useSentinelConfig即可。

3、使用Spring配置文件创建Redisson对象

<redisson:client id="redissonClient">
        <redisson:single-server  address="redis://127.0.0.1:6379" />
    </redisson:client>
    
    <redisson:client id="sentinelRedissonClient">
        <redisson:sentinel-servers master-name="mymaster">
            <redisson:sentinel-address value="redis://127.0.0.1:26379" />
            <redisson:sentinel-address value="redis://127.0.0.1:26380" />
            <redisson:sentinel-address value="redis://127.0.0.1:26381" />
        </redisson:sentinel-servers>
    </redisson:client>

使用时,直接在代码里注入即可:

    @Resource
    private RedissonClient redissonClient;
    @Resource
    private RedissonClient sentinelRedissonClient;

4、根据需要动态创建单机模式对象和sentinel模式对象(主要用于开发环境和生产环境redis部署不统一的问题)

创建RedissonClientBeanFactory对象,根据情况初始化RedissonClient对象

package com.lizhy.demo;

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;

import java.util.List;

/**
 * NOTE:动态生成RedissonClient,适配sentinel集群模式和单机模式
 *
 * @author lizhiyang
 * @Date 2018-05-27 13:49
 */
public class RedissonClientBeanFactory implements FactoryBean<RedissonClient>, InitializingBean, DisposableBean {
    private RedissonClient redissonClient;
    private boolean sentinel;
    private String singleServerAddress;
    private String sentinelMasterName;
    private List<String> sentinelServerAddressList;
    @Override
    public RedissonClient getObject() throws Exception {
        return redissonClient;
    }

    @Override
    public Class<?> getObjectType() {
        return RedissonClient.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        Config config = new Config();
        if(sentinel) {
            String[] arr = new String[sentinelServerAddressList.size()];
            sentinelServerAddressList.toArray(arr);

            config.useSentinelServers()
                    .setMasterName(sentinelMasterName)
                    .addSentinelAddress(arr);
        } else {
            config.useSingleServer()
                    .setAddress(singleServerAddress);
        }
        redissonClient = Redisson.create(config);
    }

    public void setSentinel(boolean sentinel) {
        this.sentinel = sentinel;
    }

    public void setSingleServerAddress(String singleServerAddress) {
        this.singleServerAddress = singleServerAddress;
    }

    public void setSentinelMasterName(String sentinelMasterName) {
        this.sentinelMasterName = sentinelMasterName;
    }

    public void setSentinelServerAddressList(List<String> sentinelServerAddressList) {
        this.sentinelServerAddressList = sentinelServerAddressList;
    }

    @Override
    public void destroy() throws Exception {
        redissonClient.shutdown();
        redissonClient = null;
    }
}

spring配置文件如下:

<bean id="myRedissonClient" class="com.lizhy.demo.RedissonClientBeanFactory">
        <property name="sentinel" value="true" />
        <property name="sentinelMasterName" value="mymaster" />
        <property name="singleServerAddress" value="redis://127.0.0.1:6379" />
        <property name="sentinelServerAddressList">
            <list>
                <value>redis://127.0.0.1:26379</value>
                <value>redis://127.0.0.1:26380</value>
                <value>redis://127.0.0.1:26381</value>
            </list>
        </property>
    </bean>

使用时直接注入对象:

    @Resource
    private RedissonClient myRedissonClient;
完整代码更多例子可参考git: https://github.com/lizhyocx/spring-boot-learning/tree/master/spring-boot-redisson

您可能感兴趣的与本文相关的镜像

GPT-SoVITS

GPT-SoVITS

AI应用

GPT-SoVITS 是一个开源的文本到语音(TTS)和语音转换模型,它结合了 GPT 的生成能力和 SoVITS 的语音转换技术。该项目以其强大的声音克隆能力而闻名,仅需少量语音样本(如5秒)即可实现高质量的即时语音合成,也可通过更长的音频(如1分钟)进行微调以获得更逼真的效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值