缓存特征了解
转自:https://tech.meituan.com/2017/03/17/cache-about.html
1.介绍
1.1命中率
命中率=返回正确结果数/请求缓存次数,命中率问题是缓存中的一个非常重要的问题,它是衡量缓存有效性的重要指标。命中率越高,表明缓存的使用率越高。
1.2 最大元素
缓存中可以存放的最大元素的数量,一旦缓存中元素数量超过这个值(或者缓存数据所占空间超过其最大支持空间),那么将会触发缓存启动清空策略。根据不同的场景合理的设置最大元素值往往可以一定程度上提高缓存的命中率,从而更有效的时候缓存。
1.3清空策略
FIFO:
先进先出策略,最先进入缓存的数据在缓存空间不够的情况下(超出最大元素限制)会被优先被清除掉,以腾出新的空间接受新的数据。策略算法主要比较缓存元素的创建时间。在数据实效性要求场景下可选择该类策略,优先保障最新数据可用。
LFU(less frequently used):
最少使用策略,无论是否过期,根据元素的被使用次数判断,清除使用次数较少的元素释放空间。策略算法主要比较元素的hitCount(命中次数)。在保证高频数据有效性场景下,可选择这类策略。LFU 的问题在于,经常会有一些数据在某时刻非常极其热门,但之后一直没人访问,例如因为某些原因被隐藏的用户动态这类场景。另外,LFU 的频率信息在缓存失效后依旧会存在内存中。
LRU(Least Recently Used):
当缓存清理时,优先清理长久未被访问的数据,保留最近被访问过的数据。最近最少使用策略,无论是否过期,根据元素最后一次被使用的时间戳,清除最远使用时间戳的元素释放空间。策略算法主要比较元素最近一次被get使用时间。在热点数据场景下较适用,优先保证热点数据的有效性。LRU 的问题在于,如果在某个数据在前9分钟访问了1万次,最近1分钟没有访问,那么依然会认为该 key 并不热门而有可能被驱逐。
2.代码学习
https://github.com/vpetrigo/caches?tab=readme-ov-file
接口主要方法:
- Put:增加元素,同时涉及到超出容量删除Erase旧key; 如果元素已存在,那么更新值,并更新相关的访问时间;如果元素不存在,则插入。
- Get:查询元素。
- Remove:删除元素。
3.总结
https://blog.joway.io/posts/modern-memory-cache/
本地内存缓存设计关键点:
- 锁的设计和优化;
- 对于缓存系统命中率影响最大,同时也是实现算法上最复杂的还是淘汰策略的选择。