上文中提到了LRU 缓存淘汰算法,可以帮助我们更好更合理的去使用缓存。但是它也有一个缺点就是如果有一些不满足“如果数据最近被访问过,那么将来被访问的几率也更高”的规律时,会破坏缓存,导致性能下降。如果缓存的容量比较小,这样还会导致一些热点搜索词的缓存被替换了出去,有可能导致一瞬间大量的请求访问DB 发生缓存击穿。或者 偶然的数据影响会造成命中率较低,比如某个数据即将到达底部即将被淘汰,但由于一次的请求又放入了头部,此后再无该数据的请求,那么该数据的继续存在其实是不合理的
这边仅仅给出一种解决的方法仅供参考
针对这类情况LRU-K算法拥有更好的解决措施。结构图如下所示:

LRU-K需要多维护一个队列或者更多,用于记录所有缓存数据被访问的历史。只有当数据的访问次数达到K次的时候,才将数据放入缓存。当需要淘汰数据时,LRU-K会淘汰第K次访问时间距当前时间最大的数据。
第一步添加数据照样放入第一个队列的头部
如果数据在该队列里访问没有达到K次(该数值根据具体系统qps来定)则会继续到达链表底部直至淘汰;如果该数据在队列中时访问次数达到了K次,那么它会被加入到接下来的2级(具体需要几级结构也同样结合系统分析)链表中,按照时间顺序在2级链表中排列
接下来2级链表中的操作与上面算法相同,链表中的数据如果再次被访问则移到头部,链表满时,底部数据淘汰
相比LRU,LRU-K需要多维护一个队列,用于记录所有缓存数据被访问的历史,所以需要更多的内存空间来用来构建缓存,但优点也很明显,较好的降低了数据的污染率提高了缓存的命中率,对于系统来说可以用一定的硬件成本来换取系统性能也不失为一种办法。

欢迎关注,更多惊喜等着你

LRU缓存淘汰算法优化相关推荐

  1. 看动画轻松理解「链表」实现「LRU缓存淘汰算法」

    作者 | 程序员小吴,哈工大学渣,目前正在学算法,开源项目 「 LeetCodeAnimation 」5500star,GitHub Trending 榜连续一月第一. 本文为 AI科技大本营投稿文章 ...

  2. 数据结构与算法 / LRU 缓存淘汰算法

    一.诞生原因 缓存是一种提供数据读取性能的技术,在硬件设计.软件开发中有广泛的应用,比如常见的 CPU 缓存,DB 缓存和浏览器缓存等.但是缓存的大小是有限的,需要一定的机制判断哪些数据需要淘汰,即: ...

  3. 看动画轻松理解「链表」实现「 LRU 缓存淘汰算法」

    作者 | 吴至波 责编 | 胡巍巍 快速挑战Python全栈工程师: https://edu.csdn.net/topic/python115?utm_source=csdn_bw 前几节学习了「链表 ...

  4. 看动画理解「链表」实现LRU缓存淘汰算法

    前几节学习了「链表」.「时间与空间复杂度」的概念,本节将结合「循环链表」.「双向链表」与 「用空间换时间的设计思想」来设计一个很有意思的缓存淘汰策略:LRU缓存淘汰算法. 循环链表的概念 如上图所示: ...

  5. 算法必知 --- LRU缓存淘汰算法

    作者:_code_x 链接:https://www.jianshu.com/p/b7fed77324b9 写在前 就是一种缓存淘汰策略. 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾 ...

  6. 06 | 链表(上):如何实现LRU缓存淘汰算法?

    缓存 作用 缓存是一种提高数据读取性能的技术,在硬件设计.软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存.数据库缓存.浏览器缓存等等. 淘汰策略 常见的策略有三种:先进先出策略 FIFO(F ...

  7. leetcode刷题:LRU缓存淘汰算法

    题目: 分析: 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置.但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用.那么, ...

  8. 如何基于链表实现 LRU 缓存淘汰算法?

    什么是LRU LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也更高" ...

  9. Python实现:详解LRU缓存淘汰算法

    大家好,今天我们和大家聊一个非常常用的算法,叫做LRU. LRU的英文全称是Least Recently Used,也即最不经常使用.我们看着好像挺迷糊的,其实这个含义要结合缓存一起使用.对于工程而言 ...

最新文章

  1. Html5 History API解析
  2. Atom 实用侧边栏插件
  3. Oracle简单建立表空间
  4. java远程调用linux的命令或者脚本
  5. css版式_第2部分:使版式具有响应能力,并为以后的版本奠定基础
  6. 二叉树遍历(代码,分析,汇编)
  7. 内网通看不到其他人_小学生在新版本里用“吃鸡内挂”,巡查员:封不了,手机自带的...
  8. 信息学奥赛一本通 1171:大整数的因子 | OpenJudge NOI 1.6 13:大整数的因子
  9. CentOS 6.3用ssh无密码登陆其它主机
  10. 数据结构期末复习(四)
  11. swoole2.0与java_swoole2.0试用说明
  12. OpenCV教程:超详细的OpenCV入门教程,值得收藏
  13. 【图灵学院】JAVA互联网架构【全】
  14. CSP 202206-1 归一化处理
  15. 解决 git@gitlab.com: Permission denied (publickey,gssapi-with-mic,password)
  16. AC220V电压检测电路,一个光耦搞定
  17. python网页版百度_python,_爬虫 页面不存在_百度搜索,python - phpStudy
  18. 如何获得CISSP认证?权威流程
  19. flask html下拉列表,如何使用Flask和HTML從python列表創建下拉菜單
  20. 关于百度蛛蛛日志分析对SEO的作用

热门文章

  1. 九连环游戏算法递归实现
  2. Android 蓝牙技术(一)- 经典蓝牙
  3. 报错:The class java.lang.IllegalArgumentException may be caused by the wrapped ProcessingEnvironment
  4. 流媒体中国(liumeiti.com)专访我公司总经理
  5. Java 将网络url图片链接转换为File类型对象
  6. CODESOFT软件报错 無法開啓文件
  7. 互联网版权免责声明之深入
  8. 过来人对于在校生找工作的一点看法 很有感触!
  9. 【面经】鹏华基金数据工程师面经
  10. C51实现一个电子日历(比较难)