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(); } }}
扫一扫在手机端查看
- 上一篇:PHP命名空间自动加载机制_深入理解PHP的命名空间与自动加载机制
- 下一篇:浏览器刷新时间_3. 用requestAnimationFrame和cancelAnimationFrame方法写一个小物块运动
本文链接:https://by928.com/12117.html 转载请注明出处和本文链接!请遵守
《网站协议》
!
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。


客服1