博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis 分布式锁实现
阅读量:5126 次
发布时间:2019-06-13

本文共 900 字,大约阅读时间需要 3 分钟。

get($key); //判断缓存中是否有数据 if(empty($result)) { $status = TRUE; while ($status) { //设置锁值为当前时间戳 + 有效期 $lockValue = time() + $lockExpire; /** * 创建锁 * 试图以$lockKey为key创建一个缓存,value值为当前时间戳 * 由于setnx()函数只有在不存在当前key的缓存时才会创建成功 * 所以,用此函数就可以判断当前执行的操作是否已经有其他进程在执行了 * @var [type] */ $lock = $redis->setnx($lockKey, $lockValue); /** * 满足两个条件中的一个即可进行操作 * 1、上面一步创建锁成功; * 2、 1)判断锁的值(时间戳)是否小于当前时间 $redis->get() * 2)同时给锁设置新值成功 $redis->getset() */ if(!empty($lock) || ($redis->get($lockKey) < time() && $redis->getSet($lockKey, $lockValue) < time() )) { //给锁设置生存时间 $redis->expire($lockKey, $lockExpire); //****************************** //此处执行插入、更新缓存操作... //****************************** //以上程序走完删除锁 //检测锁是否过期,过期锁没必要删除 if($redis->ttl($lockKey)) $redis->del($lockKey); $status = FALSE; }else{ /** * 如果存在有效锁这里做相应处理 * 等待当前操作完成再执行此次请求 * 直接返回 */ sleep(2);//等待2秒后再尝试执行操作 } } }

转载于:https://www.cnblogs.com/zhangfu/p/10531379.html

你可能感兴趣的文章
线性回归的Spark实现 [Linear Regression / Machine Learning / Spark]
查看>>
贝叶斯原理及其推断简介
查看>>
根据txt文件处理的方法总结
查看>>
uWSGI安装配置
查看>>
django_4:数据库1——django操作数据库
查看>>
grid layout
查看>>
VUE 使用中踩过的坑
查看>>
Solarized ----vim配色方案
查看>>
2019湖南多校第三场
查看>>
数据库连接
查看>>
如何写一个计算器?
查看>>
为什么选用 React 创建混合型移动应用?
查看>>
手把手教你撸一个简易的 webpack
查看>>
CLOSE_WAIT状态的原因与解决方法
查看>>
分页笔记
查看>>
WEB基本架构
查看>>
LOJ#6002. 「网络流 24 题」最小路径覆盖
查看>>
随笔2 PAT1001.A+B Format (20)
查看>>
No projects are found to import
查看>>
VM异常关闭后导致虚拟机无法打开问题解决办法【已解决】
查看>>