Memcache时模拟命名空间及缓存失效问题的解决-阿里云开发者社区

开发者社区> 航空母舰> 正文

Memcache时模拟命名空间及缓存失效问题的解决

简介:
+关注继续查看

在用memcache , 不可否认,memcache 在实际应用中的表现非常出色。不过也许正是因为其对速度和性能的要求过于严格,导致 memcache 的可操作性不是那么强。PHP 在使用的时候,也只能有限的使用 add、delete、replace、flush 等几个简单的方法。

memcache 官方是不建议我们手动去删除缓冲内容的, 因为官方的 api 中有关删除的方法只有 delete 和flush,前者是在知道 key 的情况下删除一个对象的值,后面是清除服务器上所有对象。

不过很多情况下,我们需要从服务器上删除一部分对象,又不希望把整个服务器上的对象都清空,官方的 FAQ 上提供了一个“伪命名空间(Simulating Namespaces )” 的作法。

Java代码  收藏代码
  1. <?php  
  2. //生成一个用来保存 namespace 的 key  
  3. $ns_key = $memcache->get("product_namespace_key");  
  4.   
  5. //如果 key 不存在,则创建  
  6. if ($ns_key === false) $memcache->set("product_namespace_key", time());  
  7.   
  8. //根据 namespace_key 生成真正的 key  
  9. $my_key = $ns_key . md5($sql);  
  10. // 获取当前key下的缓存  
  11. $val = $memcache->get($my_key);  
  12. if (!$val) {  
  13.     $memcache->set($my_key, $dbValue, 600);  
  14. }  
  15. //需要删除整个namespace里的对象的时候,这样处理即可:  
  16. $memcache->increment("product_namespace_key");  
  17. ?>  

memcache缓存失效问题
在大并发的场合,当cache失效时,大量并发同时取不到cache,会同一瞬间去访问db并回设cache,可能会给系统带来潜在的超负荷风险。解决方法:

方法一 
在load db之前先add一个mutex key, mutex key add成功之后再去做加载db, 如果add失败则sleep之后重试读取原cache数据。为了防止死锁,mutex key也需要设置过期时间。伪代码如下
Java代码  收藏代码
  1. if (memcache.get(key) == null) {  
  2.     // 3 min timeout to avoid mutex holder crash  
  3.     if (memcache.add(key_mutex, 3 * 60 * 1000) == true) {  
  4.         value = db.get(key);  
  5.         memcache.set(key, value);  
  6.         memcache.delete(key_mutex);  
  7.     } else {  
  8.         sleep(50);  
  9.         retry();  
  10.     }  
  11. }  

方法二 
在value内部设置1个超时值(timeout1), timeout1比实际的memcache timeout(timeout2)小。当从cache读取到timeout1发现它已经过期时候,马上延长timeout1并重新设置到cache。然后再从数据库加载数据并设置到cache中。伪代码如下

Java代码  收藏代码
  1. v = memcache.get(key);  
  2. if (v == null) { //不存在  
  3.     if (memcache.add(key_mutex, 3 * 60 * 1000) == true) {  
  4.         value = db.get(key);  
  5.         memcache.set(key, value);  
  6.         memcache.delete(key_mutex);  
  7.     } else {  
  8.         sleep(50);  
  9.         retry();  
  10.     }  
  11. else {  
  12.     if (v.timeout <= now()) {  //过期  
  13.         if (memcache.add(key_mutex, 3 * 60 * 1000) == true) {  
  14.             // extend the timeout for other threads  
  15.             v.timeout += 3 * 60 * 1000;  
  16.             memcache.set(key, v, KEY_TIMEOUT * 2);  
  17.   
  18.             // load the latest value from db  
  19.             v = db.get(key);  
  20.             v.timeout = KEY_TIMEOUT;  
  21.             memcache.set(key, value, KEY_TIMEOUT * 2);  
  22.             memcache.delete(key_mutex);  
  23.         } else {  
  24.             sleep(50);  
  25.             retry();  
  26.         }  
  27.     }  
  28. }  

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
iOS网络编程之六——数据缓存类NSURLCache使用解析
iOS网络编程之六——数据缓存类NSURLCache使用解析
8 0
带你了解Go怎样实现二级缓存
带你了解Go怎样实现二级缓存
77 0
IE浏览器下ajax缓存导致数据不更新的解决方法
摘自:http://www.iefans.net/ie-ajax-json-shuju-huancun/ 最近做设计的时候遇到一个小问题,当你用jquery的getjson函数从后台获取数据的时候,IE浏览器会自动设置缓存,如果此时你对数据进行修改的时候刷新页面,IE并不会在页面显示你修改后的数据,因为你刷新的时候IE浏览器会查找缓存并显示你修改前的数据,最后在网上查了些资料终于解决了IE浏览器下的问题。
1015 0
4.windows和Linux下创建oracle用户名表空间,表,插入数据,用户管理表等操作
进入超级管理员,执行以下命令 Window下创建数据库,表空间,用户,插入数据等操作 -- 01 创建表空间 -- 注意表空间的路径 根据实际安装环境进行调整 CREATE TABLESPACE ts_myscott     LOGGING     DATAFI
1139 0
c++ 静态类成员函数(static member function) vs 名字空间 (namespace)
好多人喜欢把工具函数做成static member function。这样以增加隐蔽性和封装性,由其是从C#,java转而使用c++的开发人员。 例如: class my_math { public: static UINT Hash_XYZ(float x,float ...
555 0
一个由mobx observer引发的React Route路由失效问题探究
## 1. 问题描述 最近一直在使用React + React Router(v4.1.1) + Mobx做项目开发,相比繁琐的React + React Rotuer + Redux方案,爽的不要不要的,当然前提你得忍受Object.defineProperty拦截getter/setter带来的各种黑魔法问题。咳咳,这里不是Mobx大战Redux,就此打住。想了解的人可以去看一下女神Pree
4506 0
带你了解CDN缓存加速的工作原理.
从事关于网络安全防护的这份事业中,会遇见用户提出的各种问题。比如说家里的电脑和手机被监听怎么解决?网站打不开怎么解决?网站被DDoS攻击,服务器被拉入黑洞了,怎么快速解决?域名怎么防封?还有CDN缓存加速是什么?是通过什么样的原理运行的呢等等?今天墨者安全主要分享下CDN缓存加速的工作原理。
1151 0
+关注
514
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载