我们已经准备好了,你呢?

2026我们与您携手共赢,为您的企业形象保驾护航!

PHP在运用中如何模拟命名空间并处理缓存失效现象的应对方法php  /  系统维护者 刊登于 7年前   157

缓存命名空间

系统原生不提供命名空间功能,不过能借助固有体系来达成类似命名空间的效果,例如:当需要移除某批信息时,就必须借助命名空间,具体示范可参考注释部分所附案例。

class Action{   public function index() {  global $mc_wr;     // 获取指定标识  $ns_key = $mc_wr->get("foo_namespace_key");  // 若指定标识不存在,则创建该标识  if($ns_key===false) $mc_wr->set("foo_namespace_key",time());     $otherParms = 'select * from user LIMIT 1';  // 构造唯一键名  $my_key = "foo_".$ns_key.'_'.md5($otherParms);     // 查询当前键名对应的缓存值  $val = $mc_wr->get($my_key);  if (!$val) {   $value = 'wangdekang_'.time();   // 若缓存不存在,则设置缓存,有效期为600秒,随机秒数避免缓存集中过期   $mc_wr->set($my_key,$value,600, 0);  }     echo $val; }   public function clear_ns() {  global $mc_wr;  // 重置指定标识,使当前标识下所有缓存失效  $mc_wr->set('foo_namespace_key', time());}}

缓存失效问题

高并发环境下,若缓存失效,众多请求将无法从缓存中获取数据,于是会同时查询数据库并重新设置缓存,这种集中访问可能引发系统承载能力的潜在问题。

解决方法:

方法一

在载入数据库前需先设立一个互斥锁,互斥锁设立成功后才能执行数据库加载,若设立失败则稍作延迟后再次尝试获取原有缓存数据,为避免产生僵局,互斥锁必须设定超时时间,示例代码如下

当缓存获取键值结果为空时,若缓存添加互斥锁键值成功,则从数据库获取键值,将值存入缓存,并删除互斥锁键值,否则等待五十毫秒后重试

方法二

在value内部设置1个超时值(), 比实际的

体积不大。一旦从缓存中取得数据,发觉其已经失效,立刻进行更新并重新存入缓存。

后再从数据库加载数据并设置到cache中。伪代码如下

从缓存中获取值v,如果v为空,则尝试添加一个锁到缓存中,如果成功,从数据库中获取值,然后将其存入缓存,并删除锁,如果添加锁失败,则等待五十毫秒后重试,如果v不为空,则检查v的超时时间<= now()) {  if (memcache.add(key_mutex, 3 * 60 * 1000) == true) {   // extend the timeout for other threads   v.timeout += 3 * 60 * 1000;   memcache.set(key, v, KEY_TIMEOUT * 2);   // load the latest value from db   v = db.get(key);   v.timeout = KEY_TIMEOUT;   memcache.set(key, value, KEY_TIMEOUT * 2);   memcache.delete(key_mutex);  } else {   sleep(50);   retry();  } }}

二维码
扫一扫在手机端查看

本文链接:https://by928.com/12117.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线