之前用的Redis,都是用的原生的RedisTempale或者是StringRedisTemplate,各种API非常的难易记忆,每次用的时候还得去网上查询API文档,而Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。这里放上redisson的github链接,先说明,redisson除了开源版本,还有付费的pro版本,以后介绍的某些高级功能,如果是pro版本的,会标出
二、在SpringBoot中快速集成Redisson是建立在Redis的基础之上的,所以需要在SpringBoot项目中引入Redis。
- 导入依赖
----------------------------------------------------------------- org.redisson redisson-spring-boot-starter 3.16.3 org.redisson redisson 3.16.3
- 在SpringBoot中配置。官方文档给出了基于配置类和基于配置文件的形式,还有基于集群,基于主从,基于单节点模式的配置方式都不一样,我这里给出基于配置文件的单节点模式,其他形式参考官方文档。
- redisson.yml文件
singleServerConfig: idleConnectionTimeout: 10000 #连接空闲超时,单位:毫秒 默认:10000 connectTimeout: 10000 #连接超时,单位:毫秒。默认:10000 timeout: 3000 #命令等待超时,单位:毫秒 默认:3000 retryAttempts: 3 #命令失败重试次数 retryInterval: 1500 #命令重试发送时间间隔,单位:毫秒 # lockWatchdogTimeout: 30000 #监控锁的看门狗超时,单位:毫秒 该参数只适用于分布式锁的加锁请求中未明确使用leaseTimeout参数的情况。如果该看门口未使用lockWatchdogTimeout去重新调整一个分布式锁的lockWatchdogTimeout超时,那么这个锁将变为失效状态。这个参数可以用来避免由Redisson客户端节点宕机或其他原因造成死锁的情况。 password: null clientName: null #客户端名称 subscriptionsPerConnection: 5 #单个连接最大订阅数量 address: "redis://xxx.xxx.xxx.xxx:6379" subscriptionConnectionMinimumIdleSize: 1 #从节点发布和订阅连接的最小空闲连接数 subscriptionConnectionPoolSize: 50 #从节点发布和订阅连接池大小 # 集群模式下不支持该选项 database: 2 dnsMonitoringInterval: 5000 #DNS监控间隔,单位:毫秒 在启用该功能以后,Redisson将会监测DNS的变化情况 sslEnableEndpointIdentification: true #启用SSL终端识别,默认为true threads: 0 #线程池数量 默认值: 当前处理核数量 * 2 nettyThreads: 0 #Netty线程池数量 默认值: 当前处理核数量 * 2 ,这个线程池数量是在一个Redisson实例内,被其创建的所有分布式数据类型和服务,以及底层客户端所一同共享的线程池里保存的线程数量。 codec: #编码 默认值:org.redisson.codec.JsonJacksonCodec,Redisson的对象编码类是用于将对象进行序列化和反序列化,以实现对该对象在Redis里的读取和存储 !{} "transportMode": #传输模式 默认:TransportMode.NIO linux系统下可以使用RPOLL,性能高 "NIO"
- RedisConfig
@Configuration
public class RedissonConfig {
@Bean(destroyMethod="shutdown")
public RedissonClient getRedissonClient() throws IOException {
ResourceLoader loader = new DefaultResourceLoader();
Resource resource = loader.getResource("redisson.yml");
Config config = Config.fromYAML(resource.getInputStream());
return Redisson.create(config);
}
}
三、增删改查操作
每个Redisson对象实例都会有一个与之对应的Redis数据实例。Redisson的分布式RBucket对象是一种通用对象桶可以用来存放任类型的对象。先来写新增和查询。先通过redisson对象通过getBucket方法,在Redis中创建一个字符串类型的对象。这个对象的引用就是下面的bucket,它可以存放任意的Cityr对象实体。RBucket桶的神奇功能是:可直接存储City对象,省略了我们的City对象转为JSON字符串的过程。RBucket对象可以视为Redis中的 String类型,每个RBucket对象对应着一个值。
- 新增:将City对象通过RBucket存放到Redis中。
- 查询的时候,通过KEY找到桶。再通过get() 方法取出缓存在Redis中的 指定的KEY的VALUE。
- 修改就是通过KEY找到这个桶RBucket,然后重新SET一下。
- 删除更简单了,找到这个桶,调用delete相关方法即可。
@Controller
@RequestMapping("redisson")
public class RedissonController {
@Autowired
RedissonClient redissonClient;
@ResponseBody
@GetMapping("get/{id}")
public City get(@PathVariable Long id){
RBucket city = redissonClient.getBucket("city"+id.toString());
return city.get();
}
@ResponseBody
@DeleteMapping("delete/{id}")
public String delete(@PathVariable Long id){
RBucket bucket = redissonClient.getBucket("city" + id.toString());
Optional optionalCity=Optional.ofNullable(bucket.getAndDelete());
return optionalCity.toString();
}
@ResponseBody
@PutMapping("update")
public String update(@RequestBody City city){
RBucket bucket = redissonClient.getBucket("city"+city.getId().toString());
//更新缓存
if (bucket!=null)
{
bucket.set(city);
return "ok";
}
else return "error";
}
@ResponseBody
@PostMapping("add")
public String add(@RequestBody City city){
RBucket bucket = redissonClient.getBucket("city"+city.getId().toString());
try {
bucket.set(city);
return "ok";
} catch (Exception e) {
e.printStackTrace();
return "error";
}
}
}



