Redis的数据淘汰策略解读

Redis的内存大小可以通过配置文件redis.conf中的maxmemory参数来进行设置。maxmemory的默认值为0,表示Redis可以使用无限大的内存。如果要限制Redis的最大内存大小,可以将maxmemory设置为一个正整数,表示Redis最多可以使用的内存大小(单位为字节)。

可以通过设置maxmemory-policy参数来定义内存不足时的处理策略。maxmemory-policy的默认值为"noeviction",表示当内存不足时,Redis将拒绝写入新数据。其他可选的策略包括volatile-lru、allkeys-lru、volatile-random、allkeys-random、volatile-ttl和volatile-lfu等。需要根据实际情况调整Redis的内存大小配置,以避免内存不足或浪费。

需要注意的是,数据淘汰过程并不能100%清理出足够的可用内存空间。如果清理失败,则需要重复执行。当尝试了所有的数据后,如果无法满足内存清理要求,将会出现"OOM command not allowed when used memory > maxmemory"的错误信息。

数据淘汰策略 不进行数据淘汰策略 noeviction:这是Redis3.0之后的默认内存淘汰策略。当运行内存超过最大设置内存时,不淘汰任何数据。如果有新的数据写入,将触发OOM错误,但仅进行查询或删除操作时,Redis仍可以正常工作。

进行数据淘汰策略 大致上可以分为四种策略:LRU、LFU、random和ttl。

在设置了过期时间的数据中进行淘汰:

  • volatile-random:随机淘汰设置了过期时间的任意键值。
  • volatile-ttl:优先淘汰较早过期的键值。
  • volatile-lru:这是Redis3.0之前的默认内存淘汰策略,淘汰所有设置了过期时间的键值中最久未使用的键值。
  • volatile-lfu:Redis 4.0后新增的内存淘汰策略,淘汰所有设置了过期时间的键值中最少使用的键值。

在所有数据范围内进行淘汰:

  • allkeys-random:随机淘汰任意键值。
  • allkeys-lru:淘汰整个键值中最久未使用的键值。
  • allkeys-lfu:Redis 4.0后新增的内存淘汰策略,淘汰整个键值中最少使用的键值。

对于拥有1000万条数据的数据库,而Redis只能缓存20万条数据,为了保证Redis中的数据都是热点数据,可以采用allkeys-lru策略,即淘汰最近最少使用的数据。这样保留下来的数据将是经常访问的热点数据。

如果Redis的内存用满了,需要查看Redis的数据淘汰策略。如果是默认配置,当内存用满时,Redis将报错。

在实际使用中,应根据具体的业务需求和数据特性选择适合的淘汰策略。例如,对于一些重要的数据,可以采用noeviction策略以保证数据的完整性;对于一些缓存数据,可以采用volatile-lru策略以保证缓存的有效性。

LRU和LFU的对比 LRU(Least Recently Used):LRU策略基于数据项在过去的访问时间来确定淘汰哪些数据。最近最少使用的数据项将被优先淘汰。LRU的核心思想是,如果一个数据项最近被访问过,那么它在未来可能还会被访问。

LFU(Least Frequently Used):LFU策略基于数据项被访问的频率来确定淘汰哪些数据。访问次数最少的数据项将被优先淘汰。LFU的核心思想是,访问频次较高的数据项可能在未来还会被多次访问,因此应该保留在缓存中。

  • LRU侧重于数据项最近的访问时间,而LFU侧重于数据项的访问频率。
  • LRU易于实现,通常使用双向链表和哈希表。而LFU的实现相对复杂,需要使用最小堆或哈希表等数据结构。

在某些情况下,LFU可能比LRU表现更好,因为它更加关注访问频率。然而,对于某些访问模式,LFU可能会导致命中率较低。因此,在选择LRU和LFU之间,应根据具体的应用场景和数据访问模式进行评估和选择。

相关推荐
_ziva_21 小时前
MAC-SQL 多智能体协作框架解析
数据库·oracle
最贪吃的虎21 小时前
Redis其实并不是线程安全的
java·开发语言·数据库·redis·后端·缓存·lua
代码不停21 小时前
MySQL事务
android·数据库·mysql
山峰哥21 小时前
数据库工程与SQL调优实战:从原理到案例的深度解析
java·数据库·sql·oracle·性能优化·编辑器
OpsEye21 小时前
Redis 内存碎片的隐形消耗——如何用 memory purge 命令释放空间?
运维·网络·数据库·redis·缓存·内存·监控
施嘉伟21 小时前
一次典型的 SQL 性能问题排查:临时表导致的隐藏性能陷阱
数据库·sql
冰冰菜的扣jio21 小时前
Redis高级数据结构
数据结构·redis·bootstrap
IT 乔峰21 小时前
分享一个负载均衡的NDB高可用集群架构+部署详细说明
数据库·架构·负载均衡
丁丁点灯o21 小时前
oracle中基于正则表达式匹配规则提取子串的函数REGEXP_SUBSTR
数据库·oracle·正则表达式
木风小助理21 小时前
Android 数据库实操指南:从 SQLite 到 Realm,不同场景精准匹配
jvm·数据库·oracle