简介
多线程多进程情况下访问一些共享资源需要加锁,否则就会导致数据错乱的问题
分布式锁可以通过DB,Redis,Zk等方式实现,本节主要介绍php使用Redis实现分布式锁
基于set命令
setnx key value 设置一个值,当key已经存在时,返回flase,代表失败
使用setnx实现分布锁有个缺陷,setnx操作无法设置key的ttl,需要配合exprie key ttl 一起使用
好在set命令就集成了nx和ex操作set key name NX PX 10000
new Redis
-connect,
-set, , ,
var_dump//返回true代表加锁成功,返回false代表加锁失败
Redlock
set命令还有一个问题,当你要提前释放这个锁的时候,使用expire key 0或者使用del key
如果expire或者del命令发送了阻塞,锁自动失效,这时候B获取了锁,expire/del命令到达,导致B获取的锁失效
Redlock在加锁的时候value值要保证唯一性,在释放锁的时候要验证value是否和申请锁时value是否一致
RedLock if redis.call("GET", KEYS[1]) == ARGV[1] then
return redis.call("DEL", KEYS[1])
else
return 0
end
后续
Redis分布式锁还有没有问题?
解决方法:引入版本号
参考:https://time.geekbang.org/column/article/5175
还没有评论,来说两句吧...