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 相关文章推荐
给多个地址发邮件的类
Oct 09 PHP
php 运行效率总结(提示程序速度)
Nov 26 PHP
简单的移动设备检测PHP脚本代码
Feb 19 PHP
php学习笔记(三)操作符与控制结构
Aug 06 PHP
PHP用strstr()函数阻止垃圾评论(通过判断a标记)
Sep 28 PHP
php下载excel无法打开的解决方法
Dec 24 PHP
ThinkPHP后台首页index使用frameset时的注意事项分析
Aug 22 PHP
ThinkPHP中使用ajax接收json数据的方法
Dec 18 PHP
php轻量级的性能分析工具xhprof的安装使用
Aug 12 PHP
php脚本运行时的超时机制详解
Feb 17 PHP
PHP模拟http请求的方法详解
Nov 09 PHP
php实现推荐功能的简单实例
Sep 29 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与SQL注入攻击[一]
2007/04/17 PHP
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
初学PHP的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
PHP实现的文件上传类与用法详解
2017/07/05 PHP
JSQL 批量图片切换的实现代码
2010/05/05 Javascript
封装了一个js图片轮换效果的函数
2011/09/28 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
js判断文本框输入的内容是否为数字
2015/12/23 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
2016/06/27 Javascript
jQuery实现可拖拽3D万花筒旋转特效
2017/01/03 Javascript
JavaScript组件开发之输入框加候选框
2017/03/10 Javascript
微信小程序 功能函数小结(手机号验证*、密码验证*、获取验证码*)
2017/12/08 Javascript
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
2019/08/23 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
vscode中Vue别名路径提示的实现
2020/07/31 Javascript
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
2020/01/08 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
2020/02/29 Python
值得收藏的HTML5资源(学习html5的朋友可以收藏下)
2010/07/20 HTML / CSS
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
艺术用品:Arteza
2018/11/25 全球购物
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
学校办公室主任职责
2013/12/27 职场文书
理想演讲稿范文
2014/05/21 职场文书
幼儿园运动会口号
2014/06/07 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
刑事附带民事诉讼答辩状
2015/05/22 职场文书
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏