使用redisson简单实现分布式锁
Posted 寒冰护狐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用redisson简单实现分布式锁相关的知识,希望对你有一定的参考价值。
什么是分布式锁
在分布式项目中, 常常伴随着多线程同时操作一个数据的情况,比较常见的就是淘宝抢单的情况,多个人抢一件商品时,正常情况下只有一个人才能获得商品,但是在分布式项目中,会存在多个线程在多个服务下,同时操作一个数据的情况,可能有人要问了,我们加一个Java锁不行吗?在做单体项目的时候我也是这么 想的,但是java锁只能锁同一个服务的数据,但是分布式项目中往往存在多个服务,我们的Java锁,是无法完全锁住的,这个时候我们就可以考虑使用分布式锁。
分布式锁的种类
- 基于数据库实现的分布式锁
- 基于redis实现的分布式锁
- 基于zookeeper实现的分布式锁
- 使用redisson实现分布式锁
分布式锁的实现方案
分布式锁可以简单的理解为,在分布式项目中实现的数据锁,既然我们不能使用项目中的锁来得到线程安全,那么我们需要借助外界存储来实现,例如我们可以使用redis作为中间件,redis本身就提供分布式锁,我们可以通过lua脚本控制来对redis加锁,间接实现了线程安全,可能有朋友就要问了,为什么要使用lua脚本,不能直接用代码控制呢?使用redis的话,大部分公司应该都是多节点的,少部分是单节点的,如果你是单节点使用代码控制问题也不大,但是如果是多节点的,使用lua脚本控制就容易的多,因为lua脚本执行的命令是具有原子性的。
使用redisson简单实现分布式锁
由于公司今天紧急添加分布式锁,所以使用了已经比较成型的分布式锁框架redisson,他的内部也是redis+lua脚本实现的,内部拥有很多分布式场景,可以轻松实现分布式锁,我们先来感受一下,redisson的强大。
第一步:选择心仪的jar包
通过我们常用的maven仓库来筛选想要的redisson版本。链接如下:
https://mvnrepository.com/artifact/org.redisson/redisson
第二步:通过maven引入jar包
<!-- https://mvnrepository.com/artifact/org.redisson/redisson -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.12.0</version>
</dependency>
第三步:启动redis
第四步:配置redis连接
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public Redisson redisson() {
Config config = new Config();
SingleServerConfig singleServerConfig = config.useSingleServer();
singleServerConfig.setAddress("redis://127.0.0.1:6379").setDatabase(15);
singleServerConfig.setPassword("123456");
return (Redisson) Redisson.create(config);
}
}
第五步:获取分布式锁
- 通过spring注入获取redisson对象
@Autowired
private Redisson redisson;
第六步:加锁解锁
public void demo() {
String lockKey = "lock";
RLock lock = redisson.getLock(lockKey);
try {
lock.lock();
System.out.println("抢单");
} finally {
lock.unlock();
}
}
总结
本次与分布式锁的相遇非常的突然,由于需求变化,突然需要使用分布式锁来进行控制,对于没有概念的我来说是一次挑战,查询了很多资料后,为了安全起见,使用了成熟的redisson来做分布式锁,后续还会分析redisson源码,手动实现一个分布式锁,关于分布式锁的知识点,未来会持续更新!
以上是关于使用redisson简单实现分布式锁的主要内容,如果未能解决你的问题,请参考以下文章
高并发你知道吗?大家都在使用Redisson实现分布式锁了!!
Redis 分布式锁的正确实现原理演化历程与 Redisson 实战总结