redis内存回收策略详解

Redis内存消耗

Redis进程的内存消耗主要包括:自身内存 + 对象内存 + 缓冲内存 + 内存碎片

20250827183552

自身内存

一般来讲,Redis空进程自身内存消耗非常少,通常 used_memory_rss 在 3MB 左右时,used_memory 一般在 800KB 左右

一个空的 Redis 进程消耗内存可以忽略不计

对象内存

对象内存是Redis内存占用最大的一部分,因为它存储着用户所有的数据

对象内存消耗可以简单理解为这两个对象(Key和Value)的内存消耗之和(还有类似过期之类的信息)

使用 Redis 时很容易忽略键对内存消耗的影响,应当避免使用过长的键以及给键设置一个过期时间

缓冲内存

缓冲内存主要包括客户端缓冲、复制积压缓冲和AOF缓冲

客户端缓冲指的是所有接入到 Redis 服务器 TCP 连接的输入输出缓冲

复制积压缓冲区是Redis 在 2.8 版本后提供的一个可重用的固定大小缓冲区,用于实现部分复制功能,根据 repl-backlog-size 参数控制,默认 1MB。对于复制积压缓冲区整个主节点只有一个,所有的从节点共享此缓冲区。因此可以设置较大的缓冲区空间,比如说 100MB,可以有效避免全量复制

AOF 重写缓冲区这部分空间用在AOF 重写期间保存最近的写入命令。AOF 重写缓冲区的大小用户是无法控制的,取决于 AOF 重写时间和写入命令量,不过一般都很小

内存碎片

Redis内部有自己的内存管理器,为了提高内存使用的效率,实现对内存的申请和释放进行管理。

Redis中的值删除的时候,并没有把内存直接释放交还给操作系统,而是交给了Redis内部有内存管理器。这就使得如果大量的key在短时间内过期被删除,这些内存不会释放给操作系统,而是交给内部内存管理器, 从而导致redis实际占用的内存与申请的内存相差过大,就会导致大量的内存碎片

Redis 正常碎片率一般在 1.03 左右

PS:子进程内存消耗

除此之外,Redis实例的内存消耗还有一部分是子进程的内存消耗,子进程内存消耗主要指执行 AOF 重写 或者进行 RDB 保存时 Redis 创建的子进程内存消耗

Redis 内存相关的指标与内存淘汰策略

使用info memory 命令可以查看内存使用情况以及当前内存相关配置,我们挑三个比较重要的字段来讲一下

  1. mem_fragmentation_ratio: 内存碎片率,一般在 1.03 左右

    该值 > 1时,说明有部分内存并没有用于数据存储,而是被内存碎片所消耗,如果该值很大,说明碎片率严重

    当该值 < 1时,一般是因为操作系统把 Redis 内存中的数据 swap 到硬盘里面,出现这种情况要格外关注,因为硬盘速度远远慢于内存,所以 Redis 性能会变得很差,甚至僵死

  2. maxmemory: Redis 使用 maxmemory 参数限制最大可用内存。

    maxmemory 限制的是 Redis 实际使用的内存量,也就是 used_memory 对应的内存。

    实际消耗的内存可能会比 maxmemory 设置的大,要小心因为这部分内存导致 OOM。所以,如果你有 10GB 的物理内存,最好将 maxmemory 设置为 8 或者9G

    限制内存的目的主要有:

    (1)用于缓存场景,当超出内存上限 maxmemory 时使用 LRU 等回收策略释放空间

    (2)防止所用的内存超过服务器物理内存,导致 OOM 后进程被系统杀死

  3. maxmemory_policy:redis的内存回收策略,Redis默认采用noeviction策略

    volatile-lru:在设置了过期时间的所有键中,选取最近最少使用的数据删除

    volatile-lfu:在设置了过期时间的所有键中,选取最近最不常用,也就是一定时期内被访问次数最少的数据删除

    volatile-random:筛选出设置了过期时间的键值对,随机删除。

    volatile-ttl:筛选出设置了过期时间的键值对,越早过期的越先被删除。

    allkeys-lru:在所有键中,选取最近最少使用的数据删除

    allkeys-lfu:在所有键中,选取最近最不常用,也就是一定时期内被访问次数最少的数据删除

    allkeys-random:采用随机淘汰策略删除所有的键值对,这个策略不常用。

    noeviction:不淘汰任何键值对,当内存满时,如果进行读操作,例如get命令,它将正常工作,如果做写操作,它将返回错误,也就是说,当Redis采用这个策略内存达到最大的时候,它就只能读不能写了

20250827184231

posted @ 2025-08-27 18:43  阿峰博客站  阅读(14)  评论(0)    收藏  举报