原文地址

memcache中Memcache::add()方法在缓存服务器之前不存在key时, 以key作为key存储一个变量var到缓存服务器。我们使用add来向服务器添加一个键值对应,如果成功则添加,否则说明存在另一个并发作业在进行操作。通过add的原子性来判断是否要执行热点代码。具体代码需结合上一篇的php使用memcache。使用该方法控制并发需要考虑到缓存的有效期、缓存基于内存的特点。

实现一个包含锁,解锁,锁状态检查的类cacheLock:

class cacheLock{const KEY_PREFIX = '_lock';private $mc;public function __construct(){$this->mc = new dlufMemcache('127.0.0.1',11211);}/*** 进行锁操作* @param [type]  $lock_id* @param integer $expire*/public function Lock($lock_id,$expire=5){$mkey = self::KEY_PREFIX.$lock_id; for($i = 0; $i < 10; $i++){ $flag = false;try{$flag = $this->mc->add($mkey,'1',$expire);}catch(Exception $e){$flag = false;//log
            }if($flag){return true;}else{ //wait for 0.3 secondsusleep(300000);}}return false;}/*** 判断锁状态* @param  [type]  $lock_id* @return boolean*/public function isLock($lock_id){$mkey = self::KEY_PREFIX.$lock_id;$ret = $this->mc->get($mkey);if(empty($ret) || $ret === false){return false;}return true;}/*** 解锁* @param  [type] $lock_id* @return [type]*/public function unLock($lock_id){$mkey = self::KEY_PREFIX.$lock_id;$ret = $this->mc->delete($mkey);return $ret;}}

然后使用cacheLock进行并发热点代码控制

function useLock(){$lockobj = new cacheLock();$lock = $lockobj->Lock('cachelock');if(!$lock){echo "cachelock is lock";return;}/*  热点代码 写在这里*/$lockobj->unLock('cachelock');
}

转载于:https://www.cnblogs.com/aiweixiao/p/6088548.html

【系统架构】缓存Memcache 使用原子性操作add,实现并发锁相关推荐

  1. 缓存MEMCACHE 使用原子性操作add,实现并发锁

    memcache中Memcache::add()方法在缓存服务器之前不存在key时, 以key作为key存储一个变量var到缓存服务器.我们使用add来向服务器添加一个键值对应,如果成功则添加,否则说 ...

  2. java 多用户B2B2C商城系统架构之第四篇:构建高并发高可用的电商平台架构实践

    如果需要商城系统,请联系下方微信 一.设计理念 注:这里只讲概念,尽量不讲技术!但是会推荐一些.本博客虽然是基于java语言,但是适用于任何其他大型架构系统. 1.空间换时间 1)多级缓存.静态化 关 ...

  3. ServiceStack.Redis常用操作 - 事务、并发锁

    一.事务 使用IRedisClient执行事务示例: using (IRedisClient RClient = prcm.GetClient()){RClient.Add("key&quo ...

  4. mysql 亿级高并发_亿级流量系统架构之如何设计每秒十万查询的高并发架构.md

    亿级流量系统架构之如何设计每秒十万查询的高并发架构 一.前情回顾 上篇文章(亿级流量系统架构之如何设计承载百亿流量的高性能架构)聊了一下系统架构中,百亿流量级别高并发写入场景下,如何承载这种高并发写入 ...

  5. 互联网大厂高并发抢购系统架构设计

    背景 大家好,这篇文章给大家介绍一个非常经典的去大厂面试经常被问的一个问题,就是瞬时 高并发抢购问题,通常来说,大厂开发的系统经常会遇到一些类似电商秒杀抢购.景点门票高并发抢购.特殊商品(比如口罩)高 ...

  6. 《秒杀系统架构设计》学习

    QQ 业务特点:细粒度数据查询 即使并发量很大,锁冲突其实不大,数据水平切分后,因为带上了 uid,gid 等字段,用户层面几乎没有锁冲突 weibo业务特点:读多写少,有少量读写锁冲突 微博的核心业 ...

  7. 每秒10万并发 mysql_亿级流量系统架构之如何设计每秒十万查询的高并发架构

    一.前情回顾 上篇文章(亿级流量系统架构之如何设计承载百亿流量的高性能架构)聊了一下系统架构中,百亿流量级别高并发写入场景下,如何承载这种高并发写入,同时如何在高并发写入的背景下还能保证系统的超高性能 ...

  8. 系统架构师(java)和大数据架构师

    架构师不是一个职业工种,而是一种能力,而且架构师也分很多种,不同领域的架构师是不一样的.比如互联网架构师和物联网架构师,没有什么可对比的. 架构要考虑什么 1.考虑系统能做什么,不能做什么,就是常说的 ...

  9. 系统架构设计:进程缓存和缓存服务,如何抉择?

    作者:翁智华 来源:https://www.cnblogs.com/wzh2010/p/13874206.html 概述 我们所说的缓存分为进程内部缓存(系统内部缓存)和 缓存服务(如redis/me ...

最新文章

  1. pandas 读取所有表头_像用excel一样用pandas
  2. 张一鸣向盖茨基金会捐赠1000万美元 此前国内捐款1亿元用于抗疫
  3. 宁夏师范大学本科计算机理工,2019年宁夏师范学院区内二批普通本科理工类(录取905人,共16个专业)...
  4. java正则获取数字_Java通过正则表达式获取字符串中数字的方法示例
  5. denied git permission_Git使用之Permission Denied问题解决[2153-Noblog]
  6. linux下启动jboss脚本,Linux下配置JBoss自动启动
  7. java没有pom文件_java – Maven依赖没有得到相应的POM文件下载
  8. 【webrtc】基于libyuv的转换
  9. PhotoScissors 6 for Mac(mac抠图软件)
  10. 单细胞分析实录(18): 基于CellPhoneDB的细胞通讯分析及可视化 (上篇)
  11. 史上最烂的项目:苦撑 12 年,600 多万行代码
  12. android OTA更新
  13. 【基于深度学习的脑电图识别】应用篇:DEEP LEARNING APPROACHES FOR AUTOMATIC ANALYSIS OF EEGS
  14. 基于UDP的企业级大文件传输体系
  15. 第10章: 面向对象编程(高级部分)
  16. IE浏览器快速切换各个版本
  17. java与nodejs区别_nodejs和java之间有什么区别?
  18. java大作业开题报告_c++大作业选题报告.docx
  19. 行业分析-全球与中国AI支援X光影像解决方案市场现状及未来发展趋势
  20. 【PTA】【C语言】使用函数实现字符串复制

热门文章

  1. asp.Net下短信猫发送短信中的中文乱码解决
  2. 细胞亚器互作之细胞代谢调节液泡与线粒体的接触位Cellular Metabolism Regulates Contact Sites between Vacuoles and Mitochondria
  3. linux x11 挖矿病毒,应急响应:记一次花样贼多的挖矿病毒
  4. python 招聘 少_Python招聘需求猛增123%!学完Python工资多少?
  5. 前端开发中如何将文件夹中的图片变为背景图_如何用Elementor设计banner
  6. 运筹优化(十九)--决策论基础及其最优化求解
  7. 图像局部特征(十五)--MSCR
  8. 地址解析协议(Address Resolution Protocol,ARP)
  9. remote Incorrect username or password ( access token ):用户名或密码不正确(访问令牌)
  10. 八类网线和七类网线的区别_Cat8 八类网线与超五类网线、六类网线、超六类网线及七类/超七类网线的区别...