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,实现并发锁相关推荐

  1. 【系统架构】缓存Memcache 使用原子性操作add,实现并发锁

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

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

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

  3. Java5线程并发库之保障变量的原子性操作

    为什么80%的码农都做不了架构师?>>>    java.util.concurrent.atomic 首先我们看java.util.concurrent.atomic包,它主要是提 ...

  4. Golang 五种原子性操作的用法详解

    本文我们详细聊一下Go语言的原子操作的用法,啥是原子操作呢?顾名思义,原子操作就是具备原子性的操作... 是不是感觉说了跟没说一样,原子性的解释如下: 一个或者多个操作在 CPU 执行的过程中不被中断 ...

  5. 原子操作CAS,原子性操作类

    原子操作CAS CAS的原理 CAS(Compare And Swap),指令级别保证这是一个原子操作 三个运算符:  一个内存地址V,一个期望的值A,一个新值B 基本思路:如果地址V上的值和期望的值 ...

  6. Redis Lua脚本实现原子性操作

    一.简介 redis操作时单线程的,平常如果想要redis原子性操作的话,可以使用incrBy()和decrBy()方法进行原子性的加减,但是对于事务性的逻辑操作,没有办法实现原子性,Redis 使用 ...

  7. java cas是原子性的么_Java 并发编程:AQS 的原子性如何保证

    当我们研究AQS框架时(对于AQS不太熟知可以先阅读<什么是JDK内置并发框架AQS>,会发现AbstractQueuedSynchronizer这个类很多地方都使用了CAS操作.在并发实 ...

  8. c++ lua 可以做什么_Redis令牌桶算法(全网最全,后续可以接入lua做原子性操作)...

    一 .场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制.比如对于某个 用户,他在一个时间段(interval ...

  9. 原子性操作atomic_t

    内核定义了atomic_t 数据类型,作为对整数计数器的原子操作的基础. 各个CPU平台有各自的原子操作实现方式,基本都是通过汇编实现的. 原子操作 原子操作是Linux中提供的一种实现同步的方法,所 ...

最新文章

  1. 推荐一款常用的IDE插件,越用越喜欢
  2. 嵌入式学习笔记之三 (uboot我来看)
  3. android中解压文件
  4. 【原创】C# API 未能创建 SSL/TLS 安全通道 问题解决
  5. 【HDU4734】F(x) 数位DP
  6. java中单列集合的根接口是_java 单列集合总结
  7. 嵌入式linux面试题解析(四)——逻辑推理一
  8. C语言实现MATLAB 6.5中M文件的方法
  9. linux oracle11g客户端安装
  10. Android 系统调试(1)---禁止Selinux 的方法
  11. 传输层TCP(流量控制和拥塞控制)
  12. 关于tomcat 中的 tomcat-users.xml 配置不生效原因
  13. 【SQL】字符型函数
  14. mysql自动多表联合更新_mysql多表联合更新 的 三种方法
  15. 数据挖掘的技术都有哪些?
  16. 2020年物联网平台调研报告
  17. 洛谷-3803 【模板】多项式乘法(FFT,NNT)
  18. 如何利用wordpress搭建一个免费博客
  19. 天才黑客 Flanker 疑因拒绝做黑客攻击业务,被拼多多强行辞退,错失上亿股票...
  20. ❤️大学三年沉淀,把我的学习经验分享给你,爆肝万字带你走进编程世界!❤️

热门文章

  1. 查找数组键名是否存在
  2. tp5分页不加载搜索参数
  3. linux内核makefile详解,linux kernel编译Makefile和Kconfig,make menuconfig详解
  4. oracle中的fetchsize,oracle setFetchsize() 优化查询速度
  5. java打印正三角形_java实现打印正三角的方法
  6. index.php后有乱码后缀,phpExcel在线下wamp环境下,正常导出,同样的代码到线上Linux导出文件无法打开,修改文件后缀为.xls后乱码...
  7. html 文本 多列显示,CSS3文本,字体和多列
  8. oracle8i+下载,oracle database 8i, 9i,10g, 11g正确下载地址
  9. python 哈希表_数据结构-7 哈希表
  10. 与nfs相关的计算机服务设置,在服务器端配置nfs