2023-08-17 15:03:54
LRU 和 LFU 缓存数据淘汰算法
一、LRU(Least Recently Used)算法
LRU算法选择最近最久未使用的页面或数据予以淘汰。其核心思想是:如果数据最近被访问过,那么将来被访问的几率也更高;反之,如果数据最近最少被访问,那么将来被访问的几率则最低。
工作原理:
访问数据:当访问某个数据时,将该数据移动到队列的头部,表示最近使用过。
添加数据:当需要添加新数据时,如果队列已满,则移除队列尾部的数据(即最近最久未使用的数据),然后将新数据添加到队列头部。
示例:
访问数据3后,数据3移动到队列头部。

添加数据5后,移除队列尾部的数据4,然后将数据5添加到队列头部。

缺点:
可能会由于一次冷数据的批量查询而导致大量热点的数据被删除。
二、LFU(Least Frequently Used)算法
LFU算法选择最近使用次数最少的页面或数据予以淘汰。其核心思想是:如果数据的使用次数越少,那么将来被访问的几率也越低。
工作原理:
访问数据:当访问某个数据时,增加该数据的使用次数,并更新其最近使用时间。
添加数据:当需要添加新数据时,如果队列已满,则根据使用次数和最近使用时间选择数据进行淘汰。优先淘汰使用次数最少的数据,如果使用次数相同,则淘汰最近使用时间最早的数据。
示例:
访问数据2后,数据2的使用次数增加1,并更新最近使用时间。

添加数据5后,根据使用次数和最近使用时间选择数据进行淘汰。

缺点:
最新加入的数据常常会被踢除,因为其起始被访问次数少。
如果频率时间度量较短,则可能导致在短时间内访问频率高的数据被长时间内访问频率稍高的数据淘汰。
三、LRU与LFU的对比
LRU:
优点:实现简单,能够很好地保留最近使用的数据。
缺点:可能会误淘汰热点数据,特别是在冷数据批量查询时。
LFU:
优点:能够更好地保留热点数据,因为淘汰的是使用次数最少的数据。
缺点:对最新加入的数据不友好,且频率时间度量的选择可能影响淘汰效果。
四、Redis中的LRU与LFU
Redis提供了多种内存淘汰策略,其中包括LRU和LFU。
LRU在Redis中的应用:
当内存不足时,从所有key或使用了过期时间的key中,使用LRU算法选出最近使用最少的数据进行淘汰。
存在问题:可能会误淘汰使用次数高但最近未访问的数据。
LFU在Redis中的应用:
当内存不足时,从所有key或使用了过期时间的key中,使用LFU算法选出使用频率最低的数据进行淘汰。
优点:更加科学合理地保留热点数据。
五、总结
在高并发且热点数据量很大的情况下,建议使用Redis的LFU方式淘汰数据,因为此方式更加科学合理。然而,在选择淘汰算法时,还需要根据具体的应用场景和需求进行权衡。例如,在某些情况下,可能需要结合LRU和LFU的优点,或者采用其他更复杂的淘汰策略来满足特定的需求。