[文章作者:孙立 链接:http://www.cnblogs.com/sunli/ 更新时间:2010-09-06

记得在去年,一个应用有个比较消耗资源的后端查询,使用memcached做了一层缓存,缓存时间30分钟(按业务需求来讲,更长点也没关系),按理说,应该完全没有任何问题了,但是出现了一个奇怪的问题,就是在高峰期重启memcached后,会导致大量的后端查询,出现后端服务不过来的情况。这点倒是可以理解。但是在正常运行过程中,随着访问的增加,查询也是一阵阵的访问数据库,形成一个波浪式的访问。

还记得在08年刚来公司的时候,有一个tomcat下的java应用,缓存是构建在jvm内部的(事实上,很多java应用的缓存都是构建在jvm内部的,因为简单,效率非常高),随着业务量的增加,支撑不了访问量,频繁宕机,宕机重启tomcat是个很大的问题,根本没发直接启动,启动后几秒就又会宕掉,只能把流量在nginx上挡开,让tomcat启动起来了,等待内部缓存建立,大概会需要10-20分钟,再上线服务。

上面的两个问题都是缓存在同一时间过期造成的。比如应用的某个功能的数据,在缓存的时候都设置成缓存30分钟,那么在cache重启后,将同时产生大量的后端查询来重建缓存,大量的数据都被设置在30分钟过期,30分钟过后,又几乎同时需要对后端进行查询来重构失效后的缓存,这无形对数据库造成了一些不必要的风险。如下图

图一:cache 同时过期的波浪式穿透db

解决办法:

在一个比较大的应用中,cache尽量使用服务的形式,跟web应用进行隔离开来,避免应用重启导致重建cache对后端的冲击。(其实这样能提高多个web下面的缓存利用率)

cache服务尽量使用多个,避免一个宕机重建全部cache对后端的冲击。多个cache服务尽量使用一致性hash的模式。

cache同时过期的问题,比如是30秒过期,可以找个业务可以接收的范围,比如25-40秒之间随机一个过期时间,可以减少同时过期的概率。

可以考虑使用多级cache。

事实上,在设计系统的时候,就需要考虑cache如果失效对系统产生的可能冲击影响,以及如何去避免这些问题的发生。重启系统可以考虑一个缓存预热的过程。

转载于:https://www.cnblogs.com/sunli/archive/2010/09/06/cache_expire_same_time.html

注意cache同时过期问题相关推荐

  1. spring cache ttl 过期

    spring cache ttl 过期实现 一般的,使用 spring cache 时,注解上不支持 ttl 过期时间 @Cacheable(cacheNames = "product3&q ...

  2. java cache定时过期,本地缓存高性能之王Caffeine

    前言 随着互联网的高速发展,市面上也出现了越来越多的网站和app.我们判断一个软件是否好用,用户体验就是一个重要的衡量标准.比如说我们经常用的微信,打开一个页面要十几秒,发个语音要几分钟对方才能收到. ...

  3. java cache定时过期_一个定时更新cache框架

    评论 # re: 一个定时更新cache框架 2006-12-13 15:34 BeanSoft 支持一下...呵呵..补充一下:quartz也可以用在非Web应用的定时操作,官方网站上说的.不要误解 ...

  4. c# redis 如何设置过期时间_Spring cache整合Redis,并给它一个过期时间!

    小Hub领读: 不知道你们有没给cache设置过过期时间,来试试? 上一篇文章中,我们使用springboot集成了redis,并使用RedisTemplate来操作缓存数据,可以灵活使用. 我才懂! ...

  5. System.Web.Caching.Cache类 缓存 各种缓存依赖

    原文:System.Web.Caching.Cache类 缓存 各种缓存依赖 Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.C ...

  6. 在asp.net中如何管理cache

    本文申明:本人凭着对英文和技术的热爱,根据自己有限的英文水平通过翻译文章以达到提高自身能力,如果有什么地方不对的,希望大家提意见. 目的:这篇文章将描述在asp.net中如何管理cache以及cach ...

  7. redis 缓存过期默认时间_过期redis时间

    Redis命令--键(key) Redis 键(key) Redis 键命令用于管理 redis 的键. 语法 Redis 键命令的基本语法如下: redis 127.0.0.1:6379> C ...

  8. cache:缓存在asp.net中如何管理?服务器端缓存?Session, Application, Cache objectscache ,客户端缓存?Cookies,ViewState...

    本文申明:本人凭着对英文和技术的热爱,根据自己有限的英文水平通过翻译文章以达到提高自身能力,如果有什么地方不对的,希望大家提意见. 目的:这篇文章将描述在asp.net中如何管理cache以及cach ...

  9. asp.net mvc 缓存CaChe使用

    缓存存储帮助类 using System; using System.Collections.Generic; using System.Linq; using System.Web; using S ...

最新文章

  1. 腾讯!阿里!大二男生斩获4家头部科技公司实习offer!完整经验总结!
  2. java整合redis集群_SpringBoot2.X整合Redis(单机+集群+多数据源)-Lettuce版
  3. php数据库滚动文字_PHP 里用的文字左右滚动?
  4. vs2008【断点无效】解决方法
  5. windows2008的功能介紹及其与2003的差异
  6. Python操作excel文件创建workbook和批量创建Sheet
  7. LeetCode 82 删除排序链表中的重复元素 II python
  8. AUTOSAR从入门到精通100讲(十八)-AUTOSAR操作系统OS
  9. 怎么读服务器文件内容,服务器上读取文件内容
  10. SpringBoot-Websocket
  11. 过滤器-filter
  12. 根据后台返回地址实现图片展示_微信小程序 - 前端接入七牛云上传图片和视频...
  13. react页面内嵌微信二维码 和 自定义样式 以及 微信网页共用unionId问题
  14. [转]关于Microsoft.Office.Interop组件接口的调用方法
  15. 维特比算法( viterbi)
  16. 解决solidworks导入stl文件就卡死的问题
  17. Python解武士数独问题
  18. 虚拟号码认证如何开通?
  19. Caused by: java.lang.ClassNotFoundException: org.springframework.scheduling.quartz.CronTriggerBean
  20. Flask 框架设计模式

热门文章

  1. 51单片机冒泡排序_51单片机片外冒泡排序
  2. stm32f407网页服务器,STM32F407单片机通过USR-LTE-7S4模块和服务器进行4G通信
  3. bios升级工具_小白修电脑系列第十二期--手把手教你升级主板BIOS
  4. 规范化之路(一) Checkstyle插件安装使用
  5. css3动画与@keyframes关键帧
  6. python标签打印工具_NiceLabel Designer 2017条码标签打印软件
  7. spring整合logback
  8. 程序员面试题 php_程序员面试必备PHP基础面试题 – 第十五天
  9. github 代理_GitHub访问提速方法
  10. oracle表段是什么,【DB笔试面试274】在Oracle中,什么是延迟段创建(Deferred Segment Crea......