redis加锁的常见几种方式
Posted autofelix
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis加锁的常见几种方式相关的知识,希望对你有一定的参考价值。
〝 古人学问遗无力,少壮功夫老始成 〞
redis加锁的常见几种方式,redis中加锁是比价常见的操作,为了防止并发情况下产生的各种内存分配问题,而选择如何正确高效的加锁,才是我们应该需要知道和了解的,常码字不易,出精品更难,没有特别幸运,那么请先特别努力,别因为懒惰而失败,还矫情地将原因归于自己倒霉。你必须特别努力,才能显得毫不费力。如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥一键三连,表示支持,谢谢各位小伙伴们。
目录
一、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加锁的常见几种方式的主要内容,如果未能解决你的问题,请参考以下文章