FIFO算法
FIFO思想是先进先出,这是最简单最公平的一种思想。空间满的时候,最先进入的数据先被淘汰。
FIFO算法描述:设计一种缓存结构,构造时确定大小
- set(key,value) 将键值对插入该结构,当缓存满,将最先进入缓存的数据置换掉
- get(key):返回key的value值
实现策略:维护一个FIFO队列,按照时间顺序将各数据push到队列,将置换指针指向队首,当队列满时,只需将置换指针指向的数据tpop掉,然后将新加入的数据rpush到队列即可
缺点:缺页率随着分配页数的增加而增加(Belady现象)。FIFO与进程访问的异步行不相容,置换的内存往往时被频繁访问的
LRU(最近最久未使用)算法
redis中广泛使用。
LRU思想:若一个数据在最近一段时间没有访问到,那么将来访问的可能性也很小,最近最久未使用的数据最先被淘汰。
LRU算法描述:设计一种缓存结构,构造时确定大小
- set(key,value) 将键值对插入该结构,当缓存满,将最久未使用的数据置换掉
- get(key):返回key的value值
实现策略:最朴素的思想是用数组+时间戳的方式,但是效率很低。我们使用双向列表+hashmap实现,LinkedHashMap
LFU(最近最少使用)算法
LFU思想:若一个数据在最近一旦时间很少访问到,那么将来访问的可能也很小。当空间满时,最小频率访问的数据最先淘汰。
LRU算法描述:设计一种缓存结构,构造时确定大小
- set(key,value) 将键值对插入该结构,当缓存满,将访问频率最低的数据置换掉
- get(key):返回key的value值
实现策略:LFU淘汰访问频率最小的数据,需要找到一种方法维护数据访问频率。可看作top10的问题。因此我们很容易想到可以用二项堆来选择频率最小的元素,这样的实现比较高效。最终实现策略为小顶堆+哈希表