加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

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

发布时间:2020-05-25 03:15:31 所属栏目:PHP 来源:互联网
导读:memcache中Memcache::add()方法在缓存服务器之前不存在key时, 以key作为key存储一个变量var到缓存服务器。我们使用add来向服务器添加一个键值对应,如果成功则添加,否则说明存在另一个并发作业在进行操作。通过add的原子性来判断是否要执行热点代码。具体代

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

KEY_PREFIX = '_lock' </span><span style="color: #0000ff"&gt;public</span> <span style="color: #0000ff"&gt;function</span><span style="color: #000000"&gt; __construct(){ </span><span style="color: #800080"&gt;$this</span>->mc = <span style="color: #0000ff"&gt;new</span> dlufMemcache('127.0.0.1',11211<span style="color: #000000"&gt;); } </span><span style="color: #008000"&gt;/*</span><span style="color: #008000"&gt;* * 进行锁操作 * @param [type] $lock_id * @param integer $expire </span><span style="color: #008000"&gt;*/</span> <span style="color: #0000ff"&gt;public</span> <span style="color: #0000ff"&gt;function</span> Lock(<span style="color: #800080"&gt;$lock_id</span>,<span style="color: #800080"&gt;$expire</span>=5<span style="color: #000000"&gt;){ </span><span style="color: #800080"&gt;$mkey</span> = self::KEY_PREFIX.<span style="color: #800080"&gt;$lock_id</span><span style="color: #000000"&gt;; </span><span style="color: #0000ff"&gt;for</span>(<span style="color: #800080"&gt;$i</span> = 0; <span style="color: #800080"&gt;$i</span> < 10; <span style="color: #800080"&gt;$i</span>++<span style="color: #000000"&gt;){ </span><span style="color: #800080"&gt;$flag</span> = <span style="color: #0000ff"&gt;false</span><span style="color: #000000"&gt;; </span><span style="color: #0000ff"&gt;try</span><span style="color: #000000"&gt;{ </span><span style="color: #800080"&gt;$flag</span> = <span style="color: #800080"&gt;$this</span>->mc->add(<span style="color: #800080"&gt;$mkey</span>,'1',<span style="color: #800080"&gt;$expire</span><span style="color: #000000"&gt;); }</span><span style="color: #0000ff"&gt;catch</span>(<span style="color: #0000ff"&gt;Exception</span> <span style="color: #800080"&gt;$e</span><span style="color: #000000"&gt;){ </span><span style="color: #800080"&gt;$flag</span> = <span style="color: #0000ff"&gt;false</span><span style="color: #000000"&gt;; </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt;log</span>

<span style="color: #000000"> }
<span style="color: #0000ff">if(<span style="color: #800080">$flag<span style="color: #000000">){
<span style="color: #0000ff">return <span style="color: #0000ff">true<span style="color: #000000">;
}<span style="color: #0000ff">else<span style="color: #000000">{
<span style="color: #008000">//<span style="color: #008000">wait for 0.3 seconds
<span style="color: #008080">usleep(300000<span style="color: #000000">);
}
}
<span style="color: #0000ff">return <span style="color: #0000ff">false<span style="color: #000000">;
}

</span><span style="color: #008000"&gt;/*</span><span style="color: #008000"&gt;*
 * 判断锁状态
 * @param  [type]  $lock_id
 * @return boolean
 </span><span style="color: #008000"&gt;*/</span>
<span style="color: #0000ff"&gt;public</span> <span style="color: #0000ff"&gt;function</span> isLock(<span style="color: #800080"&gt;$lock_id</span><span style="color: #000000"&gt;){
    </span><span style="color: #800080"&gt;$mkey</span> = self::KEY_PREFIX.<span style="color: #800080"&gt;$lock_id</span><span style="color: #000000"&gt;;
    </span><span style="color: #800080"&gt;$ret</span> = <span style="color: #800080"&gt;$this</span>->mc->get(<span style="color: #800080"&gt;$mkey</span><span style="color: #000000"&gt;);
    </span><span style="color: #0000ff"&gt;if</span>(<span style="color: #0000ff"&gt;empty</span>(<span style="color: #800080"&gt;$ret</span>) || <span style="color: #800080"&gt;$ret</span> === <span style="color: #0000ff"&gt;false</span><span style="color: #000000"&gt;){
        </span><span style="color: #0000ff"&gt;return</span> <span style="color: #0000ff"&gt;false</span><span style="color: #000000"&gt;;
    }
    </span><span style="color: #0000ff"&gt;return</span> <span style="color: #0000ff"&gt;true</span><span style="color: #000000"&gt;;
}

</span><span style="color: #008000"&gt;/*</span><span style="color: #008000"&gt;*
 * 解锁
 * @param  [type] $lock_id
 * @return [type]
 </span><span style="color: #008000"&gt;*/</span>
<span style="color: #0000ff"&gt;public</span> <span style="color: #0000ff"&gt;function</span> unLock(<span style="color: #800080"&gt;$lock_id</span><span style="color: #000000"&gt;){
    </span><span style="color: #800080"&gt;$mkey</span> = self::KEY_PREFIX.<span style="color: #800080"&gt;$lock_id</span><span style="color: #000000"&gt;;
    </span><span style="color: #800080"&gt;$ret</span> = <span style="color: #800080"&gt;$this</span>->mc->delete(<span style="color: #800080"&gt;$mkey</span><span style="color: #000000"&gt;);
    </span><span style="color: #0000ff"&gt;return</span> <span style="color: #800080"&gt;$ret</span><span style="color: #000000"&gt;;
}

}

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

= = ->Lock('cachelock'(! "cachelock is lock" </span><span style="color: #008000"&gt;/*</span><span style="color: #008000"&gt; 热点代码 写在这里 </span><span style="color: #008000"&gt;*/</span> <span style="color: #800080"&gt;$lockobj</span>->unLock('cachelock'<span style="color: #000000"&gt;);

}

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读