Redisson是Java项目中比较常用的一个库,Redisson作者对这个库的定义是“基于Redis的分布式驻内存数据网格”。它不仅仅是一个Redis客户端,还基于Redis实现了许多十分有用的分布式服务,包括:分布式对象、分布式锁等,许多分布式服务的实现都简单可靠,省去了我们重新造轮子的麻烦。
本系列笔记我们介绍Redisson库中的常用方法。
普通Java工程中,我们直接引入Redisson依赖即可。
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.17.7</version>
</dependency>
这里注意,Redisson库也依赖SLF4J提供的API进行日志输出,因此我们还需要引入日志相关的依赖库。
下面例子代码中,我们通过Redission连接和Redis服务器,并写入了一条数据。
package com.gacfox.demo;
import org.redisson.Redisson;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.redisson.codec.JsonJacksonCodec;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.redisson.config.TransportMode;
public class Main {
public static void main(String[] args) {
// Redis配置
Config config = new Config();
config.setTransportMode(TransportMode.NIO);
config.setCodec(new JsonJacksonCodec());
SingleServerConfig singleServerConfig = config.useSingleServer();
singleServerConfig.setAddress("redis://127.0.0.1:6379");
singleServerConfig.setTimeout(3000);
singleServerConfig.setPassword("abc123");
// 获取Redis客户端
RedissonClient client = Redisson.create(config);
// 操作数据
RBucket<String> bucket = client.getBucket("captcha");
bucket.set("123456");
// 关闭连接
client.shutdown();
}
}
代码中,Config
和SingleServerConfig
都是Redisson提供的配置对象,我们根据文档写入相关配置,最后调用Redisson.create(config)
方法获取客户端即可。
实际生产环境中,我们一般都是以集群方式使用Redis。下面代码中,我们使用Redisson的集群模式。
package com.gacfox.demo;
import org.redisson.Redisson;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.redisson.codec.JsonJacksonCodec;
import org.redisson.config.ClusterServersConfig;
import org.redisson.config.Config;
import org.redisson.config.TransportMode;
public class Main {
public static void main(String[] args) {
// Redis配置
Config config = new Config();
config.setTransportMode(TransportMode.NIO);
config.setCodec(new JsonJacksonCodec());
ClusterServersConfig clusterServersConfig = config.useClusterServers();
String[] addresses = new String[6];
addresses[0] = "redis://127.0.0.1:7001";
addresses[1] = "redis://127.0.0.1:7002";
addresses[2] = "redis://127.0.0.1:7003";
addresses[3] = "redis://127.0.0.1:7004";
addresses[4] = "redis://127.0.0.1:7005";
addresses[5] = "redis://127.0.0.1:7006";
clusterServersConfig.addNodeAddress(addresses);
clusterServersConfig.setTimeout(3000);
clusterServersConfig.setPassword("abc123");
// 获取Redis客户端
RedissonClient client = Redisson.create(config);
// 操作数据
RBucket<String> bucket = client.getBucket("captcha");
bucket.set("123456");
// 关闭连接
client.shutdown();
}
}
集群配置和单节点配置类似,只需要使用useClusterServers()
方法创建集群配置对象即可。
上面代码中,我们连接Redis时传入了许多配置信息,这里我们介绍常用的配置。
序列化方式
我们知道Java对象存储到Redis需要一个序列化机制,Redisson支持多种序列化方式,比较常用的2种是:
org.redisson.codec.JsonJacksonCodec
:基于Jackson的JSON序列化org.redisson.codec.SerializationCodec
:基于JDK的序列化JsonJacksonCodec
实现其实还是非常健壮的,会将Java类型信息一并进行序列化,例如:
{
"@class": "com.gacfox.demo.Student",
"StudentNo": "HIT123456789",
"age": 18,
"name": "Tom",
"signDate": [
"java.util.Date",
1666601933917
]
}
我们一般不需要干预这个序列化过程。
除此之外Redisson还提供了许多基于其它流行的高性能序列化库的序列化机制,相比JSON和JDK可能在性能上具有优势,如Avro
、FST
等。不过这里我们还是推荐如果无特殊需求,尽量使用可读性较强的JSON,这样如果数据出现问题,我们可以手动进行修复。
transportMode:传输模式,默认为TransportMode.NIO
,Linux下还支持TransportMode.EPOLL
。
idleConnectionTimeout:默认值10000
,如果当前连接数超出了最小空闲连接数,且超过指定空闲时间就会被关闭。
connectTimeout:默认值10000
,建立连接的超时时间。
timeout:默认值3000
,等待Redis回复的时间。
retryAttempts:默认值3
,如果数据发送失败时的重试次数。
retryInterval:默认值1500
,发生重试时的时间间隔。
keepAlive:是否发送TCP心跳包,默认为false
。