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做分布式锁的时候有缺点,是什么呢?还需探索。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章