memcached缓存失效时的高并发访问问题解决
memcached一般用于在访问一些性能相对低下的数据接口时(如数据库),为了保证这些数据接口的稳定性,加上memcached以减少访问次数,保证这些数据接口的健壮性。一般memcached的数据都是定时失效的,当数据失效时一般会再次去访问取数据接口,然后将其更新至memcached中。这时就会有一个问题,当某个数据失效时,恰好同时有大量的客户端访问该数据,这时这些客户端都会发现该数据失效,然后都会去调用数据接口去取数据更新,这自然就瞬间地使数据接口失去了memcached的保护,有可能造成系统的故障。
那么如何解决这个问题呢?
第一种:数据不失效,定时更新。即数据存放在memcached中永不失效,但是会有一个定时任务,定时的去更新这个数据。
第二种:既然该问题的症结在于在数据失效时,会有多个客户端去调用数据接口,那么只要想办法在数据失效时只有一个客户端能访问数据接口即可,要做到这点,自然的想法是加锁:如下:
- object value = memcached.get(key);
- if(null==value){
- synchronized{
- value = memcached.get(key);
- if(null==value){
- value = db.get(key);
- memcached.set(key,value);
- }
- }
- }
- return value;
这样做的前提是你必须保证这个函数的类是单例的,显然在服务器集群中不可能有这样的场景,那么如果在群集间加锁呢?解铃还需系铃人,既然大家共用一个memcached服务器,那么就使用memcached来实现这个锁机制。即当客户端取不到数据时,先在memcached中设置一个flag表明当前客户端在更新该数据,当其它客户端也来访问时发现失效后就等待直到更新好数据为目。
- object value = memcahced.get(key);
- if(null=value){
- if(memcached.add(key)){
- value = db.get();
- memcached.set(key,value);
- }else{
- while(true){
- Thread.sleep(50);
- value=memcached.get(key);
- if(null!=value){
- break;
- }
- }
- }
- }
- return value;
memcached中的add方法是实现该功能的关键,该方法是判断memcached中是否有某个key存在,如果存在则返回false,否则返回true,并添加该key值,如果没有该方法,显然我们只能再一次的通过get 和set去设置该值,显然这样做是线程不安全的,有可能有多个客户端同时取为空,同时去取数据并更新。
上述的方法存在的缺陷时,一旦数据失效,所有客户端要等待某个客户端更新完毕,这样势必增加服务器压力,可以通过在key失效之间的一段时间就触发更新的方式来解决这个问题。
memcached缓存失效时的高并发访问问题解决相关推荐
- linux memcached 缓存失效,高并发访问下避免对象缓存失效引发Dogpile效应
使用"锁" 除了使用独立的更新进程之外,我们也可以通过加"锁",每次只允许一个客户端请求去更新缓存,以避免Dogpile效应. 处理过程大概是这样的: A请求的 ...
- [转]高并发访问下避免对象缓存失效引发Dogpile效应
避免Redis/Memcached缓存失效引发Dogpile效应 Redis/Memcached高并发访问下的缓存失效时可能产生Dogpile效应(Cache Stampede效应). 推荐阅读:高并 ...
- 视频直播系统开发:如何应对高并发访问?
视频直播开发的挑战 随着移动互联网的快速普及,视频直播已经成为了新的社交媒体形式,也成为了一种新的商业模式.现在,越来越多的人开始使用视频直播来展示自己的生活和工作,同时,越来越多的企业开始将视频直播 ...
- 如何才能做到网站高并发访问?
原文:http://oldboy.blog.51cto.com/2561410/615721 如何才能做到网站高并发访问?--之我荐--老男孩 ############################ ...
- 实现网站的高并发访问
高并发访问的核心原则其实就一句话"把所有的用户访问请求都尽量往前推". 如果把来访用户比作来犯的"敌人",我们一定要把他们挡在800里地以外,即不能让他们的 ...
- 蚂蚁围炉夜话回顾:从容应对数据高并发访问和一致性的挑战
云原生(Cloud-Native)到底是什么?这个问题一直很难定义.CNCF技术监督委员会最近通过投票确定了其官方定义.如何使其弹性可扩展.稳定高可用.敏捷易维护等特性应用到现有创新场景? 蚂蚁金服在 ...
- 面试官:为什么单线程的Redis可以实现高并发访问
背景 上回说到小枫在接受面试官的拷打,所幸第一个问题回答的还不错,因此面试官对于小枫的初步印象还行.我们接着来看看小枫是怎么和面试官继续过招的吧,他还能扛得住面试官几个连环炮呢? 面试官考察目的分析 ...
- 大规模集群下Hadoop NameNode如何承载每秒上千次的高并发访问
目录 一.问题源起 二.HDFS优雅的解决方案 (1)分段加锁机制 + 内存双缓冲机制 (2)多线程并发吞吐量的百倍优化 (3)缓冲数据批量刷磁盘 + 网络的优化 四.总结 五.参考文章 一.问题源起 ...
- ci mysql高并发_高并发访问mysql时的问题(一):库存超减
标签: 如果在对某行记录的更新时不采取任何防范措施,在多线程访问时,就容易出现库存为负数的错误. 以下用php.mysql,apache ab工具举例说明: mysql表结构 CREATE TABLE ...
最新文章
- CheXNet 肺炎
- free pascal 修改字符集,会导致 dos 不能显示 汉字。 处理方法如下
- RabbitMQ下的生产消费者模式与订阅发布模式
- Python之——遇到的小知识点总结
- java中XPATH操作xml,非常便捷
- [leetcode]LRU Cache
- ajax传值controller怎么写,关于ajax请求Controller传值问题详细记录
- 彻底明白ip地址,区分localhost、127.0.0.1和0.0.0.0
- 编译 php7,编译PHP7
- 纯前端控件集 WijmoJS 2018V2发布,提供可视化设计器,在React、Vue和Angular中的更易用...
- Java web 实战项目案例
- 金九银十BAT互联网企业涨薪必备知识点:Jvm性能调优实战
- unity3d api 中文文档_官方文档
- Oracle集群时间同步
- Python实现简单命令行版《中国象棋》不使用第三方库
- 矩阵与拼接屏如何连接之方案详解
- 计算机类专业及行业认识,我对于计算机行业的看法
- 平板示波器如何进行探头的补偿和衰减系数设定-Pintech品致
- 像向日葵一样活着——想起了从幼稚园到现在的同桌们
- echarts 地图自定义图标_Echarts3.0 地图自定义图标
热门文章
- winForm调用HTTP短信接口
- MySQL中MyISAM引擎与InnoDB引擎性能简单测试
- 前端面试题学习和总结
- java内部类和静态内部类的区别
- Struts2 分割字符串标签s:generator
- 中国铁建内网漫游沦陷多个重要部门泄漏大量信息(redis+ssh-keygen免认证登录案例)...
- 【结果很简单,过程很艰辛】记阿里云Ons消息队列服务.NET接口填坑过程
- 三种方法让信息在局域网中自由散发
- 朱晔的互联网架构实践心得S1E6:给飞机换引擎和安全意识十原则
- ASP.NET 中HttpRuntime.Cache缓存数据