简单方案:
最简单的方法是使用 setnx 命令。释放锁的最简单方式是执行 del 指令。
问题:
锁超时:如果一个得到锁的线程在执行任务的过程中挂掉,来不及显式地释放锁,这块资源将会永远被锁住(死锁),别的线程再也别想进来。
优化方案:
setnx 没办法设置超时时间,如果利用 expire 来设置超时时间,那么这两步操作不是原子性操作。
利用 set 指令增加了可选参数方式来替代 setnx。set 指令可以设置超时时间。
上面知识一个简单的回答,如果想更详细的深入回答这个问题。
建议看:Java后端核心知识总结:Redis篇
业务超时问题,我们可以使用Redission,其中的看门狗能够给我们的锁续命。默认情况下,看门狗的检查锁的超时时间是30秒钟,也可以通过修改Config.lockWatchdogTimeout 来另行指定。