您当前的位置: 首页 >  redis

壹小俊

暂无认证

  • 2浏览

    0关注

    885博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

解锁redis锁的正确姿势

壹小俊 发布时间:2020-04-01 09:50:41 ,浏览量:2

redis是php的好朋友,在php写业务过程中,有时候会使用到锁的概念,同时只能有一个人可以操作某个行为。这个时候我们就要用到锁。锁的方式有好几种,php不能在内存中用锁,不能使用zookeeper加锁,使用数据库做锁又消耗比较大,这个时候我们一般会选用redis做锁机制。

setnx

锁在redis中最简单的数据结构就是string。最早的时候,上锁的操作一般使用setnx,这个命令是当:lock不存在的时候set一个val,或许你还会记得使用expire来增加锁的过期,解锁操作就是使用del命令,伪代码如下:

1if (Redis::setnx("my:lock", 1)) {
2    Redis::expire("my:lock", 10);
3    // ... do something
4
5    Redis::del("my:lock")
6}

这里其实是有问题的,问题就在于setnx和expire中间如果遇到crash等行为,可能这个lock就不会被释放了。于是进一步的优化方案可能是在lock中存储timestamp。判断timestamp的长短。

set

现在官方建议直接使用set来实现锁。我们可以使用set命令来替代setnx,就是下面这个样子

1if (Redis::set("my:lock", 1, "nx", "ex", 10)) {
2    ... do something
3
4    Redis::del("my:lock")
5}

上面的代码把my:lock设置为1,当且仅当这个lock不存在的时候&#x

关注
打赏
1664335782
查看更多评论
立即登录/注册

微信扫码登录

0.0405s