锁重试
# 消息订阅模型
锁重试不是立即重新获取锁,而是采用消息订阅释放锁事件和信号量机制;
释放锁Lua脚本:
"if (redis.call('hexists',KEYS[1],ARGV[3])==0)then" +
"return nil;" +
"end; " +
"local counter redis.call('hincrby',KEYS[1],ARGV[3],-1);" +
"if (counter > 0) then" +
"redis.call('pexpire',KEYS[1],ARGV[2]);"
"return 0;" +
"else" +
"redis.call('del',KEYS[1]);" +
"redis.call('publish',KEYS[2],ARGV[1]);" + // 释放锁时发布一个事件;
"return 1;" +
"end; " +
"return nil;"
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
获取锁时设置等待时间,如果等待时间内没有获取释放锁事件的future,直接返回获取锁失败;