php redis setnx分布式锁简单原理解析
发布:smiling 来源: PHP粉丝网 添加日期:2022-03-29 08:22:27 浏览: 评论:0
这篇文章主要介绍了php redis setnx分布式锁简单原理解析,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧。
我就废话不多说了,大家还是直接看代码吧~
- <?php
- //高并发分布式锁
- header("Content-type:text/html;charset=utf-8");
- $redis = new Redis();
- $redis->connect('127.0.0.1', 6379);
- echo "Connection to server sucessfully";
- //echo $redis->get("name");exit;
- $expire = 1;
- $key = 'test1';
- $lock = false;
- $is_lock=$redis->setnx($key,time()+$expire);
- if(!$is_lock){
- $lock_time=$redis->get($key);
- //锁已过期,重置
- if($lock_time<time()){
- $redis->del($key);
- $lock_time=$redis->get($key);
- $is_lock=$redis->setnx($key,time()+$expire);
- }
- }
- $is_lock ? true : false;
- if($is_lock){
- writeFile("正常访问"."\n");
- }else{
- writeFile("系统繁忙"."\n");
- }
- function writeFile($data,$type='a'){
- //sleep(1);
- //usleep(500000);//假设暂停 500毫秒
- $filename = date("Ymd").".log";
- $handle =@ fopen($filename, $type);
- flock($handle, LOCK_EX);
- ob_start();
- echo "\n" . "[SQL]" . "\n";
- print_r ($data);
- $string = ob_get_contents();
- ob_end_clean();
- $fettle = @fwrite($handle, $string);
- fclose($handle);
- @chmod($filename,0777);
- }
补充知识:php redis set 单机锁
如果一个请求更新缓存的时间比较长,甚至比锁的有效期还要长,导致在缓存更新过程中,锁就失效了,此时另一个请求会获取锁,但前一个请求在缓存更新完毕的时候,如果不加以判断直接删除锁,就会出现误删除其它请求创建的锁的情况,所以我们在创建锁的时候需要引入一个随机值:
- $ok = $redis->set($key, $random, array('nx', 'ex' =>5));
- if ($ok) {
- $cache->update();
- if ($redis->get($key) == $random) {
- $redis->del($key);
- }
- }
Tags: redis setnx
- 上一篇:PHP如何通过带尾指针的链表实现'队列'
- 下一篇:最后一页
相关文章
- ·php实现redis数据库指定库号迁移(2014-09-10)
- ·redis访问权限控制,密码设置(2014-09-10)
- ·php怎么安装redis扩展?redis安装以及php扩展的介绍(2018-07-20)
- ·laravel项目利用twemproxy部署redis集群的完整步骤(2018-11-07)
- ·PHP+redis实现的悲观锁机制示例(2018-11-14)
- ·PhpRedis与Predis之间的性能比较(实例)(2020-02-04)
- ·Redis分片(分布式缓存)(2020-02-04)
- ·浅谈redis的缓存穿透和缓存失效的预防和解决(2020-04-09)
- ·PHP使用Redis的GEO(地理位置)命令(2020-04-28)
- ·php实现redis数据库指定库号迁移的方法(2021-05-08)
- ·php操作redis缓存方法分享(2021-05-27)
- ·PHP实现操作redis的封装类完整实例(2021-06-26)
- ·PHP+redis实现添加处理投票的方法(2021-06-26)
- ·PHP使用redis实现统计缓存mysql压力的方法(2021-06-26)
- ·PHP使用Redis实现防止大并发下二次写入的方法(2021-08-11)
- ·PHP+Redis 消息队列 实现高并发下注册人数统计的实例(2021-09-01)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)