分布式锁解决方案——redisson的使用
概述
redisson:
提供基于redis的分布式服务,包含很多,本文详细介绍 springboot 下的分布式锁的使用
学过JUC的话,可以无缝的转换到redisson,因为redisson实现了Lock接口,并且功能很强大
配置
配置好redis 后再进行以下操作
依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.17.6</version>
</dependency>
配置类:单节点模式
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;
@Configuration
public class MyRedissonConfig {
@Bean(destroyMethod = "shutdown")
public RedissonClient redisson() {
Config config = new Config();
config.useSingleServer().setAddress("redis://localhost:6379");
RedissonClient redissonClient = Redisson.create(config);
return redissonClient;
}
}
测试

使用
Lock 锁(可重入锁)
void lockTest() {
// 获取一把锁:只要名字一样,就是同一把锁
RLock lock = redisson.getLock("yh-lock");
// 加锁
/**
* 默认加锁30s,如果业务没做完,会自动续期
* 但如果指定时间,就不会自动续期
*/
lock.lock(30, TimeUnit.SECONDS); // 最佳实践
try {
System.out.println("加锁成功,实现业务...");
} finally {
// 解锁: 无论如何都要解锁
/**
* 即使停机导致解锁代码没有运行,redisson也不会出现死锁、
*
*/
System.out.println("释放锁");
lock.unlock();
}
}
公平锁
public void fairLockTest() {
RLock fairLock = redisson.getFairLock("f-lock");
fairLock.lock();
fairLock.unlock();
}
读写锁
写锁
public void wLockTest() {
// 获取读写锁
RReadWriteLock lock = redisson.getReadWriteLock("rw-lock");
// 写锁
RLock rLock = lock.writeLock();
rLock.unlock(); // 释放写锁
}
读锁
public void rLockTest() {
// 读取读写锁
RReadWriteLock lock = redisson.getReadWriteLock("rw-lock");
// 读锁
RLock rLock = lock.readLock();
rLock.unlock();
}
闭锁
@Test
public void doorLockTest() throws InterruptedException {
// 获取闭锁
RCountDownLatch lock = redisson.getCountDownLatch("cd-lock");
lock.trySetCount(5); // 设置计数,若计数清零闭锁自动关闭
lock.await(); // 等待计数清零
System.out.println("闭锁关闭后的业务逻辑...");
}
@Test
public void goTest() {
RCountDownLatch lock = redisson.getCountDownLatch("cd-lock");
lock.countDown(); // 计数减一
}
信号量测试
public void park() throws InterruptedException {
redisTemplate.opsForValue().set("park", "5"); // redis里设置5个车位
RSemaphore park = redisson.getSemaphore("park");
// park.acquire(); // 占一个车位
boolean flag = park.tryAcquire();// 尝试占一个车位,有车位就true
if (flag) {
} else {
}
}
public void parkGoTest() {
RSemaphore park = redisson.getSemaphore("park");
park.release(); // 释放一个车位,计数减一
}
本文作者:yangruomao
本文链接:https://www.cnblogs.com/yangruomao/p/16664993.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
标签:
分享
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现