redis使用setnx命令创建锁,失效时间我设置多长时间为好?如何设置的失效时间太短,方法没等执行完,锁就自动释放了,那么就会产生并发问题。如果设置的时间太长,其他获取锁的线程就可能要平白的多等一段时间。
在只考虑单机redis的情况下,如何处理这个问题?
redis使用setnx命令创建锁,失效时间我设置多长时间为好?如何设置的失效时间太短,方法没等执行完,锁就自动释放了,那么就会产生并发问题。如果设置的时间太长,其他获取锁的线程就可能要平白的多等一段时间。
在只考虑单机redis的情况下,如何处理这个问题?
不知道我现在救火还来不来得及。
不要使用 setnx 来创建一个可过期的锁,请使用 set key value nx ex time (SET 文档地址)来创建。这样能确保 setnx 和 expire 结合为一个原子操作。
如果先 setnx 再 expire,这个操作不是原子的,可能引发新的问题。比如 setnx 之后程序异常崩溃了,导致该 key 永不过期,从而引起其他请求锁的线程一直阻塞。
希望现在救火还来得及。
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
可以预估一下你的业务请求时长,通常都在50-100ms之间,你的失效时间可以设置到100ms,如果更高你可以设置到1s,在redis防重的下一步就是数据库防重,数据库防重一定是要做的,所以就算redis锁失效,数据库肯定能防住。