命中率最高的置换策略,一定是根据你的业务逻辑,定制化的策略。比如,你如果知道某些数据已经删除了,永远不会再被访问到,那优先置换这些数据肯定是没问题的。再比如,你的系统是一个有会话的系统,你知道现在哪些用户是在线的,哪些用户已经离线,那优先置换那些已经离线用户的数据,尽量保留在线用户的数据也是一个非常好的策略。

想法:我觉得,我可以也扯一点关于这方面的内容。为了避免频道访问 k8s 或者数据库,python 缓存时采用一种特殊的方式。突发奇想有没有效果,试了下,感觉可以。通过分析日志来获得缓冲命中情况。

Kafka 使用的 PageCache,是由 Linux 内核实现的,它的置换算法的就是一种 LRU 的变种算法 :LRU 2Q。我在设计 JMQ 的缓存策略时,也是采用一种改进的 LRU 算法。LRU 淘汰最近最少使用的页,JMQ 根据消息这种流数据存储的特点,在淘汰时增加了一个考量维度:页面位置与尾部的距离。因为越是靠近尾部的数据,被访问的概率越大。
这样综合考虑下的淘汰算法,不仅命中率更高,还能有效地避免“挖坟”问题:例如某个客户端正在从很旧的位置开始向后读取一批历史数据,内存中的缓存很快都会被替换成这些历史数据,相当于大部分缓存资源都被消耗掉了,这样会导致其他客户端的访问命中率下降。加入位置权重后,比较旧的页面会很快被淘汰掉,减少“挖坟”对系统的影响。

(之前也有个 LRU 改进的置换策略,但是忘记哪个的)

Link:缓存策略:如何使用缓存来减少磁盘IO?.md