内存淘汰是什么?
Redis作为一款非关系型数据库,数据是存储到内存中的,和传统常规数据库相比,这给予可很高的并发访问量,但是相应的,存储空间就不如那些存储在磁盘中的数据库了。
而内存淘汰就是为了应对Redis内存存储空间无法再放置新数据时,所设置的一种机制,即把老数据进行删除淘汰,来保证新数据的顺哪里插入。
内存淘汰的意义?
内存淘汰将Redis的存储空间由固态的变为了动态的,即数据对应的存储空间并非一成不变的。而是”流动“的,可以存储比字面规定的存储大小更灵活的空间大小。
Redis中的内存淘汰策略
8种内存淘汰策略:
当 Redis 达到最大内存限制时,Redis会确切地使用配置好的最大内存策略指令来执行。相关策略如下:
-
noeviction(默认策略): 不会删除任何数据,拒绝所有写入操作并返回客户端错误消息(error)OOM command not allowed when used memory,此时 Redis 只响应删和读操作;
-
allkeys-lfu: 从所有 key 中使用 LFU 算法进行淘汰(LFU 算法:最不常用算法,根据使用频率计算,4.0 版本新增);
-
volatile-lru: 从设置了过期时间的 key 中使用 LRU 算法进行淘汰;
-
volatile-lfu: 从设置了过期时间的 key 中使用 LFU 算法进行淘汰;
-
allkeys-random: 从所有 key 中随机淘汰数据;
-
volatile-random: 从设置了过期时间的 key 中随机淘汰数据;
-
volatile-ttl: 在设置了过期时间的key中,淘汰过期时间剩余最短的。
注意: 当使用 volatile-lru、volatile-lfu、volatile-random、volatile-ttl 这四种淘汰策略时,如果没有 key 可以淘汰,则和 neoviction 一样返回错误。
内存淘汰策略的选用
这几种淘汰策略各有优缺点,且Redis支持手动配置淘汰策略。
所以在实际应用场景中,我们要根据具体的业务情况以及性能开销等情况去选用合适的淘汰策略。
-
业务需求为主: 在自定义淘汰策略时,始终以业务需求为主导。深入了解数据的访问模式、重要性以及访问频率,有助于制定更合理的策略。
-
评估性能开销: 自定义淘汰策略可能会引入一定的计算开销。在设计策略时,需要评估性能开销,确保不会影响整体系统性能。
-
定期优化策略: 随着业务的演变,自定义淘汰策略可能需要进行优化和调整。定期审查和优化策略,保证其与业务需求保持一致。
-
数据冷热分离: 一些业务场景中,数据的热度是变化的。可以考虑将热数据和冷数据分开存储,采用不同的淘汰策略,从而更好地平衡性能和存储消耗。
通过自定义淘汰策略,你可以更好地满足复杂业务需求,优化数据管理,并在实际项目中获得更好的性能和效果。
淘汰策略选用示例:
-
allkeys-lru:如果我们的应用对缓存的访问符合幂律分布,也就是存在相对热点数据,或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择allkeys-lru策略。
-
allkeys-random:如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。
-
volatile-ttl:这种策略使得我们可以向Redis提示哪些key更适合被eviction。
Redis 4.0 版本开始增加了 LFU 缓存淘汰策略,也采用数据随机筛选规则,然后依据数据的热度值排序,淘汰掉热度值较低的数据。
另外,值得一提的是将key设置过期时间实际上会消耗更多的内存,因此建议使用allkeys-lru策略从而更有效率的使用内存。