Redisson-使用-01
Java 8
Spring Boot 2.5.3
org.redisson:redisson:3.16.4
Redis 单机版,4.0.9 (on Ubuntu)
---
Redisson 可以用来做 分布式锁。
这是孤使用前的认知,本文也是记录其分布式锁的简单使用。
看过 阿里云的文档 才知,哦,Redisson原来号称【经过近4年日日夜夜的努力,Redisson终于在2019年1月16日成为GitHub里星星最多的Redis Java客户端】。
原来,不仅仅是做 分布式锁啊。
https://github.com/redisson/redisson
https://developer.aliyun.com/profile/7cqhdxtuiehao
https://mvnrepository.com/artifact/org.redisson/redisson
本文根据其 GitHub的quick-start 进行试验。
添加依赖包:最新版本
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.16.4</version>
</dependency>
添加配置:
新建一个 RedissonClient Bean
package com.example.webbasic.config;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Redisson配置
* @author ben
* @date 2021-11-29 20:56:01 CST
*/
@Configuration
public class RedissonConfig {
@Bean
public RedissonClient redissonClient() {
Config cf = new Config();
// Redis服务器是单机的,配置为 集群模式,发生异常,启动失败
// cf.useClusterServers()
// .addNodeAddress("redis://192.168.0.111:6379");
// 单机配置,成功
cf.useSingleServer().setAddress("redis://mylinux:6379");
RedissonClient rc = Redisson.create(cf);
return rc;
}
}
注,上面的配置支持 单机Redis,除了单机模式,还可以支持 主从、集群 等模式(useXXX方法)。
使用上一步的 RedissonClient Bean 实现分布式锁:
package com.example.webbasic.runner;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
/**
* 基于Redisson的分布式锁测试
* @author ben
* @date 2021-11-29 21:05:19 CST
*/
@Component
public class RedissonDistLock implements ApplicationRunner {
@Autowired
private RedissonClient rc;
@Value("${server.port}")
private String port;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("start: port=" + port);
String mykey = "web-basic-key";
RLock rl = rc.getLock(mykey);
IntStream.range(0, 10).forEach(i->{
rl.lock();
System.out.println("port=" + port + ", i=" + i + ", 1, now=" + new Date());
try {
TimeUnit.SECONDS.sleep(20);
System.out.println("port=" + port + ", i=" + i + ", 2");
} catch (InterruptedException e) {
System.out.println("port=" + port + ", i=" + i + ", 3 异常, e=" + e.getClass());
// e.printStackTrace();
} finally {
rl.unlock();
System.out.println("port=" + port + ", i=" + i + ", 4, now=" + new Date());
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
rc.getLock(mykey) 生成了锁 RLock对象,执行此对象的 lock()、unlock() 实现分布式锁。
Redis中键的变化:
启动项目:分别在端口 5555、9999 运行
注意,在测试程序的 rl.unlock() 后添加了 休眠,如果不添加的话,最先运行的进程会一直锁住执行——速度太快,而后运行的一直得不到锁。
解决这个问题,除了 加休眠(不合理)外,还可以调用 rc.getFairLock(mykey) 来处理:公平锁——这才是 正确的用法。
使用 公平锁时,Redis中数据的变化:多了两个,类型也不同了
127.0.0.1:6379> keys *
3) "redisson_lock_timeout:{web-basic-key}"
4) "redisson_lock_queue:{web-basic-key}"
6) "web-basic-key"
127.0.0.1:6379>
127.0.0.1:6379> type redisson_lock_timeout:{web-basic-key}
zset
127.0.0.1:6379>
127.0.0.1:6379> type redisson_lock_queue:{web-basic-key}
list
127.0.0.1:6379>
127.0.0.1:6379> type web-basic-key
hash
127.0.0.1:6379>
》》》全文完《《《
Redisson 还有更多功能待探索。
疑问:
使用Redisson的时候,怎么没有添加 Redis驱动呢?
听说Redisson做分布式锁的时候有缺点,是什么呢?还需探索。