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实现分布式锁的主要内容,如果未能解决你的问题,请参考以下文章
使用RedisTemplate+Lua脚本实现Redis分布式锁