Python 中 Redis 库分布式锁简单分析( 二 )
将token成功插入后 , 则判断有无超时时间 , 如果设置了timeout , 则通过pexpire方法将redis中name这个key的超时设置一下 , 因为pexpire方法是以毫秒为单位的 , 所以需要先将timeout转换成毫秒单位 。
如果没有设置timeout , 那么name这个key只能通过do_release方法中的逻辑清除 。
至此 , 我们清楚的知道了 , Redis分布式锁的本质其实就是Redis中的一个key-value , 非常简单...
理清锁的获取逻辑后 , 来看一下相应的释放逻辑 , 主要关注release方法 , 该方法代码如下 。
def release(self):"Releases the already acquired lock"expected_token = self.local.tokenif expected_token is None:raise LockError("Cannot release an unlocked lock")self.local.token = Noneself.do_release(expected_token)
release方法中先将线程中的token取出 , 并将其置为None , 然后调用do_release方法实现锁的释放 , do_release方法代码如下 。
def do_release(self, expected_token):name = self.namedef execute_release(pipe):lock_value = http://kandian.youth.cn/index/pipe.get(name)if lock_value != expected_token:raise LockError("Cannot release a lock that's no longer owned")pipe.delete(name)self.redis.transaction(execute_release, name)
do_release方法的逻辑非常简单 , 其主要逻辑在execute_release方法 , 通过Redis的transaction方法开启一个事务来执行execute_release方法中逻辑 。
在execute_release中 , 首先通过get方法获取name这个key对应的value , 获得后 , 通过delete方法将其删除 , 实现Redis分布式锁的释放 。
blocking属性观察到acquire方法的这段代码 。
while 1:if self.do_acquire(token):self.local.token = tokenreturn Trueif not blocking:return Falseif stop_trying_at is not None and mod_time.time() > stop_trying_at:return Falsemod_time.sleep(sleep)
如果blocking为True , 获取不到锁 , 则执行后面的逻辑 , 让线程睡眠 , 阻塞等待其他线程将锁释放;如果blocking为False , 获取不到锁 , 则直接返回获取锁失败 。
这就会引出几种情况 , 假设现在有线程A与线程B都需要执行相同的逻辑 , 执行前需要获取锁 。
如果线程A在执行的过程中 , 线程B也要执行了 , 如果blocking为True , 此时线程B会被阻塞 , 等待线程A是否Redis锁;如果blocking为False , 线程B此时获取不到锁 , 不执行相同的逻辑 。
如果线程A执行完了 , 此时线程B到来 , 如果blocking为True或False , 此时线程B都不会被阻塞并成功拿到锁 , 执行相同的逻辑 。
一个简单的结论是 , blocking无法保证逻辑是否被单次执行 , 如果希望通过Redis分布式锁让逻辑只执行一次 , 依旧需要从业务层面做控制 , 比如MySQL中的业务数据是否被修改或Redis中是否记录这业务数据等 。
结尾现在很多业务都离不开Redis , 它已经成为互联网中的基础设施了 , Redis有很多有趣的内容可以跟大家分享 。
前段时间看见Redis之父退居二线 , 说已经为Redis工作了10年了 , 每天都要revice、merge他人的代码 , 这种工作让他没有创造东西的快乐 , 所以决定退居二线 , 将Redis交由社区运营 , 这让我有些感慨 , 软件工程是创造性的工作 , 适当的放空、阅读与行业无关的书籍其实有助于激发创造力 。
- 空调|让格力、海尔都担忧,中国取暖“新潮物”强势来袭,空调将成闲置品?
- 国外|坐拥77件专利,打破国外的垄断,造出中国最先进的家电芯片
- 手机基带|为了5G降低4G网速?中国移动回应来了:罪魁祸首不是运营商
- 通气会|12月4~6日,2020中国信息通信大会将在成都举行
- 中国|浅谈5G移动通信技术的前世和今生
- 操盘|中兴统一操盘中兴、努比亚、红魔三大品牌
- Blade|售价2798元 中兴Blade 20 Pro 5G手机发布 骁龙765G配四摄
- 健身房|乐刻韩伟:产业互联网中只做单环节很难让数据发挥大作用
- 垫底|5G用户突破2亿:联通垫底,电信月增700万,中国移动有多少?
- 计费|5G是如何计费的?