redis加锁的常见几种方式

Posted autofelix

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis加锁的常见几种方式相关的知识,希望对你有一定的参考价值。

〝 古人学问遗无力,少壮功夫老始成 〞

redis加锁的常见几种方式,redis中加锁是比价常见的操作,为了防止并发情况下产生的各种内存分配问题,而选择如何正确高效的加锁,才是我们应该需要知道和了解的,常码字不易,出精品更难,没有特别幸运,那么请先特别努力,别因为懒惰而失败,还矫情地将原因归于自己倒霉。你必须特别努力,才能显得毫不费力。如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥一键三连,表示支持,谢谢各位小伙伴们。

目录

一、incr加锁

二、setnx加锁

三、set加锁

四、防止死锁


一、incr加锁

  • 如果key不存在,则将key初始化为0,然后自增1
<?php
$lock = $redis->get($key);

if (!$lock) {
  /* ..加锁.. */
  $redis->incr($key);

  /* ..加锁之后你的逻辑.. */

  /* ..删除锁,直接删除或者设置过期时间也行.. */
  $redis->del($key);
}

二、setnx加锁

  • 如何key不存在,则将key设置成value
<?php
$lock = $redis->get($key);
if (!$lock) {
   /* ..加锁.. */
   $redis->setNX($key, $value);

   /* ..加锁之后你的逻辑.. */

   /* ..删除锁,直接删除或者设置过期时间也行.. */
   $redis->del($key);
}

三、set加锁

  • 同setnx加锁
<?php
$lock = $redis->get($key);
if (!$lock) {
   /* ..加锁.. */
   $redis->set($key, $value);

   /* ..加锁之后你的逻辑.. */

   /* ..删除锁,直接删除或者设置过期时间也行.. */
   $redis->del($key);
}

四、防止死锁

  • 循环为了防止加锁失败
  • 等待时间为了降低强锁频率
  • 加入随机key是为了误删除
<?php
//循环防止加锁失败
do {
  $timeout = 10;
  $key = 'autofelix_lock';
  $rand = mt_rand(10000, 99999);
  $value = 'autofelix_' . $rand; //随机值,防止误删除
  $lock = Redis::set($key, $value, 'ex', $timeout, 'nx'); //ex 秒

  if ($lock) {
     if (Redis::get($key) == $value) {

            /* ..执行自己的逻辑.. */

            /* ..删除锁.. */
             Redis::del($key);

             /* ..跳出循环.. */
              continue;
         }
     } else {
          /* ..降低抢锁频率.. */
          usleep(5000);
      }
} while (!$lock);

 

以上是关于redis加锁的常见几种方式的主要内容,如果未能解决你的问题,请参考以下文章

redis加锁的常见几种方式

redis加锁的几种实现

redis几种加锁的实现

redis加锁的几种实现

PHP中redis加锁和解锁的简单实现

redis分布式锁的几种实现方式,以及Redisson的配置和使用