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
Redisson是一个基于Netty和Redis的客户端,提供了分布式工具的Java实现。通过引入对应的依赖并设置序列化方式,我们可以创建Redisson对象进行单机或Sentinel模式的连接。在Spring配置中注入RedissonClient,可以方便地在不同环境中动态创建和使用。
2654

被折叠的 条评论
为什么被折叠?



