Redis应用-分布式锁

栏目: 数据库 · 发布时间: 5年前

Redis应用-分布式锁

当多个进程不在同一个系统中,就需要用分布式锁控制多个进程对资源的访问。

使用 redis 来实现分布式锁主要用到以下命令:

  • SETNX KEY VALUE 如果key不存在,就设置key对应字符串value

  • expire KEY seconds 设置key的过期时间

  • del KEY 删除key

代码实现如下:


   

$redis = new Redis();

$redis->connect('127.0.0.1', 6379);

$ok = $redis->setNX($key, $value);

if ($ok) {

//获取到锁

... do something ...

$redis->del($key);

}

上面代码有没有问题呢? 如果我们在逻辑处理过程中出现了异常情况,导致KEY没有删除,那就出现了死锁了。所以一般我们在拿到锁之后再给KEY加一个过期时间

为了保证执行的原子性,使用了 multi 就有了如下代码


   

$redis->multi();

$redis->setNX($key, $value);

$redis->expire($key, $ttl);

$res = $redis->exec();

if($res[0]) {

//获取到锁

... do something ...

$redis->del($key);

}

但是这样的又有一个问题第一个请求成功了,之后的请求虽然没有拿到锁但是每次都刷新了锁的时间。这样我们设置锁过期时间的意义就不存在了。所以我们在拿到锁以后再进行过期时间的操作,这时候我们就可以祭出原子性操作的 lua 脚本,代码如下


   

$script = <<<EOT

local key = KEYS[1]

local value = KEYS[2]

local ttl = KEYS[3]


local ok = redis.call('setnx', key, value)


if ok == 1 then

redis.call('expire', key, ttl)

end

return ok

EOT;


$res = $redis->eval($script, [$key,$val, $ttl], 3);

if($res) {

//获取到锁

... do something ...

$redis->del($key);

}

借助lua脚本虽然解决了问题,但是未免有些麻烦,Redis从 2.6.12 版本开始, SET 命令的行为可以通过一系列参数来修改:

  • EX second :设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。

  • PX millisecond :设置键的过期时间为 millisecond 毫秒。 SET key value PX millisecond 效果等同于 PSETEX key millisecond value 。

  • NX :只在键不存在时,才对键进行设置操作。 SET key value NX 效果等同于 SETNX key value 。

  • XX :只在键已经存在时,才对键进行设置操作。


   

$ok = $redis->set($key, $random, array('nx', 'ex' => $ttl));


if ($ok) {

//获取到锁

... do something ...

if ($redis->get($key) == $random) {

$redis->del($key);

}

}

可以看到上面我们我们的值引入了一个随机数,这是为了防止逻辑处理时间过长导致锁的过期时间已经失效,这时候下一个请求就获得了锁,但是前一个请求在逻辑处理完直接删除了锁。

锁主要用在并发请求如秒杀等场景中,以上便是redis锁的实现。

资源

各类学习资源可关注公号获得

good good study  day day up

Redis应用-分布式锁

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法设计与分析

算法设计与分析

张德富 / 2009-8 / 36.00元

《算法设计与分析》主要取材于算法设计与分析领域的经典内容,并介绍了算法设计的发展趋势。内容主要包括非常经典的算法设计技术,例如递归与分治、动态规划、贪心、回溯、分支限界、图算法,也包括了一些高级的算法设计主题,例如网络流和匹配、启发式搜索、线性规划、数论以及计算几何。在算法分析方面,介绍了概率分析以及最新的分摊分析和实验分析方法。在算法的理论方面,介绍了问题的下界、算法的正确性证明以及NP完全理论......一起来看看 《算法设计与分析》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具