缓存策略-缓存算法介绍


今天介绍下缓存算法

FIFO算法

  • 进先出(FIFO,队列),是最简单、最公平的一种思想,即如果一个数据是最先进入的,那么可以认为在将来它被访问的可能性很小。空间满的时候,最先进入的数据会被最早置换(淘汰)掉
  • 实现:维护一个FIFO队列,按照时间顺序将各数据(已分配页面)链接起来组成队列,并将置换指针指向队列的队首。再进行置换时,只需把置换指针所指的数据(页面)顺次换出,并把新加入的数据插到队尾即可
  • 缺点: FIFO算法会使一些页面频繁地被替换和重新申请内存,从而导致缺页率增加

LRU算法

  • LRU(The Least Recently Used,最近最久未使用算法)是一种常见的缓存算法,在很多分布式缓存系统(如Redis, Memcached)中都有广泛使用
  • 如果一个数据在最近一段时间没有被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最久没有访问的数据最先被置换(淘汰)
  • 实现:最朴素的思想就是用数组+时间戳的方式,不过这样做效率较低。因此,我们可以用双向链表(LinkedList)+哈希表(HashMap)实现(链表用来表示位置,哈希表用来存储和查找),在Java里有对应的数据结构LinkedHashMap

LFU算法

  • LFU(Least Frequently Used ,最近最少使用算法)也是一种常见的缓存算法。思想是:如果一个数据在最近一段时间很少被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最小频率访问的数据最先被淘汰
  • 算法实现策略:考虑到 LFU 会淘汰访问频率最小的数据,我们需要一种合适的方法按大小顺序维护数据访问的频率。LFU 算法本质上可以看做是一个 top K 问题(K = 1),即选出频率最小的元素,因此我们很容易想到可以用二项堆来选择频率最小的元素,这样的实现比较高效。最终实现策略为小顶堆+哈希表

文章作者: Xudong Jiang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Xudong Jiang !
 上一篇
qmq消息队列-架构学习 qmq消息队列-架构学习
今天分享下qmq的架构 组件介绍 meta server: 提供集群管理和集群发现的作用 server: 提供实时消息服务 delay server: 提供延时/定时消息服务,延时消息先在delay server排队,时间到之后再发送给se
2019-07-19
下一篇 
mysql-数据库隔离级别 mysql-数据库隔离级别
介绍下数据库隔离级别以及各隔离下的问题,以及mysql的默认隔离级别 隔离级别 Serializable:串行化 强制事务排序,串行化读写,避免冲突 Repeatable read:可重复读 同一事务的多个实例在并发读取事务时,会“看到
2019-07-07
  目录