基于redis锁的实现
2017-12-02 17:39
357 查看
实现redis锁基于以下两个条件:
第一:
从2.6.12版本开始,redis为
第二:
基于redis的命令eval 运行 lua 命令保证原子性
首先我们看实例:
$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的时候才解锁。避免误解其他进程的锁。
第一:
从2.6.12版本开始,redis为
SET命令增加了一系列选项:
EXseconds – Set the specified expire time, in seconds.
PXmilliseconds – 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.
EXseconds – 设置键key的过期时间,单位时秒
PXmilliseconds – 设置键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的时候才解锁。避免误解其他进程的锁。
相关文章推荐
- 基于redis实现购物车
- 基于Redis实现分布式锁
- 分布式锁实现方案1、基于Redis的SETNX操作实现的分布式锁
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- 基于Redis实现分布式Session
- SpringBoot 基于Redis快速实现消息队列
- 基于nginx+redis+tomcat 实现session 共享
- 基于Redis实现分布式锁
- shiro框架实现基于redis的SessionDao
- 基于Nginx+PHP+Redis的短URL系统的实现
- 详解Java如何实现基于Redis的分布式锁
- 分布式架构下的会话追踪实践【基于Cookie和Redis实现】
- 基于Redis实现分布式消息队列(2)
- 分布式锁与实现(一)——基于Redis实现
- 基于redis实现的扣减库存
- 基于Redis实现分布式锁
- 基于redis 实现分布式锁(二)
- 基于redis的高并发秒杀的JAVA-DEMO实现!
- Redis分布式锁 基于GETSET SETNX REDISSON 的实现
- 基于nutcracker 的redis分布式缓存的实现的注意