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中常用的转义函数
Feb 28 PHP
又一个PHP实现的冒泡排序算法分享
Aug 21 PHP
php检测apache mod_rewrite模块是否安装的方法
Mar 14 PHP
php实现的通用图片处理类
Mar 24 PHP
Laravel实现构造函数自动依赖注入的方法
Mar 16 PHP
Yii遍历行下每列数据的方法
Oct 17 PHP
PHP的自定义模板引擎
Mar 24 PHP
thinkPHP框架中执行原生SQL语句的方法
Oct 25 PHP
laravel 验证错误信息到 blade模板的方法
Sep 29 PHP
PHP 加密 Password Hashing API基础知识点
Mar 02 PHP
php将字符串转换为数组实例讲解
May 05 PHP
PHP实现简单注册登录系统
Dec 28 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桌面中心(四) 数据显示
2007/03/11 PHP
php 中文处理函数集合
2008/08/27 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
2010/09/10 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
CI框架入门之MVC简单示例
2016/11/21 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
2018/05/21 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
静态的动态续篇之来点XML
2006/12/23 Javascript
学习YUI.Ext第七日-View&amp;JSONView Part Two-一个画室网站的案例
2007/03/10 Javascript
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
Javascript中获取对象的原型对象的方法小结
2015/02/25 Javascript
JS中数组重排序方法
2016/11/11 Javascript
简单实现js选项卡切换效果
2017/02/09 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
微信小程序仿通讯录功能
2020/04/09 Javascript
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
[10:39]DOTA2上海特级锦标赛音乐会纪录片
2016/03/21 DOTA
python查找第k小元素代码分享
2013/12/18 Python
python使用pyhook监控键盘并实现切换歌曲的功能
2014/07/18 Python
python中如何使用正则表达式的非贪婪模式示例
2017/10/09 Python
flask框架中勾子函数的使用详解
2018/08/01 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
Python异常的检测和处理方法
2018/10/26 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
python3中rank函数的用法
2019/11/27 Python
CSS3弹性盒模型开发笔记(一)
2016/04/26 HTML / CSS
Html5无刷新修改browser Url的方法
2014/01/15 HTML / CSS
乌克兰第一的珠宝网上商店:Gold.ua
2019/11/29 全球购物
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
纪律教育月活动总结
2014/08/26 职场文书
2014年教师党员自我评议
2014/09/19 职场文书
老龙头导游词
2015/02/11 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书