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”操作删除数据即可。

posted @ 2021-12-04 12:03  sellingpear  阅读(58)  评论(0)    收藏  举报