Redis发展到现在,几种常见的部署架构有:
单机模式;
主从模式;
哨兵模式;
集群模式;
从分布式锁的角度来说, 无论是单机模式、主从模式、哨兵模式、集群模式,其原理都是类同的。 只是主从模式、哨兵模式、集群模式的更加的高可用、或者更加高并发。
所以,接下来先基于单机模式,基于Jedis手工造轮子实现自己的分布式锁。
首先看两个命令:
Redis分布式锁机制,主要借助setnx和expire两个命令完成。
SETNX 是SET if Not eXists的简写。将 key 的值设为 value,当且仅当 key 不存在; 若给定的 key 已经存在,则 SETNX 不做任何动作。
下面为客户端使用示例:
- 127.0.0.1:6379> set lock "unlock"
- OK
- 127.0.0.1:6379> setnx lock "unlock"
- (integer) 0
- 127.0.0.1:6379> setnx lock "lock"
- (integer) 0
- 127.0.0.1:6379>
expire命令为 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除. 其格式为:
EXPIRE key seconds
下面为客户端使用示例:
- 127.0.0.1:6379> expire lock 10
- (integer) 1
- 127.0.0.1:6379> ttl lock
- 8
- $lock = Redis::setnx('cqny',5,1);
- if(!$lock) return $this->apiError('操作太频繁了');
- Redis::expire('cqny',10);
- $block = Cache::lock("GoodLock",10); //返回一个redis对象
- if ($block){
- // Todo 业务逻辑
- sleep(10);
- echo "业务逻辑
"; - $block->release(); // 释放锁
- return "秒杀成功";
- }
- return 12;
- $suo = Redis::set('123',123,"nx","ex",5);
- if ($suo) Redis::del('123');