缓存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‘);
}

缓存MEMCACHE 使用原子性操作add,实现并发锁,布布扣,bubuko.com

时间: 2024-08-04 19:57:51

缓存MEMCACHE 使用原子性操作add,实现并发锁的相关文章

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

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

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

一.事务 使用IRedisClient执行事务示例: using (IRedisClient RClient = prcm.GetClient()) { RClient.Add("key",1); using (IRedisTransaction IRT = RClient.CreateTransaction()) { IRT.QueueCommand(r => r.Set("key", 20)); IRT.QueueCommand(r => r.Inc

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

一.事务 使用IRedisClient执行事务示例: using (IRedisClient RClient = prcm.GetClient()) { RClient.Add("key",1); using (IRedisTransaction IRT = RClient.CreateTransaction()) { IRT.QueueCommand(r => r.Set("key", 20)); IRT.QueueCommand(r => r.Inc

192.168.62.124python运维开发(十一)----python操作缓存memcache、redis

内容目录: 缓存 memcache redis memcache Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memcached安装配置 #安装依赖包 yum install libeve

【java并发】原子性操作类的使用

在java5以后,我们接触到了线程原子性操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,本文总结一下Atomic系列的类的使用方法,其中包含: 类型 Integer Long 基本类型 AtomicInteger AtomicLong AtomicBoolean 数组类型 AtomicIntegerArray AtomicLongArray AtomicReferenceArray 属性原子修改器 AtomicIntegerFieldUpda

缓存-memcache redies

一 memcache 1)server端 1.安装 下载:wget http://memcached.org/latest tar -zxvf memcached-1.x.x.tar.gz cd memcached-1.x.x ./configure && make && make test && sudo make install PS:依赖libevent yum install libevent-devel apt-get install libeve

自动化运维Python系列之Memcache、Redis操作

Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memcached安装 wget http://memcached.org/latest tar -zxvf memcach

分布式缓存Memcache和Redis

引言 针对于现在计算机的CPU和网络设施,对应用程序来说,执行效率的瓶颈,已经不是代码的长度(实现同一个功能)和带宽了,而是,代码访问资源的过程,即:让我们的程序慢下来的罪魁祸首就是IO操作. 程序从硬盘上读取数据是一个非常花费时间的操作,因为我们现在所使用的硬盘是机械式的,你想机械的运行速度和电的速度,那是一个级别上的选手吗? 为了解决程序的瓶颈,人们提出了一种想法:使用空间换取时间.程序访问硬盘用的时间长,那就让数据放到内存中,让程序访问内存,这样不就节省了时间.这样确实剩下了我们程序获取数

memcache(使用telnet操作)

memcache(使用telnet操作) 使用telnet操作memcache,一般不常用, 1.使用方法 使用telnet操作memcache,一般不常用, 1.使用方法 1. 连接到memcached telnet 192.168.1.100 11211 add name 0 60 5     [说明 add 是指令名  name 是key的名字 (是以key/value存放), 0 标志, 60 表示数据存放 60s   5表示 放入多大数据 ], 如果一个key已经存在,再放入是失败的.