6. • 问题一:
• 假如某个客户端在执行了 SETNX 命令、加锁之后,紧接着却在操作
共享数据时发生了异常,结果一直没有执行最后的 DEL 命令释放锁。
因此,锁就一直被这个客户端持有,其它客户端无法拿到锁,也无法
访问共享数据和执行后续操作,这会给业务应用带来影响。
• 问题二:
• 如果客户端 A 成功获取到了锁,并且设置了过期时间 30 秒,但线程
A 执行时间超过了 30 秒,锁过期自动释放,此时线程 B 获取到了锁;
随后 A 执行完成,线程 A 使用 DEL 命令来释放锁,但此时线程 B 加
的锁还没有执行完成,线程 A 实际释放的线程 B 加的锁。
7. 使用Lua脚本(包含SETNX + EXPIRE两条指令)
• if redis.call('setnx',KEYS[1],ARGV[1]) == 1
then
• redis.call('expire',KEYS[1],ARGV[2])
• else
• return 0
• end;