基于redis锁的实现

实现redis锁基于以下两个条件:

第一:

从2.6.12版本开始,redis为SET命令增加了一系列选项:

  • EX seconds – Set the specified expire time, in seconds.
  • PX milliseconds – Set the specified expire time, in milliseconds.
  • NX – Only set the key if it does not already exist.
  • XX – Only set the key if it already exist.

  • EX seconds – 设置键key的过期时间,单位时秒
  • PX milliseconds – 设置键key的过期时间,单位时毫秒
  • NX – 只有键key不存在的时候才会设置key的值
  • XX – 只有键key存在的时候才会设置key的值

第二:
基于redis的命令eval 运行 lua 命令保证原子性

首先我们看实例:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$lockKey = 'lock';
$token = uniqid("lock".rand(),true);$ttl = '5000';//NX代表KEY不存在时设置,相当于setNX//PX设置过期时间,单位是毫秒$res = $redis->set($lockKey, $token, ['NX', 'PX' => $ttl]);if($res){//获得了锁}//解锁$script = <<<LUASCRIPT if redis.call("GET", KEYS[1]) == ARGV[1] then return redis.call("DEL", KEYS[1]) else return 0 endLUASCRIPT;$redis->eval($script, [$lockKey, $token], 1);


首先生成一个Token值,给redis加锁,返回true则就锁成功,否则则是其他进程获取了锁。
解锁的依赖redis lua 脚本的原子性,锁存在并且key值为token的时候才解锁。避免误解其他进程的锁。






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值