之前提到过,缓存即 存储 和 淘汰策略。一个好的淘汰策略,对于提升命中率起着至关重要的作用。一般常用的淘汰策略有,LRU、LFU、TinyLFU以及Window-TinyLFU (讲解LRU、LFU、TinyLFU缓存算法)文中有详尽的讲解。而ristretto采用了一种将SampledLFU 与 TinyLFU相结合的策略。

淘汰策略解决了什么问题

对于一个需要加入缓存的数据,假如存储空间没有满,则正常加入;若空间已满,则要考虑该数据是否值得缓存,如果不值得缓存则拒绝;否则,要通过删除其他数据为其腾出空间。

以上过程中,存在着两个问题:1. 怎么判断一个数据是否值得加入缓存?2. 如果要淘汰部分数据,具体怎么决定淘汰哪些数据?

怎么判断一个数据是否值得加入缓存?

对于这个问题,最直观的想法肯定是,被访问的次数的越多,越值得缓存。

如果两个数据A和B,但是只能缓存一个数据,在一段时间内A被访问了10次,B只被访问1次,毫无疑问会缓存A。

假如,有10个空间,但其中都存满的数据,现在新来了一个数据A(被访问5次),怎么判断他是不是值得被缓存呢?显然,我们只要依次将空间中10个数据被访问的次数,与数据A比较,如果发现被访问次数都比A高,则拒绝A进入缓存是非常合理的。

但是,一般缓存中存的绝不是仅有10个数据,可能是成千上万的数据,我们也需要都遍历一遍吗?显然,SampledLFU就是解决这个问题的。Sampled意为采样,SampledLFU从众多数据中随机的选取部分数据,并将待缓存的数据与这些数据做比较,如果发现采样到的数据的被访问次数都大于待缓存数据被访问的次数,则认为该数据不值得被缓存。

还是上面的例子,还是上面的10个数据,现在不需要全部比较,只需要随机的选择三个数据(假如选到了f,i,k),通过比较发现,被访问次数都A(5次)高,则最终认为A不值得被缓存。

我想到了一个更形象生动的例子:假如你是一位将军,手握雄兵一万,某天张三(战斗力250点)来投靠你,你随机挑了5个人,都能把张三干倒,你说你收不收张三?肯定让他回家。

怎么决定淘汰哪些数据?

如果能把第一个问题搞清楚,这个问题就非常简单了。

还是这个例子,现在在存储空间中,还是有如下的数据:

现在新来了一个数据Q(被访问了11次),随机选择的三个数据(b,c,f),则通过比较后发现,f小于11且被访问次数是三个之中最少的,则淘汰掉f并将Q加入,这样就完成了,是不是很简单?

有人问那g怎么办,他是8次,为啥不淘汰掉他,对此只能说他运气好,不过在频繁写入的情况下,他如果不再被访问,始终是8,那早晚会被淘汰。

淘汰策略具体的实现方式

对于一个key,是否值得加入缓存,ristertto有如下的实现方式:

淘汰数据的实现方式如下图:

TinyLFU的作用

刚才花了很多篇幅讲述SampledLFU的实现原理与具体实现方式,但是没有讲到TinyLFU具体干了啥。其实,我们一直在将获取一个key被访问的次数,那怎么获取呢?或者说,怎么记录一个key被访问了多少次呢?这就依靠TinyLFU来实现。至于具体的实现方式,这里推荐一篇文章 讲解LRU、LFU、TinyLFU缓存算法,文中已经写的很详细了,这里就不再赘述了。

高性能本地缓存Ristretto(三)——淘汰策略相关推荐

  1. 高性能本地缓存Ristretto(二)——过期策略

    ristretto提供了SetWithTTL()方法,支持创建key的同时,并设置一个过期时间. ristretto 利用嵌套的map结构,并结合巧妙的存储方式,实现了对每一个key的过期时间的管理. ...

  2. 高性能本地缓存Ristretto(一)——存储策略

    Ristretto是Dgraph基于golang实现的一个高性能的本地缓存库.特点是高命中率,高吞吐量,可自定义存储成本,支持一些自定义回调函数,并提供了较多的统计信息. 本文将主要讲述Ristret ...

  3. Java高性能本地缓存框架Caffeine

    文章目录 Java高性能本地缓存框架Caffeine 如何使用 缓存加载 手动加载 自动加载 手动异步加载 自动异步加载 过期策略 基于大小 基于时间 基于引用 Caffeine.weakKeys() ...

  4. Redis缓存过期和淘汰策略

    题记: 文章内容输出来源:拉勾教育Java高薪训练营. 本篇文章是 Redis 学习课程中的一部分笔记. Redis缓存过期和淘汰策略 Redis性能高: 官方数据 读:110000次/s 写:810 ...

  5. 「GoCN酷Go推荐」高性能内存缓存 ristretto

    背景 ristretto 是 dgraph 团队开源的一款高性能内存缓存库,旨在解决高并发场景下的缓存性能和吞吐瓶颈.dgraph 专攻的方向是高性能图数据库,ristretto 就是其图数据库和 K ...

  6. js本地缓存的三种方式

    目录 为什么要本地缓存? 1.cookie cookie特点: cookie的注意项: cookie设置 cookie清除 2.localStorage和sessionStorage 设置getIte ...

  7. 本地缓存的三种方式:sessionStorage、localStorage、Cookie

    1.sessionStorage:临时的会话存储 只要当前的会话窗口未关闭,存储的信息就不会丢失,即便刷新了页面,或者在编辑器中更改了代码,存储的会话信息也不会丢失. 2.localStorage:永 ...

  8. 高性能分布式缓存redis(持久化原理 安全策略 过期删除内存淘汰策略 性能压测 高可用 Redis Cluster)

    redis redis(持久化原理 安全策略 过期删除&内存淘汰策略 性能压测 高可用 Redis Cluster) 1. 持久化原理 1.1 持久化流程(落盘) 1.2 RDB详解 1.2. ...

  9. 缓存的有效期和淘汰策略【Redis和其他缓存】【刘新宇】

    缓存有效期与淘汰策略 有效期 TTL (Time to live) 设置有效期的作用: 节省空间 做到数据弱一致性,有效期失效后,可以保证数据的一致性 Redis的过期策略 过期策略通常有以下三种: ...

最新文章

  1. MongoDB 一个基于分布式文件存储的数据库
  2. 2017南宁现场赛E 存档
  3. mysql逻辑读高影响_运维日记| MySQL/Oracle深度解析之一:逻辑读
  4. 旷视高调进军AIoT!先砸20亿建智能物流生态,发布机器人协作大脑河图
  5. Java中的会话管理– HttpServlet,Cookie,URL重写
  6. Dstream的action算子与RDD的action算子
  7. 高并发系统的限流算法
  8. python颜色大全
  9. 明解c语言 练习,《明解C语言》示例代码和练习代码[第8章]
  10. 日系P2P原理探究(一) — Winny元祖: Freenet
  11. sql注入实验一 ——合天网安实验室学习笔记
  12. 正弦波叠加成及波的分解
  13. 基线检查工具Python代码
  14. Newtonsoft.Json.Linq 简单使用
  15. 7月27日19:30直播预告:HarmonyOS3及华为全场景新品发布会
  16. springSecurity 登陆失败前台显示账号密码登录错误
  17. IPTV的前世今生与发展
  18. 视觉软件 VisionPro 定位引导3(卡尺CogFindLineTool工具以及辅助工具)
  19. lerna 生成自定义日志changelog
  20. 考研/嵌入式/我的所思所想及其他

热门文章

  1. Fence Repair--POJ3253
  2. 【硬刚大数据之面试篇】2021年从零到大数据专家面试篇之SparkSQL篇
  3. background-repeat
  4. disconf在windows环境下部署调试
  5. 【MySQL 8.0 OCP 1Z0-908认证考试】题库精讲--第三讲mysql8.0安装配置升级(下)
  6. 在BIOS中设置U盘启动
  7. 村田Murata电容学习笔记
  8. Linux中如何启动redis服务
  9. 回望2018,这6家AI+教育公司亮了!| AI最佳掘金案例榜...
  10. 再谈FEC与UDP可靠传输,音视频FEC 应用