先说结论:SET {key} {value} NX EX {seconds}
set命令参考:http://doc.redisfans.com/string/set.html
SETNX
redis支持SETNX命令:http://doc.redisfans.com/string/setnx.html
但是使用SETNX有一个问题,那就是锁不能永久存在,需要释放
先看下面的代码
if (!SETNX)
return
// 业务逻辑
DEL
如果在执行业务逻辑的时候出现异常,那么就不会释放锁,造成锁永远存在
那么是不是可以把删除锁的操作放到finally里?
try{
if (!SETNX)
return
// 业务逻辑
}finally{
DEL
}
但是在执行DEL的时候,有可能因为一些特殊的原因不能执行成功,比如网络抖动,那么锁依旧得不到释放
所以需要在SETNX的时候,就给这个key设置一个大约的过期时间(比如3秒),这样即使最终没有DEL,也可以防止锁永远不释放
try{
if (!SETNX)
return
EXPIRE 3s
// 业务逻辑
}finally{
DEL
}
同样的,这样给key设置过期时间,依旧可能因为一些特殊的原因不能执行成功,比如网络抖动,EXPIRE失败,然后DEL,又失败,锁得不到释放
那么SETNX和EXPIRE是否可以放到一个pipeline或者一个MULTI中呢?好吧,我选择狗带,幸亏redis提供了一个单条命令就可以实现加锁和设置过期时间,那就是set命令,用法如我开头所说
网友评论