分布式锁在分布式环境中主要负责保证同一时间只有一台服务器可以获得该资源
redis实现分布式锁的方式有以下几种
- setnx:setnx原理为仅在当前setnx的键不存在的情况下设置键,释放锁通过delete。expire可以指定键失效时间,保证其可以释放缺点:setnx和expire非原子操作,可能导致死锁;无标志校验,所有用户都可以删除锁。改进:使用原子set命令:使用set命令保证锁获取和释放时间设置成功;同时set名字支持给锁分配id,可以保证锁的唯一性。
复制代码 高可用方案(RedLock算法)
- Redlock算法是Redis官方推荐的分布式锁算法,它使用多个独立的Redis实例来实现分布式锁需要多个Redis实力,只有在客户端在指定时间内获取多数节点的锁才视为成功,否则在每个节点都要尝试释放锁。锁续期机制(看门狗):使用后台线程(newScheduledThreadPool(1))定期检查,若当前持有锁自动续期。
复制代码 生产环境最佳实践(Redission)
- Redisson将Redis的高性能和高可用性引入了分布式锁的实现。利用Redis强大的命令集,Redisson实施锁操作成为可能,并且这些锁操作是原子的内置看门狗,支持异步锁,公平锁模式。
复制代码 选型建议
- 简单场景:使用原子set命令+LUA脚本高可用需求:采用RedLock算法。生产环境:直接集成Redission框架。
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |