关于redis实现分布式锁的问题

redis使用setnx命令创建锁,失效时间我设置多长时间为好?如何设置的失效时间太短,方法没等执行完,锁就自动释放了,那么就会产生并发问题。如果设置的时间太长,其他获取锁的线程就可能要平白的多等一段时间。
在只考虑单机redis的情况下,如何处理这个问题?

阅读 2.7k
2 个回答

可以预估一下你的业务请求时长,通常都在50-100ms之间,你的失效时间可以设置到100ms,如果更高你可以设置到1s,在redis防重的下一步就是数据库防重,数据库防重一定是要做的,所以就算redis锁失效,数据库肯定能防住。

不知道我现在救火还来不来得及。

不要使用 setnx 来创建一个可过期的锁,请使用 set key value nx ex time (SET 文档地址)来创建。这样能确保 setnx 和 expire 结合为一个原子操作。

如果先 setnx 再 expire,这个操作不是原子的,可能引发新的问题。比如 setnx 之后程序异常崩溃了,导致该 key 永不过期,从而引起其他请求锁的线程一直阻塞。

希望现在救火还来得及。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题