redis-客户端redisson的使用

中文文档(很详细)

Redisson的中文文档写的非常详细,所以本文主要记录简单使用过程中遇到的一些问题

1. 原生api的使用

依赖引入:

1
2
3
4
5
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.14.1</version>
</dependency>

配置:

两种方式:代码配置和配置文件

1
2
3
4
5
6
7
8
9
10
11
private static RedissonClient redissonClient;
static{
Config config = new Config();
//config.setCodec(new org.redisson.client.codec.StringCodec());
config.setCodec(new JsonJacksonCodec());
//指定使用单节点部署方式
config.useSingleServer()
.setAddress("redis://storage.m.io:6379")
.setPassword("0gn736xl73083Vm6wwnBDJSI20duFIeLv068Q1kLM4u58GD8q4SEugmSFd8TfFTm");
redissonClient = Redisson.create(config);
}

配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#redisson-config.yml
singleServerConfig:
idleConnectionTimeout: 10000
connectTimeout: 10000
timeout: 3000
retryAttempts: 3
retryInterval: 1500
password: null
subscriptionsPerConnection: 5
clientName: null
address: "redis://localhost:6379"
subscriptionConnectionMinimumIdleSize: 1
subscriptionConnectionPoolSize: 50
connectionMinimumIdleSize: 32
connectionPoolSize: 64
database: 0
dnsMonitoringInterval: 5000
threads: 0
nettyThreads: 0
codec: !<org.redisson.client.codec.StringCodec> {}
"transportMode": "NIO"
1
2
3
4
5
try {
Config config1 = Config.fromYAML("classpath:redisson-config.yml");
} catch (IOException e) {
e.printStackTrace();
}

基本使用去看文档,写得很清楚

集群模式配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
clusterServersConfig:
idleConnectionTimeout: 10000
connectTimeout: 10000
timeout: 3000
retryAttempts: 3
retryInterval: 1500
failedSlaveReconnectionInterval: 3000
failedSlaveCheckInterval: 60000
password: null
subscriptionsPerConnection: 5
clientName: null
loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}
subscriptionConnectionMinimumIdleSize: 1
subscriptionConnectionPoolSize: 50
slaveConnectionMinimumIdleSize: 24
slaveConnectionPoolSize: 64
masterConnectionMinimumIdleSize: 24
masterConnectionPoolSize: 64
readMode: "SLAVE"
subscriptionMode: "SLAVE"
nodeAddresses:
- "redis://127.0.0.1:7004"
- "redis://127.0.0.1:7001"
- "redis://127.0.0.1:7000"
scanInterval: 1000
pingConnectionInterval: 0
keepAlive: false
tcpNoDelay: false
threads: 16
nettyThreads: 32
codec: !<org.redisson.codec.MarshallingCodec> {}
transportMode: "NIO"

2. spring集成

在springboot中使用redisson需要引入另外一个包:

1
2
3
4
5
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.14.0</version>
</dependency>

该项目的地址如下:

https://github.com/redisson/redisson/tree/master/redisson-spring-boot-starter

该包中已自动引入了redisson的原生jar包,此外还需要注意与版本兼容问题:

redisson-spring-data module name Spring Boot version
redisson-spring-data-16 1.3.x
redisson-spring-data-17 1.4.x
redisson-spring-data-18 1.5.x
redisson-spring-data-20 2.0.x
redisson-spring-data-21 2.1.x
redisson-spring-data-22 2.2.x
redisson-spring-data-23 2.3.x
redisson-spring-data-24 2.4.x

配置使用:

在application.yml配置文件中进行如下配置:

1
2
3
4
spring:
redis:
redisson:
file: classpath:redisson-config.yaml

注意,这样配置之后,redisTemplate也能正常使用,且使用的也是redisson的配置。

2.1 消息监听

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Service
@Slf4j
public class TopicListener implements ApplicationRunner, Ordered {
@Autowired
private RedissonClient redissonClient;

@Override
public void run(ApplicationArguments args) throws Exception {
RTopic topic = redissonClient.getTopic("__keyspace@0__:name");
topic.addListener(String.class,new MessageListener<String>() {
@Override
public void onMessage(CharSequence charSequence, String msg) {
log.info("Redisson监听器收到消息:{}", msg);
}
});
}

@Override
public int getOrder() {
return 1;
}
}

当然使用redis的消息机制需要对redis-server进行设置,设置属性notifiy-space-events的值

2.2 分布式锁

在方法增加 @Lock 注解

1
2
3
4
5
6
//支持 spel 表达式 如果后面需要接字符串的话请用`+`连接. 字符串一定要打`单引号`
@Lock(keys = "#user.name+'locks'")
public String test(User user) {
System.out.println("进来了test");
return "test";
}

@Lock 注解参数介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* REENTRANT(可重入锁),FAIR(公平锁),MULTIPLE(联锁),REDLOCK(红锁),READ(读锁), WRITE(写锁),
* AUTO(自动模式,当参数只有一个.使用 REENTRANT 参数多个 MULTIPLE)
*/
LockModel lockModel() default LockModel.AUTO;
/**
* 需要锁定的keys
* @return
*/
String[] keys() default {};
/**
* 锁超时时间,默认30000毫秒(可在配置文件全局设置)
* @return
*/
long lockWatchdogTimeout() default 0;
/**
* 等待加锁超时时间,默认10000毫秒 -1 则表示一直等待(可在配置文件全局设置)
* @return
*/
long attemptTimeout() default 0;

3. 属性列表

(基本都是官方参数.我将参数整合了下.分为 公共参数,单例模式参数,集群模式参数)

1.公共参数

属性名 默认值 备注
redisson.password 用于节点身份验证的密码。
redisson.attemptTimeout 10000L 等待获取锁超时时间,-1则是一直等待
redisson.lockModel 单个key默认可重入锁多个key默认联锁 锁的模式.如果不设置, REENTRANT(可重入锁),FAIR(公平锁),MULTIPLE(联锁),REDLOCK(红锁),READ(读锁), WRITE(写锁)
redisson.model SINGLE 集群模式:SINGLE(单例),SENTINEL(哨兵),MASTERSLAVE(主从),CLUSTER(集群),REPLICATED(云托管)
redisson.codec JsonJacksonCodec Redisson的对象编码类是用于将对象进行序列化和反序列化,以实现对该对象在Redis里的读取和存储
redisson.threads 当前处理核数量 * 2 这个线程池数量被所有RTopic对象监听器,RRemoteService调用者和RExecutorService任务共同共享。
redisson.nettyThreads 当前处理核数量 * 2 这个线程池数量是在一个Redisson实例内,被其创建的所有分布式数据类型和服务,以及底层客户端所一同共享的线程池里保存的线程数量。
redisson.transportMode NIO TransportMode.NIO,TransportMode.EPOLL - 需要依赖里有netty-transport-native-epoll包(Linux) TransportMode.KQUEUE - 需要依赖里有 netty-transport-native-kqueue包(macOS)
redisson.idleConnectionTimeout 10000 如果当前连接池里的连接数量超过了最小空闲连接数,而同时有连接空闲时间超过了该数值,那么这些连接将会自动被关闭,并从连接池里去掉。时间单位是毫秒
redisson.connectTimeout 10000 同任何节点建立连接时的等待超时。时间单位是毫秒。
redisson.timeout 3000 等待节点回复命令的时间。该时间从命令发送成功时开始计时。
redisson.retryAttempts 3 如果尝试达到 retryAttempts(命令失败重试次数) 仍然不能将命令发送至某个指定的节点时,将抛出错误。如果尝试在此限制之内发送成功,则开始启用 timeout(命令等待超时) 计时。
redisson.retryInterval 1500 在一条命令发送失败以后,等待重试发送的时间间隔。时间单位是毫秒。
redisson.subscriptionsPerConnection 5 每个连接的最大订阅数量。
redisson.clientName 在Redis节点里显示的客户端名称。
redisson.sslEnableEndpointIdentification true 开启SSL终端识别能力。
redisson.sslProvider JDK 确定采用哪种方式(JDK或OPENSSL)来实现SSL连接。
redisson.sslTruststore 指定SSL信任证书库的路径。
redisson.sslTruststorePassword 指定SSL信任证书库的密码。
redisson.sslKeystore 指定SSL钥匙库的路径。
redisson.sslKeystorePassword 指定SSL钥匙库的密码。
redisson.lockWatchdogTimeout 30000 监控锁的看门狗超时时间单位为毫秒。该参数只适用于分布式锁的加锁请求中未明确使用leaseTimeout参数的情况。如果该看门口未使用lockWatchdogTimeout去重新调整一个分布式锁的lockWatchdogTimeout超时,那么这个锁将变为失效状态。这个参数可以用来避免由Redisson客户端节点宕机或其他原因造成死锁的情况。
redisson.keepPubSubOrder true 通过该参数来修改是否按订阅发布消息的接收顺序出来消息,如果选否将对消息实行并行处理,该参数只适用于订阅发布消息的情况。
  1. 单例模式参数

配置前缀:redisson.singleServerConfig

属性名 默认值 备注
address 服务器地址,必填ip:port
database 0 尝试连接的数据库编号。
subscriptionConnectionMinimumIdleSize 1 用于发布和订阅连接的最小保持连接数(长连接)。Redisson内部经常通过发布和订阅来实现许多功能。长期保持一定数量的发布订阅连接是必须的。
subscriptionConnectionPoolSize 50 用于发布和订阅连接的连接池最大容量。连接池的连接数量自动弹性伸缩。
connectionMinimumIdleSize 32 最小保持连接数(长连接)。长期保持一定数量的连接有利于提高瞬时写入反应速度。
connectionPoolSize 64 连接池最大容量。连接池的连接数量自动弹性伸缩。
dnsMonitoringInterval 5000 用来指定检查节点DNS变化的时间间隔。使用的时候应该确保JVM里的DNS数据的缓存时间保持在足够低的范围才有意义。用-1来禁用该功能。
  1. 集群模式

配置前缀:redisson.multiple-server-config

属性名 默认值 备注
redisson.multiple-server-config.node-addresses 服务器节点地址.必填
loadBalancer RoundRobinLoadBalancer 在多Redis服务节点的环境里,可以选用以下几种负载均衡方式选择一个节点: WeightedRoundRobinBalancer - 权重轮询调度算法 RoundRobinLoadBalancer - 轮询调度算法 RandomLoadBalancer - 随机调度算法
slaveConnectionMinimumIdleSize 32 多从节点的环境里,每个 从服务节点里用于普通操作(非 发布和订阅)的最小保持连接数(长连接)。长期保持一定数量的连接有利于提高瞬时读取反映速度。
slaveConnectionPoolSize 64 多从节点的环境里,每个 从服务节点里用于普通操作(非 发布和订阅)连接的连接池最大容量。连接池的连接数量自动弹性伸缩。
masterConnectionMinimumIdleSize 32 多节点的环境里,每个 主节点的最小保持连接数(长连接)。长期保持一定数量的连接有利于提高瞬时写入反应速度。
masterConnectionPoolSize 64 多主节点的环境里,每个 主节点的连接池最大容量。连接池的连接数量自动弹性伸缩。
readMode SLAVE 设置读取操作选择节点的模式。 可用值为: SLAVE - 只在从服务节点里读取。 MASTER - 只在主服务节点里读取。 MASTER_SLAVE - 在主从服务节点里都可以读取。
subscriptionMode SLAVE 设置订阅操作选择节点的模式。 可用值为: SLAVE - 只在从服务节点里订阅。 MASTER - 只在主服务节点里订阅。
subscriptionConnectionMinimumIdleSize 1 用于发布和订阅连接的最小保持连接数(长连接)。Redisson内部经常通过发布和订阅来实现许多功能。长期保持一定数量的发布订阅连接是必须的。 redisson.multiple-server-config.subscriptionConnectionPoolSize
dnsMonitoringInterval 5000 监测DNS的变化情况的时间间隔。
scanInterval 1000 (集群,哨兵,云托管模特特有) 对Redis集群节点状态扫描的时间间隔。单位是毫秒。
database 0 (哨兵模式,云托管,主从模式特有)尝试连接的数据库编号。
masterName (哨兵模式特有)主服务器的