memcached一般用于在访问一些性能相对低下的数据接口时(如数据库),为了保证这些数据接口的稳定性,加上memcached以减少访问次数,保证这些数据接口的健壮性。一般memcached的数据都是定时失效的,当数据失效时一般会再次去访问取数据接口,然后将其更新至memcached中。这时就会有一个问题,当某个数据失效时,恰好同时有大量的客户端访问该数据,这时这些客户端都会发现该数据失效,然后都会去调用数据接口去取数据更新,这自然就瞬间地使数据接口失去了memcached的保护,有可能造成系统的故障。

那么如何解决这个问题呢?

第一种:数据不失效,定时更新。即数据存放在memcached中永不失效,但是会有一个定时任务,定时的去更新这个数据。

第二种:既然该问题的症结在于在数据失效时,会有多个客户端去调用数据接口,那么只要想办法在数据失效时只有一个客户端能访问数据接口即可,要做到这点,自然的想法是加锁:如下:

[java] view plaincopyprint?
  1. object value = memcached.get(key);
  2. if(null==value){
  3. synchronized{
  4. value = memcached.get(key);
  5. if(null==value){
  6. value = db.get(key);
  7. memcached.set(key,value);
  8. }
  9. }
  10. }
  11. return value;

这样做的前提是你必须保证这个函数的类是单例的,显然在服务器集群中不可能有这样的场景,那么如果在群集间加锁呢?解铃还需系铃人,既然大家共用一个memcached服务器,那么就使用memcached来实现这个锁机制。即当客户端取不到数据时,先在memcached中设置一个flag表明当前客户端在更新该数据,当其它客户端也来访问时发现失效后就等待直到更新好数据为目。

[java] view plaincopyprint?
  1. object value = memcahced.get(key);
  2. if(null=value){
  3. if(memcached.add(key)){
  4. value = db.get();
  5. memcached.set(key,value);
  6. }else{
  7. while(true){
  8. Thread.sleep(50);
  9. value=memcached.get(key);
  10. if(null!=value){
  11. break;
  12. }
  13. }
  14. }
  15. }
  16. return value;

memcached中的add方法是实现该功能的关键,该方法是判断memcached中是否有某个key存在,如果存在则返回false,否则返回true,并添加该key值,如果没有该方法,显然我们只能再一次的通过get 和set去设置该值,显然这样做是线程不安全的,有可能有多个客户端同时取为空,同时去取数据并更新。

上述的方法存在的缺陷时,一旦数据失效,所有客户端要等待某个客户端更新完毕,这样势必增加服务器压力,可以通过在key失效之间的一段时间就触发更新的方式来解决这个问题。

memcached缓存失效时的高并发访问问题解决相关推荐

  1. linux memcached 缓存失效,高并发访问下避免对象缓存失效引发Dogpile效应

    使用"锁" 除了使用独立的更新进程之外,我们也可以通过加"锁",每次只允许一个客户端请求去更新缓存,以避免Dogpile效应. 处理过程大概是这样的: A请求的 ...

  2. [转]高并发访问下避免对象缓存失效引发Dogpile效应

    避免Redis/Memcached缓存失效引发Dogpile效应 Redis/Memcached高并发访问下的缓存失效时可能产生Dogpile效应(Cache Stampede效应). 推荐阅读:高并 ...

  3. 视频直播系统开发:如何应对高并发访问?

    视频直播开发的挑战 随着移动互联网的快速普及,视频直播已经成为了新的社交媒体形式,也成为了一种新的商业模式.现在,越来越多的人开始使用视频直播来展示自己的生活和工作,同时,越来越多的企业开始将视频直播 ...

  4. 如何才能做到网站高并发访问?

    原文:http://oldboy.blog.51cto.com/2561410/615721 如何才能做到网站高并发访问?--之我荐--老男孩 ############################ ...

  5. 实现网站的高并发访问

      高并发访问的核心原则其实就一句话"把所有的用户访问请求都尽量往前推". 如果把来访用户比作来犯的"敌人",我们一定要把他们挡在800里地以外,即不能让他们的 ...

  6. 蚂蚁围炉夜话回顾:从容应对数据高并发访问和一致性的挑战

    云原生(Cloud-Native)到底是什么?这个问题一直很难定义.CNCF技术监督委员会最近通过投票确定了其官方定义.如何使其弹性可扩展.稳定高可用.敏捷易维护等特性应用到现有创新场景? 蚂蚁金服在 ...

  7. 面试官:为什么单线程的Redis可以实现高并发访问

    背景 上回说到小枫在接受面试官的拷打,所幸第一个问题回答的还不错,因此面试官对于小枫的初步印象还行.我们接着来看看小枫是怎么和面试官继续过招的吧,他还能扛得住面试官几个连环炮呢? 面试官考察目的分析 ...

  8. 大规模集群下Hadoop NameNode如何承载每秒上千次的高并发访问

    目录 一.问题源起 二.HDFS优雅的解决方案 (1)分段加锁机制 + 内存双缓冲机制 (2)多线程并发吞吐量的百倍优化 (3)缓冲数据批量刷磁盘 + 网络的优化 四.总结 五.参考文章 一.问题源起 ...

  9. ci mysql高并发_高并发访问mysql时的问题(一):库存超减

    标签: 如果在对某行记录的更新时不采取任何防范措施,在多线程访问时,就容易出现库存为负数的错误. 以下用php.mysql,apache ab工具举例说明: mysql表结构 CREATE TABLE ...

最新文章

  1. CheXNet 肺炎
  2. free pascal 修改字符集,会导致 dos 不能显示 汉字。 处理方法如下
  3. RabbitMQ下的生产消费者模式与订阅发布模式
  4. Python之——遇到的小知识点总结
  5. java中XPATH操作xml,非常便捷
  6. [leetcode]LRU Cache
  7. ajax传值controller怎么写,关于ajax请求Controller传值问题详细记录
  8. 彻底明白ip地址,区分localhost、127.0.0.1和0.0.0.0
  9. 编译 php7,编译PHP7
  10. 纯前端控件集 WijmoJS 2018V2发布,提供可视化设计器,在React、Vue和Angular中的更易用...
  11. Java web 实战项目案例
  12. 金九银十BAT互联网企业涨薪必备知识点:Jvm性能调优实战
  13. unity3d api 中文文档_官方文档
  14. Oracle集群时间同步
  15. Python实现简单命令行版《中国象棋》不使用第三方库
  16. 矩阵与拼接屏如何连接之方案详解
  17. 计算机类专业及行业认识,我对于计算机行业的看法
  18. 平板示波器如何进行探头的补偿和衰减系数设定-Pintech品致
  19. 像向日葵一样活着——想起了从幼稚园到现在的同桌们
  20. echarts 地图自定义图标_Echarts3.0 地图自定义图标

热门文章

  1. winForm调用HTTP短信接口
  2. MySQL中MyISAM引擎与InnoDB引擎性能简单测试
  3. 前端面试题学习和总结
  4. java内部类和静态内部类的区别
  5. Struts2 分割字符串标签s:generator
  6. 中国铁建内网漫游沦陷多个重要部门泄漏大量信息(redis+ssh-keygen免认证登录案例)...
  7. 【结果很简单,过程很艰辛】记阿里云Ons消息队列服务.NET接口填坑过程
  8. 三种方法让信息在局域网中自由散发
  9. 朱晔的互联网架构实践心得S1E6:给飞机换引擎和安全意识十原则
  10. ASP.NET 中HttpRuntime.Cache缓存数据