Redis分布式锁
Redis分布式锁Lua脚本实现
获取锁
if (redis.call ('EXISTS',KEYS[1] == 0)) then //判断锁不存在 redis.call ('HSET',KEYS[1], ARGV[1], 1); redis.call ('EXPIRE', KEYS[1], ARGV[2]); retrun 1; end; if (redis.call ('HEXITS', KEYS[1], ARGV == 1)) then //判断锁是否是线程自己的 redis.call ('HINCRBY', KEYS[1], ARGV[1], 1); redis.call ('EXPIRE', KEYS[1], ARGV[2]); return 1; end; return 0;
释放锁
if (redis.call ('HEXIST', KEYS[1], ARGV[1] == 0)) then return nil; end; local count = redis.call ('HINCRBY', KEYS[1], ARGV[1], -1); if (count > 0) then redis.call ('EXPIRE', KEYS[1], ARGV[2]); return nil; else redis.call ('DEL', KEYS[1]); return nil; end;
RedLock
1.保证了互斥性。
2.避免了死锁。
3.容错性还不错,只要大部分Redis正常工作就可以正常提供服务。
SETNX
set if not exist,如果不存在就写。
本身不是原子性操作,可以用LUA脚本,实际生产过程中建议直接使用Redission。
如果直接使用setnx的话,为了避免死锁,最好设置一个“合理”的过期时间。
释放该锁的话,使用“DEL”操作删除数据即可。

浙公网安备 33010602011771号