Redisson分布式锁使用实例(一)
2021/5/30 2:20:18
本文主要是介绍Redisson分布式锁使用实例(一),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本文环境搭建:Springoot + Redisson 3.12.3 + Maven 3.6.1 +lombok
1、业务需求分析
项目部署在多个服务器,当我们有业务需要在每天凌晨,拉取数据写入数据库的时候,所有服务器上的定时器都在凌晨一起运行,数据库负荷太大,这时候如何解决呢?当多线程处理业务,因为线程不安全,导致数据紊乱,如何解决呢?Redis的分布式锁就能处理这些场景,这篇文章主要介绍的是redisson分布式锁的使用实例。
2、redis分布式锁基本特性
互斥性:这是最基本的特性,保证多个线程进入的情况下,只有一个线程可以获取到锁。
容错率:可以用unlock自己解锁,而且解铃还须系铃人,哪个线程上的锁,就由谁来解锁。
唯一性:redis分布式锁第一个参数和第二个参数会保证其唯一性,我在业务中第二个参数用的是uuid。
防止死锁:给获取锁的线程一个过期时间,保证业务处理出现异常,时间过期后,锁也能正常释放。
Redisson是一个高级的分布式协调Redis客户端,在项目中直接引入redisson的maven包,使用分布式锁会事半功倍。
注意事项,redisson使用trylock上锁的时候,最好带参数,否则在unlock释放所得时候,若当前线程没有获取锁,会报错,即使用locked先判断一下也不行,因为locked底层源码是任意线程上锁都会返回true。
纸上得来终觉浅,绝知此事要躬行,话不多说,直接撸代码。
3、实例代码:
先导入需要的maven包,在写一个redisson装入bean容器,方便后面依赖注入,例子中lock和trylock实例全部都有,若没有开启分布式锁,则线程不安全,会导致数据紊乱,甚至多消费,开启之后,消费正常。
<!-- 分布式锁 Redisson --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.12.3</version> </dependency>
@Resource private RedissonClient redissonClient; private static int a = 50; @RequestMapping("/redis_test") public String redisTest() { ExecutorService executorService = Executors.newFixedThreadPool(10); for (int i = 0; i < 100; i++) { executorService.submit(new Runnable() { @Override public void run() { RLock rLock = redissonClient.getLock("zhangsan"); //rLock.lock(); log.info("获取锁成功!"); try { //业务逻辑,存储入DB //加锁,最多等待10s,10s之后自动释放锁 if (rLock.tryLock(10, 10, TimeUnit.SECONDS)) { Thread.sleep(50); if (a > 0) { a--; } } } catch (Exception e) { } finally { //释放锁 if (rLock.isLocked()) { rLock.unlock(); } } log.info("最后剩余:" + a); } }); } executorService.shutdown(); return "success"; }
这篇关于Redisson分布式锁使用实例(一)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-31Tiny RDM:你的下一代Redis桌面GUI神器-icode9专业技术文章分享
- 2024-03-21redisinsight-v2
- 2024-02-26Typed property App\Api\Mapper\GamePropsConfigMapper::$apiRedis must not be accessed before initia-icode9专业技术文章分享
- 2024-02-21redisson getlock
- 2024-02-20redis config
- 2024-02-20redis leaderboard
- 2024-01-23缓存选型:Redis or MemCache
- 2024-01-22面试官:Redis持久化能关吗?怎么关?
- 2024-01-21Redis压测工具redis-benchmark-icode9专业技术文章分享
- 2024-01-19这才是你应该了解的Redis数据结构!