|
memcache中Memcache::add()方法在缓存服务器之前不存在时, 以作为key存储一个变量到缓存服务器。我们使用add来向服务器添加一个键值对应,如果成功则添加,否则说明存在另一个并发作业在进行操作。通过add的原子性来判断是否要执行热点代码。具体代码需结合上一篇的php使用memcache。使用该方法控制并发需要
KEY_PREFIX = '_lock' </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">function</span><span style="color: #000000"> __construct(){
</span><span style="color: #800080">$this</span>->mc = <span style="color: #0000ff">new</span> dlufMemcache('127.0.0.1',11211<span style="color: #000000">);
}
</span><span style="color: #008000">/*</span><span style="color: #008000">*
* 进行锁操作
* @param [type] $lock_id
* @param integer $expire
</span><span style="color: #008000">*/</span>
<span style="color: #0000ff">public</span> <span style="color: #0000ff">function</span> Lock(<span style="color: #800080">$lock_id</span>,<span style="color: #800080">$expire</span>=5<span style="color: #000000">){
</span><span style="color: #800080">$mkey</span> = self::KEY_PREFIX.<span style="color: #800080">$lock_id</span><span style="color: #000000">;
</span><span style="color: #0000ff">for</span>(<span style="color: #800080">$i</span> = 0; <span style="color: #800080">$i</span> < 10; <span style="color: #800080">$i</span>++<span style="color: #000000">){
</span><span style="color: #800080">$flag</span> = <span style="color: #0000ff">false</span><span style="color: #000000">;
</span><span style="color: #0000ff">try</span><span style="color: #000000">{
</span><span style="color: #800080">$flag</span> = <span style="color: #800080">$this</span>->mc->add(<span style="color: #800080">$mkey</span>,'1',<span style="color: #800080">$expire</span><span style="color: #000000">);
}</span><span style="color: #0000ff">catch</span>(<span style="color: #0000ff">Exception</span> <span style="color: #800080">$e</span><span style="color: #000000">){
</span><span style="color: #800080">$flag</span> = <span style="color: #0000ff">false</span><span style="color: #000000">;
</span><span style="color: #008000">//</span><span style="color: #008000">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">/*</span><span style="color: #008000">*
* 判断锁状态
* @param [type] $lock_id
* @return boolean
</span><span style="color: #008000">*/</span>
<span style="color: #0000ff">public</span> <span style="color: #0000ff">function</span> isLock(<span style="color: #800080">$lock_id</span><span style="color: #000000">){
</span><span style="color: #800080">$mkey</span> = self::KEY_PREFIX.<span style="color: #800080">$lock_id</span><span style="color: #000000">;
</span><span style="color: #800080">$ret</span> = <span style="color: #800080">$this</span>->mc->get(<span style="color: #800080">$mkey</span><span style="color: #000000">);
</span><span style="color: #0000ff">if</span>(<span style="color: #0000ff">empty</span>(<span style="color: #800080">$ret</span>) || <span style="color: #800080">$ret</span> === <span style="color: #0000ff">false</span><span style="color: #000000">){
</span><span style="color: #0000ff">return</span> <span style="color: #0000ff">false</span><span style="color: #000000">;
}
</span><span style="color: #0000ff">return</span> <span style="color: #0000ff">true</span><span style="color: #000000">;
}
</span><span style="color: #008000">/*</span><span style="color: #008000">*
* 解锁
* @param [type] $lock_id
* @return [type]
</span><span style="color: #008000">*/</span>
<span style="color: #0000ff">public</span> <span style="color: #0000ff">function</span> unLock(<span style="color: #800080">$lock_id</span><span style="color: #000000">){
</span><span style="color: #800080">$mkey</span> = self::KEY_PREFIX.<span style="color: #800080">$lock_id</span><span style="color: #000000">;
</span><span style="color: #800080">$ret</span> = <span style="color: #800080">$this</span>->mc->delete(<span style="color: #800080">$mkey</span><span style="color: #000000">);
</span><span style="color: #0000ff">return</span> <span style="color: #800080">$ret</span><span style="color: #000000">;
}
}
然后使用cacheLock进行并发热点代码控制
= = ->Lock('cachelock'(! "cachelock is lock" </span><span style="color: #008000">/*</span><span style="color: #008000"> 热点代码 写在这里
</span><span style="color: #008000">*/</span>
<span style="color: #800080">$lockobj</span>->unLock('cachelock'<span style="color: #000000">);
} (编辑:安卓应用网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|