首页 > 数据库 > Redis > 正文

怎么实现锁定一个redis

发布: 2019-07-08 09:12:55
原创
2719 人浏览过

怎么实现锁定一个redis

redis加锁分类

redis能用的的加锁命令分别是INCR、SETNX、SET。

1、第一种锁命令INCR

这种加锁的思路是,key不存在,那么key的值会先被初始化为0,然后再执行INCR操作进行加一。
然后其它用户在执行INCR操作进行加一时,如果返回的数大于1 ,说明这个锁正在被使用当中。

1、客户端A请求服务器获取key的值为1表示获取了锁

2、客户端B也去请求服务器获取key的值为2表示获取锁失败

3、客户端A执行代码完成,删除锁

4、客户端B在等待一段时间后在去请求的时候获取key的值为1表示获取锁成功

5、客户端B执行代码完成,删除锁

$redis->incr($key);
$redis->expire($key, $ttl); //设置生成时间为1秒
登录后复制

2、第二种锁SETNX

这种加锁的思路是,如果key不存在,将key设置为value

如果key已存在,则SETNX不做任何动作

1、 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功

2、 客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败

3、 客户端A执行代码完成,删除锁

4、 客户端B在等待一段时间后在去请求设置key的值,设置成功

5、 客户端B执行代码完成,删除锁

$redis->setNX($key, $value);
$redis->expire($key, $ttl);
登录后复制

3、第三种锁SET

上面两种方法都有一个问题,会发现,都需要设置key过期。那么为什么要设置key过期呢?如果请求执行因为某些原因意外退出了,导致创建了锁但是没有删除锁,那么这个锁将一直存在,以至于以后缓存再也得不到更新。于是乎我们需要给锁加一个过期时间以防不测。

但是借助Expire来设置就不是原子性操作了。所以还可以通过事务来确保原子性,但是还是有些问题,所以官方就引用了另外一个,使用SET命令本身已经从版本2.6.12开始包含了设置过期时间的功能。

1、 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功

2、 客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败

3、 客户端A执行代码完成,删除锁

4、 客户端B在等待一段时间后在去请求设置key的值,设置成功

5、 客户端B执行代码完成,删除锁

 $redis->set($key, $value, array('nx', 'ex' => $ttl)); //ex表示秒
登录后复制

更多Redis相关知识,请访问Redis使用教程栏目!

以上是怎么实现锁定一个redis的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!