用Redis的set指令实现锁
来源:互联网 发布:软件p光头 编辑:程序博客网 时间:2024/06/01 14:25
本文参考了http://huoding.com/2015/09/14/463。
我们知道,现在的Redis实现加锁的方法比较简单,直接调用Redis的set指令:
$redis->set($key, $random, array('nx', 'ex' => $expire));就可以实现。其中$random是个随机值,nx表示如果Redis中不存在$key时,就设置$key,ex表示设置超时,$expire表示超时的值。
但是,解锁的方法稍微复杂些。
今天跟同事讨论问题时,发现文章开头的链接中给出的方法仍然有问题,有下面这种情况:
假设现在有两个进程,分别是A和B。A在执行到:
if ($redis->get($key) == $random) { $redis->del($key);}
中$redis->del($key);之前,恰好$key超时,而假设此时B刚好调用set设置好$key,然后A再执行$redis->del($key);即A把B设置的$key删除掉了。要解决这个问题,只有使用watch/multi/exec来解决,即Redis在某个进程的“事务”中watch某个$key后,在multi和exec之间,如果$key被另外一个进程修改,那么当前进程试图对它的操作无效。
现在将代码修改为:
$redis->watch($key);$redis->multi();if ($redis->get($key) == $random) { $redis->del($key);}$redis->exec();
如果A执行完比较操作后,$key刚好超时,B再调用set,那么由于$key的值被修改过,所以$redis->del($key);失效;如果A执行完比较操作后,$key没有超时,这时候B执行set操作是会失败的,从而$redis->del($key)删除的是A之前设置的记录。解决问题。
0 0
- 用Redis的set指令实现锁
- redis之sorted-set指令
- redis sorted set跳跃表的实现
- Redis的set操作
- Redis的Set操作
- redis的数据类型-set
- Node.js + Redis Sorted Set 实现简单的任务队列
- redis中使用 check-and-set 操作实现乐观锁
- redis中使用 check-and-set 操作实现乐观锁
- redis key,string,hash,list,set,zset指令汇总
- Redis实用指令(四)——Set
- redis的sorted set用法
- redis set zset 的具体操作
- redis数据类型Set的常用命令
- Redis的集合类型(Set)
- Redis set的用法(转载)
- Redis的数据结构之Set
- redis的数据类型和指令
- java 容器、数组相互转换
- Eclipse很卡很受不了,这个小技巧能帮上忙
- NAT类型与NAT穿越技术
- Preconditions优雅的检验参数
- linux环境下新建weblogic域
- 用Redis的set指令实现锁
- SevletContext
- ASCII控制字符和ASCII可显示字符
- Copy List with Random Pointer
- Activity启动模式
- UNIX网络编程笔记(7)—名字与地址转换
- 基于正则表达式的数据抓包
- JAVA——管道流
- Java Web基础学习(一)