上一讲介绍了缓存满了,通过内存淘汰机制来淘汰掉数据。如果有的数据一直滞留在缓存中,但又没有应用使用,时间长了,就可能会占据大部分的缓存空间。
今天我们来学习一下缓存污染,以及如何解决缓存污染。
缓存污染
缓存污染,指留存在缓存中的数据,实际不会被再次访问了,但又占据了缓存空间。
要解决缓存污染的关键点是能识别出只访问一次或者访问次数很少的数据。
从能否解决缓存污染这一维度来分析Redis的8种缓存淘汰策略:
- noeviction策略:不会淘汰数据,解决不了。
- volatile-ttl策略:给数据设置合理的过期时间。当缓存写满时,会淘汰剩余存活时间最短的数据,避免滞留在缓存中,造成污染。
- volatile-random策略:随机选择数据,无法把不再访问的数据筛选出来,会造成缓存污染。
- volatile-lru策略:LRU策略只考虑数据的访问时效,对只访问一次的数据,不能很快筛选出来。
- volatile-lfu策略:LFU策略在LRU策略基础上进行了优化,筛选数据时优先筛选并淘汰访问次数少的数据。
- allkeys-random策略:随机选择数据,无法把不再访问的数据筛选出来,会造成缓存污染。
- allkeys-lru策略:LRU策略只考虑数据的访问时效,对只访问一次的数据,不能很快筛选出来。
- allkeys-lfu策略:LFU策略在LRU策略基础上进行了优化,筛选数据时优先筛选并淘汰访问次数少的数据。
关于LRU和LFU算法的内容,点击查看系列的第2讲。
总结
缓存淘汰策略 | 解决缓存污染 |
---|---|
noeviction策略 | 不能 |
volatile-ttl策略 | 能 |
volatile-random策略 | 不能 |
volatile-lru策略 | 不能 |
volatile-lfu策略 | 能 |
allkeys-random策略 | 不能 |
allkeys-lru策略 | 不能 |
allkeys-lfu策略 | 能 |
参考资料
- 27 | 缓存被污染了,该怎么办?