redis使用String+lua实现分布式锁

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis使用String+lua实现分布式锁相关的知识,希望对你有一定的参考价值。

参考技术A

注:原始资料来自享学课堂,加上自己的理解和修改



redis中的数据是能够设置过期时间的,时间到了之后,当前key会被自动删除,具体命令如下





setnx key value,当key已经存在时,不做任何操作,当key不存在时,设置key=value,测试指令如下:





轻量小巧的脚本语言,用于 支持redis操作序列的原子性 ;lua里面的命令要么执行成功,要么执行失败,并且执行lua脚本的时候,其他的lua脚本和命令都不能执行



通过setnx向特定的key写入一个随机值,并同时设置失效时间,写值成功即加锁成功,指令测试如下




加锁注意点:



解锁注意点


匹配随机值,删除redis上的特定的key数据,要保证获取数据、判断一致以及删除数据三个操作是原子的;


执行如下lua脚本





2.1 准备lua脚本,放在resources下



lua脚本内容如下;






此处会有一个问题,如果多个线程在锁这里等待,执行线程释放锁的时候,其他多个等待线程就会去争夺这个锁,但是其实只能有一个线程获取锁,完全没有必要唤醒多个线程,这就是羊群效应。使用zookeeper临时顺序节点能够解决这个问题


以上是关于redis使用String+lua实现分布式锁的主要内容,如果未能解决你的问题,请参考以下文章

redis在使用lua脚本以及实现redis分布式锁

使用RedisTemplate+Lua脚本实现Redis分布式锁

PHP+Redis+Lua 实现 Redis 分布式锁

基于Redis+Lua实现分布式锁模拟秒杀扣减库存业务

基于 Redis 实现分布式锁,分析解决锁误删情况 及 利用Lua脚本解决原子性问题并改造锁

实现分布式锁的解决方案