缓存MEMCACHE 使用原子性操作add,实现并发锁
memcache中Memcache::add()方法在缓存服务器之前不存在key
时, 以key
作为key存储一个变量var
到缓存服务器。我们使用add来向服务器添加一个键值对应,如果成功则添加,否则说明存在另一个并发作业在进行操作。通过add的原子性来判断是否要执行热点代码。具体代码需结合上一篇的php使用memcache。使用该方法控制并发需要考虑到缓存的有效期、缓存基于内存的特点。
实现一个包含锁,解锁,锁状态检查的类cacheLock:
1 class cacheLock{ 2 const KEY_PREFIX = '_lock'; 3 private $mc; 4 5 public function __construct(){ 6 $this->mc = new dlufMemcache('127.0.0.1',11211); 7 } 8 9 /** 10 * 进行锁操作 11 * @param [type] $lock_id 12 * @param integer $expire 13 */ 14 public function Lock($lock_id,$expire=5){ 15 $mkey = self::KEY_PREFIX.$lock_id; 16 for($i = 0; $i < 10; $i++){ 17 $flag = false; 18 try{ 19 $flag = $this->mc->add($mkey,'1',$expire); 20 }catch(Exception $e){ 21 $flag = false; 22 //log 23 } 24 if($flag){ 25 return true; 26 }else{ 27 //wait for 0.3 seconds 28 usleep(300000); 29 } 30 } 31 return false; 32 } 33 34 /** 35 * 判断锁状态 36 * @param [type] $lock_id 37 * @return boolean 38 */ 39 public function isLock($lock_id){ 40 $mkey = self::KEY_PREFIX.$lock_id; 41 $ret = $this->mc->get($mkey); 42 if(empty($ret) || $ret === false){ 43 return false; 44 } 45 return true; 46 } 47 48 /** 49 * 解锁 50 * @param [type] $lock_id 51 * @return [type] 52 */ 53 public function unLock($lock_id){ 54 $mkey = self::KEY_PREFIX.$lock_id; 55 $ret = $this->mc->delete($mkey); 56 return $ret; 57 } 58 59 }
然后使用cacheLock进行并发热点代码控制
function useLock(){$lockobj = new cacheLock();$lock = $lockobj->Lock('cachelock');if(!$lock){echo "cachelock is lock";return;}/* 热点代码 写在这里*/$lockobj->unLock('cachelock'); }
转载于:https://www.cnblogs.com/dluf/p/3849075.html
缓存MEMCACHE 使用原子性操作add,实现并发锁相关推荐
- 【系统架构】缓存Memcache 使用原子性操作add,实现并发锁
原文地址 memcache中Memcache::add()方法在缓存服务器之前不存在key时, 以key作为key存储一个变量var到缓存服务器.我们使用add来向服务器添加一个键值对应,如果成功则添 ...
- ServiceStack.Redis常用操作 - 事务、并发锁
一.事务 使用IRedisClient执行事务示例: using (IRedisClient RClient = prcm.GetClient()){RClient.Add("key&quo ...
- Java5线程并发库之保障变量的原子性操作
为什么80%的码农都做不了架构师?>>> java.util.concurrent.atomic 首先我们看java.util.concurrent.atomic包,它主要是提 ...
- Golang 五种原子性操作的用法详解
本文我们详细聊一下Go语言的原子操作的用法,啥是原子操作呢?顾名思义,原子操作就是具备原子性的操作... 是不是感觉说了跟没说一样,原子性的解释如下: 一个或者多个操作在 CPU 执行的过程中不被中断 ...
- 原子操作CAS,原子性操作类
原子操作CAS CAS的原理 CAS(Compare And Swap),指令级别保证这是一个原子操作 三个运算符: 一个内存地址V,一个期望的值A,一个新值B 基本思路:如果地址V上的值和期望的值 ...
- Redis Lua脚本实现原子性操作
一.简介 redis操作时单线程的,平常如果想要redis原子性操作的话,可以使用incrBy()和decrBy()方法进行原子性的加减,但是对于事务性的逻辑操作,没有办法实现原子性,Redis 使用 ...
- java cas是原子性的么_Java 并发编程:AQS 的原子性如何保证
当我们研究AQS框架时(对于AQS不太熟知可以先阅读<什么是JDK内置并发框架AQS>,会发现AbstractQueuedSynchronizer这个类很多地方都使用了CAS操作.在并发实 ...
- c++ lua 可以做什么_Redis令牌桶算法(全网最全,后续可以接入lua做原子性操作)...
一 .场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制.比如对于某个 用户,他在一个时间段(interval ...
- 原子性操作atomic_t
内核定义了atomic_t 数据类型,作为对整数计数器的原子操作的基础. 各个CPU平台有各自的原子操作实现方式,基本都是通过汇编实现的. 原子操作 原子操作是Linux中提供的一种实现同步的方法,所 ...
最新文章
- 推荐一款常用的IDE插件,越用越喜欢
- 嵌入式学习笔记之三 (uboot我来看)
- android中解压文件
- 【原创】C# API 未能创建 SSL/TLS 安全通道 问题解决
- 【HDU4734】F(x) 数位DP
- java中单列集合的根接口是_java 单列集合总结
- 嵌入式linux面试题解析(四)——逻辑推理一
- C语言实现MATLAB 6.5中M文件的方法
- linux oracle11g客户端安装
- Android 系统调试(1)---禁止Selinux 的方法
- 传输层TCP(流量控制和拥塞控制)
- 关于tomcat 中的 tomcat-users.xml 配置不生效原因
- 【SQL】字符型函数
- mysql自动多表联合更新_mysql多表联合更新 的 三种方法
- 数据挖掘的技术都有哪些?
- 2020年物联网平台调研报告
- 洛谷-3803 【模板】多项式乘法(FFT,NNT)
- 如何利用wordpress搭建一个免费博客
- 天才黑客 Flanker 疑因拒绝做黑客攻击业务,被拼多多强行辞退,错失上亿股票...
- ❤️大学三年沉淀,把我的学习经验分享给你,爆肝万字带你走进编程世界!❤️
热门文章
- 查找数组键名是否存在
- tp5分页不加载搜索参数
- linux内核makefile详解,linux kernel编译Makefile和Kconfig,make menuconfig详解
- oracle中的fetchsize,oracle setFetchsize() 优化查询速度
- java打印正三角形_java实现打印正三角的方法
- index.php后有乱码后缀,phpExcel在线下wamp环境下,正常导出,同样的代码到线上Linux导出文件无法打开,修改文件后缀为.xls后乱码...
- html 文本 多列显示,CSS3文本,字体和多列
- oracle8i+下载,oracle database 8i, 9i,10g, 11g正确下载地址
- python 哈希表_数据结构-7 哈希表
- 与nfs相关的计算机服务设置,在服务器端配置nfs