文章目录
前言
官网
https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95
谷粒教程
https://www.bilibili.com/video/BV1np4y1C7Yf?p=159&spm_id_from=pageDriver
学习
可重入锁(应该都这样设计)
比如A方法调用了B方法,A方法加了锁,那么B方法就可以直接用这个锁。逻辑结束,A方法释放锁。
不可重入锁
A方法加了锁,A调B,B方法也要枷锁,但是需要A先释放,B才能加。
Redisson
Redisson解决了锁的自动续期
如果业务超长,每间隔10秒会自动续期,续期后时间30秒
如果设置了过期时间,则过期后不会自动续期
如果手动设置了过期时间,则过期后,不管业务是否跑完,就会释放锁。
lock.lock(10, TimeUnit.SECONDS);
readWriteLock 读写锁
https://www.bilibili.com/video/BV1np4y1C7Yf?p=162&spm_id_from=pageDriver
在一个锁没结束,另一个锁就要等待
读锁是一个共享锁(和没加一样,不影响其他人读)
写锁是一个排他锁(互斥锁,只要有写,必须等待)
写 + 读:等待写锁释放
写 + 写: 阻塞方式
读 + 写:等待读锁释放
trylock
待补充
Semaphore 信号量
示例:停车入库,开走。总数量3。阻塞模式
还可以做限流
CountDownLatch 闭锁
待补充
总结
- redisson底层代码都是通过lua脚本实现的,保证了原子性;
- 并且有看门狗机制,解决了死锁问题;
- 通过锁的命名,解决锁的力度问题。示例:product-11-lock, product-12-lock, product-lock。
数据要区分开来,没有关系的数据一定不要被其他的锁影响到
https://www.bilibili.com/video/BV1np4y1C7Yf?p=166&spm_id_from=pageDriver - 缓存数据一致性
- 双写模式:改完数据库,把缓存里面的也改了
- 删除缓存:改完数据库,把缓存删了。下次再查,会查询数据库
缓存一致性的解决方案
- 缓存数据加上过期时间
- 给数据加上合适的锁。
比如读写锁。