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


Posted in PHP onFebruary 27, 2016

缓存命名空间

memcache本身不支持命名空间,但是我们可以利用 memcache本身的机制,来模拟命名空间。比如:你要清除一组数据,就需要用到命名空间,来看这样一个例子,说明写在了注释里:

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';
  // 根据命名空间生成唯一的key
  $my_key = "foo_".$ns_key.'_'.md5($otherParms);
   
  // 获取当前key下的缓存
  $val = $mc_wr->get($my_key);
  if (!$val) {
   $value = 'wangdekang_'.time();
   // 缓存不存在则设置缓存 600秒, 0为随机失效时间, 为失效时间添加随机秒数,防止瞬间所有缓存同时失效
   $mc_wr->set($my_key,$value,600, 0);
  }
   
  echo $val;
 }
  
 public function clear_ns()
 {
  global $mc_wr;
  // 更新命名空间值,让当前命名空间的所有值失效, memcache自身的缓存失效机制,当缓存不在被访问,会通过LRU失效机制
  $mc_wr->set('foo_namespace_key', time());
 }
}

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

方法一
在load db之前先add一个mutex key, mutex key add成功之后再去做加载db, 如果add失败则sleep之后重试读取原cache数据。为了防止死锁,mutex key也需要设置过期时间。伪代码如下

if (memcache.get(key) == null) {
 // 3 min timeout to avoid mutex holder crash
 if (memcache.add(key_mutex, 3 * 60 * 1000) == true) {
  value = db.get(key);
  memcache.set(key, value);
  memcache.delete(key_mutex);
 } else {
  sleep(50);
  retry();
 }
}

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

v = memcache.get(key);
if (v == null) {
 if (memcache.add(key_mutex, 3 * 60 * 1000) == true) {
  value = db.get(key);
  memcache.set(key, value);
  memcache.delete(key_mutex);
 } else {
  sleep(50);
  retry();
 }
} else {
 if (v.timeout <= 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&amp;java(二)
Oct 09 PHP
关于时间计算的结总
Dec 06 PHP
优化使用mysql存储session的php代码
Jan 10 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
Sep 13 PHP
php实现批量压缩图片文件大小的脚本
Jul 04 PHP
使用PHP实现生成HTML静态页面
Nov 18 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
Jul 21 PHP
php接口技术实例详解
Dec 07 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
Jan 15 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
May 24 PHP
PHP 判断字符串是中文还是英文, 或者是中英混合
Mar 09 PHP
简单谈谈PHP中strlen 函数
Feb 27 #PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
Feb 26 #PHP
PHP文件缓存smarty模板应用实例分析
Feb 26 #PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
Feb 26 #PHP
PHP实现根据时间戳获取周几的方法
Feb 26 #PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
Feb 26 #PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
Feb 26 #PHP
You might like
如何运行/调试你的PHP代码
2020/10/23 PHP
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
JS 精确统计网站访问量的实例代码
2013/07/05 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
JavaScript将数据转换成整数的方法
2014/01/04 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
JavaScript动态添加事件之事件委托
2016/07/12 Javascript
自定义require函数让浏览器按需加载Js文件
2016/11/24 Javascript
layer实现弹窗提交信息
2016/12/12 Javascript
ionic中列表项增加和删除的实现方法
2017/01/22 Javascript
jquery实现input框获取焦点的简单实例
2017/01/26 Javascript
jquery在vue脚手架中的使用方式示例
2017/08/29 jQuery
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
webpack的CSS加载器的使用
2018/09/11 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
Vue3 源码导读(推荐)
2019/10/14 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
在Python中使用异步Socket编程性能测试
2014/06/25 Python
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
python创建列表和向列表添加元素的实现方法
2017/12/25 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
2018/05/18 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
python 自动去除空行的实例
2018/07/24 Python
Python正则表达式指南 推荐
2018/10/09 Python
pandas分区间,算频率的实例
2019/07/04 Python
Python基于staticmethod装饰器标示静态方法
2020/10/17 Python
python3中TQDM库安装及使用详解
2020/11/18 Python
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
会计专业推荐信
2013/10/29 职场文书
天猫某品牌专卖店运营计划书
2014/03/21 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
2015年班主任德育工作总结
2015/05/21 职场文书
卫生主题班会
2015/08/14 职场文书
Python的三个重要函数详解
2022/01/18 Python
Python 绘制多因子柱状图
2022/05/11 Python