2019独角兽企业重金招聘Python工程师标准>>>

周六的S2 Web 2.0技术沙龙上介绍了memcache中使用mutex场景(文后要演讲稿),有网友对详情感兴趣,简单介绍如下。

场景

Mutex主要用于有大量并发访问并存在cache过期的场合,如

  • 首页top 10, 由数据库加载到memcache缓存n分钟
  • 微博中名人的content cache, 一旦不存在会大量请求不能命中并加载数据库
  • 需要执行多个IO操作生成的数据存在cache中, 比如查询db多次

问题

在大并发的场合,当cache失效时,大量并发同时取不到cache,会同一瞬间去访问db并回设cache,可能会给系统带来潜在的超负荷风险。我们曾经在线上系统出现过类似故障

解决方法

方法一
在load db之前先add一个mutex key, mutex key add成功之后再去做加载db, 如果add失败则sleep之后重试读取原cache数据。为了防止死锁,mutex key也需要设置过期时间。伪代码如下
(注:下文伪代码仅供了解思路,可能存在bug,欢迎随时指出。)

if (memcache.get(key) == null) {// 3 min timeout to avoid mutex holder crashif (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 threadsv.timeout += 3 * 60 * 1000;memcache.set(key, v, KEY_TIMEOUT * 2);// load the latest value from dbv = db.get(key);v.timeout = KEY_TIMEOUT;memcache.set(key, value, KEY_TIMEOUT * 2);memcache.delete(key_mutex);} else {sleep(50);retry();}}
}

相对于方案一
优点:避免cache失效时刻大量请求获取不到mutex并进行sleep
缺点:代码复杂性增大,因此一般场合用方案一也已经足够。

方案二在Memcached FAQ中也有详细介绍 How to prevent clobbering updates, stampeding requests,并且Brad还介绍了用他另外一个得意的工具 Gearman 来实现单实例设置cache的方法,见 Cache miss stampedes,不过用Gearman来解决就感觉就有点奇技淫巧了。

转载于:https://my.oschina.net/bankofchina/blog/779237

Memcache mutex设计模式相关推荐

  1. [转]Memcache mutex设计模式

    原文链接:http://timyang.net/programming/memcache-mutex/ 场景 Mutex主要用于有大量并发访问并存在cache过期的场合,如 首页top 10, 由数据 ...

  2. Web开发基本准则-55实录-缓存策略(转)

    原文地址:http://www.cnblogs.com/zhengyun_ustc/p/rule2.html 续上篇<Web开发基本准则-55实录-Web访问安全>. Web开发基本准则- ...

  3. 2010-12-8 学习总结

    IDU(埃迪优)世界设计联盟联合业务中心 http://www.jbcidu.com/index 几种特殊的类型设计 http://www.cnblogs.com/Ivony/archive/2009 ...

  4. 应届生应聘java需要掌握的技能

    一般要求 java基础.spring全家桶.分布式.服务器.中间件.数据库oracle. 框架:spring.springMVC.mybatis.springBoot.SpringData. 消息中间 ...

  5. 设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类

    1 单例模式简单介绍 单例模式是一种经常使用的软件设计模式. 在它的核心结构中仅仅包括一个被称为单例类的特殊类. 通过单例模式能够保证系统中一个类仅仅有一个实例并且该实例易于外界訪问.从而方便对实例个 ...

  6. php设计是什么意思,php的设计模式是什么

    设计模式 单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法.(php视频教程) 单例模式$_instance必须声明为静态的私有变量 构造函数 ...

  7. 浅谈Laravel中的设计模式(四) Contract 契约模式

    阅读时长:3分钟 技术预备:熟悉Laravel的使用 契约模式(Contract) 一.首先什么是契约模式呢? 学过Java的童鞋一定知道interface.抽象类之类的概念. 主要就是为了具有相同操 ...

  8. 大话PHP设计模式:类自动载入、PSR-0规范、链式操作、11种面向对象设计模式实现和使用、OOP的基本原则和自动加载配置...

    一.类自动载入 SPL函数 (standard php librarys) 类自动载入,尽管 __autoload() 函数也能自动加载类和接口,但更建议使用 spl_autoload_registe ...

  9. 互联网高并发架构设计模式

    2019独角兽企业重金招聘Python工程师标准>>> 前言 随着互联网的快速发展,很多传统行业都开始将原有的产品互联网化移动化,这其中就涉及到对原有系统的改造,因为之前大部分时间都 ...

最新文章

  1. iview在ie9及以上的兼容问题解决方案
  2. 19_Android中图片处理原理篇,关于人脸识别网站,图片加载到内存,图片缩放,图片翻转倒置,网上撕衣服游戏案例编写...
  3. 百度地图API开发指南
  4. Fiori navigation list scroll down后自动发OData请求取数据
  5. html鼠标滑轮换图片,JavaScript实现鼠标滚轮控制页面图片切换
  6. fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC sha
  7. linux mv命令源码,linux命令学习(8):mv命令
  8. python post请求参数化,参数化包含JSON主体的python POST请求
  9. 百度编辑器Ueditor多文本域实现
  10. defer和async的区别
  11. 工作了17年,2021年双11是我见过有史以来“撸腾讯云羊毛”最狠的一次,血赚
  12. 应对个人信息保护法律合规,妥善管理个人隐私数据
  13. 机器认知、人机交互、边缘计算……在这里,他们谈论了关于AI的关键议题
  14. Android中的传感器之---光线传感器
  15. 用java写的游戏you_关于用Java写的贪吃蛇游戏的一些感想
  16. Selenium登录百度贴吧跳过图片验证的两种操作
  17. 计算机初级操作员试题汇编,计算机初级操作员试卷.doc
  18. 国家超级计算机 甘霖,国家超级计算无锡中心主任助理甘霖:让“中国超算”扬威世界...
  19. android 监测鼠标滑轮,android2.3 监控鼠标滑动事件
  20. Matlab R2015b+CUDA7.5+vs2013深度学习网络GPU搭建

热门文章

  1. 第三天学习Java的笔记(自增自减,赋值,比较,逻辑,三元)
  2. JavaWeb(六)——HttpServletResponse、HttpServletRequest
  3. element ui分页怎么做_element ui里面table分页,页数从0开始的怎么做?
  4. 计算机应用基础教案 马成荣,江苏省职业学校计算机应用基础(马成荣主编)课程两课评比教案:单元教学设计说明...
  5. mysql数据库扫描_使用nmap对mysql 数据库进行扫描
  6. 基于C++全局变量的声明与定义的详解
  7. linux服务器不能访问,无法在远程Linux服务器上访问tomcat
  8. linux关于文件夹的知识,Ubuntu 7.10 系统文件夹相关知识
  9. php 模板制作教程,Destoon模板制作简明教程_PHP教程
  10. rust(12)-闭包,闭包作为返回值,闭包作为参数