Redis分布式锁怎样实现——简单理解版

嚴華  论坛元老 | 2025-3-23 17:08:52 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1017|帖子 1017|积分 3051

目录
 
前言
满意条件
加锁之后产生的问题
制止死锁的方法
        Lua脚本实现制止开释其他锁
        看门狗判断逾期
扩展
Lua脚本
Redission

 
前言

        在现在开辟的某些项目中,多个进程必须以互斥的方式独占共享资源,这时用分布式锁是最直接有效的,分布式锁发展至今,已经有越来越多的项目遍及了,也已经被面试官拿出来提问,所以今天我们可以一起来学习一下分布式锁
满意条件

        想要实现分布式锁,条件就需要满意如下几个条件    


  • 互斥性,在任意时候,只有一个客户端能持有锁
  • 不会发生死锁。即使有一个客户端在持有锁的期间瓦解而没有主动解锁,也能保证后续其他客户端可以加锁
  • 加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了,即不能误解锁
  • 具有容错性。只要大多数Redis节点正常运行,客户端就能获取和开释锁
  Redis实现分布式锁主要使用Redis的setnx下令。setnx是SET if not exists(假如不存在,则set)的简写,我们使用Redis时,一般会接纳主从集群+哨兵的模式部署,哨兵的作用就是监测redis节点的运行状态。普通的主从模式,当master瓦解时,需要手动切换让slave成为master,使用主从+哨兵结合的长处在于,当master异常宕机时,哨兵可以实现故障自动切换,把slave提拔为新的master,继续提供服务,以此保证可用性。
加锁之后产生的问题

        但是当加上锁之后,就会有新的问题产生出来,当Redis或者客户端忽然运行异常,或者忽然宕机之后,我们添加的锁无法实时开释出来;又或者是我们执行程序时忽然业务逻辑错误,无法开释出锁,那么就会导致后续操纵无法进行,出现死锁的环境这个时候我们就需要想方法来解决怎样制止死锁了
制止死锁的方法

        假如要制止死锁,我们首先就是想到的Redis可以设置逾期时间,让这个进程在规定时间之后就可以自己开释掉,从而制止了死锁的风险,这个时候我们就又有了新的问题——你怎么知道你开释的锁是你想开释的锁,你怎么知道他什么时候不消了,你要开释它。这个时候我们又会熟悉到两个新成员了:Lua脚本和看门狗
        Lua脚本实现制止开释其他锁

                        首先知道Redis是单线程执行的,当执行一个线程时其他线程都无法执行,所以我们可以写一个lua脚本,在脚本里先试用GET请求,使用Redis键值对的特性根据i线程id获取到自己那条线程,然后执行SET下令(欺压获取到锁,执行这条下令的概率很低),末了执行DEL下令删除线程,从而制止删除掉其他线程
        看门狗判断逾期

                        在Redis中,开辟者已经想到这个环境,所以Redis里面已经改有一个很好的方法判断逾期了,他就是redission(看门狗),Redisson是一个Java语言实现的Redis SDK客户端,在使用分布式锁时,它就接纳了自动续期的方案来制止锁逾期,这个保卫线程我们一般叫它看门狗线程。这个SDK提供的API非常友爱,它可以像操纵本地锁一样操纵分布式锁。客户端一旦加锁成功,就会启动一个watch dog看门狗线程,它是一个后台线程,会每隔一段时间(这段时间的长度与设置的锁的逾期时间有关)查抄一下,假如查抄时客户端还持有锁key(也就是说还在操纵共享资源),那么就会延长锁key的生存时间。
        想到这些问题,Redis分布式锁各人应该就理解了
扩展

Lua脚本

lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码情势开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
想要了解更多可以去Redis 使用lua脚本最全教程_redis lua语法-CSDN博客中了解更多
Redission


 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表