声明:博客来源http://www.cnblogs.com/AloneSword/p/3931905.html,谢谢他的分享!

  缓存穿透与缓存雪崩

  缓存系统不得不考虑的另一个问题是缓存穿透与失效时的雪崩效应。缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个存在的数据每次请求都要到存储层去查询,失去了缓存的意义。有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。在数据魔方里,我们采用了一个更为简单粗暴的方法,如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

  缓存失效时的雪崩效应对底层系统的冲击非常可怕。遗憾的是,这个问题目前并没有很完美的解决方案。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线 程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上。在数据魔方中,我们设计的缓存过期机制理论上能够将各个客户端的数据失效时间均匀地分布在时间轴上,一定程度上能够避免缓存同时失效带来的雪崩效应。

  永久数据被t现象

  原因:由惰性删除或者LRU删除机制导致。

  如果slab里很多chunk已经过期,但过期后没有被get过,系统不知道他们已经过期;

  永久数据很久没有被get了,不活跃,如果新增item,则永久数据被t掉;

  当然,如果那些非永久性数据被get,也会标识为expire,从而不会再踢掉永久数据。

  

  解决方案:永久数据与非永久性数据分开放。

  

最新文章

  1. C++ 数字转换为string类型
  2. redis服务器
  3. coding题都在考察我们的什么技能
  4. C语言之strrchr函数
  5. js性能优化的小知识
  6. 如何优化C语言代码(程序员必读)
  7. Node.js中的事件
  8. C# 多线程是否结束可通过线程池可以判断
  9. operator 类型转换符
  10. Python之路-基本数据类型
  11. js函数中的BOM和DOM
  12. java历史版本下载地址
  13. C++STL模板库序列容器之vector
  14. maven 设置跳过测试
  15. 2018牛客网暑期ACM多校训练营(第一场) J - Different Integers - [莫队算法]
  16. plupload.Uploader多文件上传
  17. 动态将彩色图片动画过渡到黑白图片的BlackAndWhiteView
  18. c语言訪问excel
  19. 20155328 2016-2017-2 《Java程序设计》 第一周学习总结
  20. bash 获取时间段内的日志内容

热门文章

  1. MongoDB出现CPU飚高,如何强制停止正在执行的操作
  2. C# WinForm启动时的事件加载次序
  3. C#对Excel的图文操作
  4. 「小程序JAVA实战」小程序 loading 提示框与页面跳转(37)
  5. C++STL:流迭代器
  6. c#文件下载---以文件流形式
  7. jq 遍历 each方法
  8. Cross-Browser, Event-based, Element Resize Detection(转)
  9. java 整数存储为2进制补码形式
  10. 转 sql注入