Redis被动清理策略是什么?怎么用它自动优化存储空间?

文章导读
Redis 被动清理策略,也称为惰性删除,是指在客户端访问某个键时,Redis 才会检查该键是否过期,如果过期则立即删除。这种策略能有效节省 CPU 资源,但可能导致内存中存在大量过期键。为了自动优化存储空间,通常结合定期删除策略,由 serverCron 定时任务随机扫描部分键进行清理。当内存达到 maxmemory 上限时,还会触发内存淘汰策略(如 LRU),确保存储空间高效利用,避免内存溢出
📋 目录
  1. Redis 的数据清理策略详解
  2. redis 过期 key 的删除策略 [通俗易懂]
  3. Redis 进阶 -Redis 对于过期键的三种清除策略
  4. redis 过期策略
  5. Redis 如何做内存优化?
  6. FAQ
A A

Redis 被动清理策略,也称为惰性删除,是指在客户端访问某个键时,Redis 才会检查该键是否过期,如果过期则立即删除。这种策略能有效节省 CPU 资源,但可能导致内存中存在大量过期键。为了自动优化存储空间,通常结合定期删除策略,由 serverCron 定时任务随机扫描部分键进行清理。当内存达到 maxmemory 上限时,还会触发内存淘汰策略(如 LRU),确保存储空间高效利用,避免内存溢出影响性能。

Redis 的数据清理策略详解

Redis 的数据清理策略详解\n怎么做是最优解提供决策依据。Redis 的清理策略,总结概括为三点,被动清理、定时清理、驱逐清理 访问 Key 时,每次都会检查该 Key 是否已过期,如果过期则删除该 Key ,get、scan 等指令都会触发 Key 的过期检查。关键代码如下,expireIfNeeded (redisDb *db, robj *key) 函数会触发检查并删除 robj*lookupKeyReadWithFlags(redisDb*db,robj*key,int flags){robj*val;if(expireIfNeeded(db,key)==1){/* Key expired. If we are in the context of a master, expireIfNeeded() * returns 0 only when the key does not exist at all, so it's safe * to return NULL ASAP. */if(server.masterhost==NULL){server.stat_keyspace_misses++;returnNULL;}if(server.current_client&&server.current_client!=server.master&&server.current_client->cmd&&server.current_client->cmd->flags&CMD_READONLY){server.stat_keyspace_misses++;returnNULL;}}val=lookupKey(db,key,flags);if(val==NULL)server.stat_keyspace_misses++;elseserver.stat_keyspace_hits++;returnval;} 定时清理 1、Redis 配置项 hz 定义了 serverCron 任务的执行周期,默认为 10,即 CPU 空闲时每秒执行 10 次 3、清理时依次遍历所有的 db; 4、从 db 中随机取 20 个 key,判断是否过期,若过期,则逐出; 5、若有 5 个以上 key 过期,则重复步骤 4,否则遍历下一个 db; 6、在清理过程中,若达到了 timelimit 时间,退出清理过程; 关键代码如下,activeExpireCycle (int type) 会执行上述逻辑 intserverCron(struct aeEventLoop*eventLoop,long long id,void*clientData){databasesCron();}voiddatabasesCron(void){/* Expire keys by random sampling. Not required for slaves * as master will synthesize DELs for us. */if(server.active_expire_enabled){if(server.masterhost==NULL){activeExpireCycle(ACTIVE_EXPIRE_CYCLE_SLOW);}else{expireSlaveKeys();}}}(搜索结果收录于 2026 年 4 月 10 日)

redis 过期 key 的删除策略 [通俗易懂]

redis 过期 key 的删除策略 [通俗易懂]\n第一种策略:被动删除 当读/写一个 key 时,redis 首先会检查这个 key 是否存在,如果存在且已过期,则直接删除这个 key 并返回 nil 给客户端。第二种策略:定期删除 redis 中有一系列的定期任务 (serverCron),这些任务每隔一段时间就会运行一次,其中就包含清理过期 key 的任务,运行频率由配置文件中的 hz 参数来控制,取值范围 1~500,默认是 10,代表每秒运行 10 次。清理过程如下:遍历所有的 db 从 db 中设置了过期时间的 key 的集合中随机检查 20 个 key 删除检查中发现的所有过期 key 如果检查结果中 25% 以上的 key 已过期,则继续重复执行步骤 2-3,否则继续遍历下一个 db 调大 hz 将会提高 redis 定期任务的执行频率,如果你的 redis 中包含很多过期 key 的话,可以考虑将这个值调大,但要注意同时也会增加 CPU 的压力,redis 作者建议这个值不要超过 100。第三种策略:强制删除 如果 redis 使用的内存已经达到 maxmemory 配置的值时,会触发强制清理策略,清理策略由配置文件的 maxmemory-policy 参数来控制,有以下这些清理策略:volatile-lru:使用 LRU 算法对设置了过期时间的 key 进行清理 (默认值) allkeys-lru:使用 LRU 算法对所有 key 进行清理 volatile-lfu:使用 LFU 算法对设置了过期时间的 key 进行清理 (redis 4.0 版本开始支持) allkeys-lfu:使用 LFU 算法对所有 key 进行清理 (redis 4.0 版本开始支持) volatile-random:对所有设置了过期时间的 key 进行随机清理 allkeys-random:从所有 key 进行随机清理 volatile-ttl:清理生存时间最小的一部分 key noeviction:不做任何清理,拒绝执行所有的写操作 为了节省内存和性能上的考虑,上述的清理策略都不需要遍历所有数据,而是采用随机采样的方法,每次随机取出特定数量 (由 maxmemory-samples 配置项控制,默认是 5 个) 的 key,然后在这些 key 中执行 LRU 算法、RANDOM 算法、或者是找出 TTL 时间最小的一个 key,然后进行删除。注:这个清理过程是阻塞的,直到清理出足够的内存空间才会停止。(截至 2026 年 4 月 1 日)

Redis 进阶 -Redis 对于过期键的三种清除策略

Redis 进阶 -Redis 对于过期键的三种清除策略\n被动删除 当读/写一个已经过期的 key 时,会触发惰性删除策略,直接删除掉这个过期 key. 举个例子,set 一个 过期时间为 600s 的 key , 当 到了 600s 后,redis 并不会执行删除,为了性能,redis 会在你下次访问的时候 去删除。这样的话,我如果永远不访问,那不歇菜了么?不要着急,Redis 还有主动删除。主动删除 由于惰性删除策略无法保证冷数据被及时删掉,所以 Redis 会定期主动淘汰一批已过期的 key。说白了,这就是定时任务干的活,防止有些 key 一直占用内存。当 REDIS 运行在主从模式时,只有主结点才会执行被动和主动这两种过期删除策略,然后把删除操作”del key"同步到从结点。当前已用内存超过 maxmemory 限定时,触发主动清理策略 第三种策略的情况:当前已用内存超过 maxmemory 限定时,会触发主动清理策略。我们需要根据自身业务类型,选好 maxmemory-policy(最大内存淘汰策略),设置好过期时间。如果不设置最大内存,当 Redis 内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换 (swap) 会让 Redis 的性能急剧下降。默认策略是 volatile-lru,即超过最大内存后,在过期键中使用 lru 算法进行 key 的剔除,保证不过期数据不被删除,但是可能会出现 OOM 问题。(2026 年 4 月 14 日的资料)

Redis被动清理策略是什么?怎么用它自动优化存储空间?

redis 过期策略

redis 过期策略\n在 Redis 面试中,“过期策略”绝对是高频必考题,很多开发者容易把它和“内存淘汰策略”混为一谈,或者只知道 Redis 用了“定期 + 惰性”的组合,却讲不清背后的设计逻辑。先抛核心结论:Redis 的过期策略分为主动删除和被动删除两大类,实际采用“定期删除 + 惰性删除”的组合方案。主动删除解决“内存及时释放”问题,被动删除平衡"CPU 资源消耗”,二者配合实现高效的过期键管理。关联点:如果惰性删除导致大量过期键未被及时删除,会触发内存淘汰策略。Redis 的过期策略本质是"CPU 资源”和“内存资源”的平衡艺术——既要及时释放过期键占用的内存,又不能让删除操作过多消耗 CPU,影响 Redis 的响应性能。2.1 主动删除:主动出击清理过期键 主动删除是 Redis 主动扫描并删除过期键的机制,分为“定时删除”和“定期删除”两种,后者是前者的优化版。定时删除:理想但不实用的“即时清理” 「定时删除」的逻辑非常直接:当给键设置过期时间时,Redis 为该键创建一个定时器,过期时间一到就立即删除该键。比如执行 SET key value EX 10(10 秒后过期),Redis 会在设置键的同时,注册一个 10 秒后执行的删除任务。优点:内存释放及时,不会出现“过期键占用内存”的问题;正因为缺点过于明显,Redis 并没有采用定时删除策略,它仅作为一种理论方案存在。为了解决定时删除的 CPU 消耗问题,Redis 提出了“定期删除”策略,核心逻辑是:每隔固定时间,Redis 会扫描部分数据库中的过期键并删除,通过“限制扫描时长和频率”来平衡内存和 CPU 资源。触发机制:定期删除由 activeExpireCycle 函数实现,该函数被 Redis 的核心周期函数 serverCron 调用。(发布时间是 2025 年 10 月 29 日)

Redis 如何做内存优化?

Redis 如何做内存优化?\n1、Redis 的内存模型 Redis 的内存处理方式是基于"in-memory data structures"即将所有的数据都存放在内存中。如果到达了内存上限,则会发生 OOM 错误。Redis 会进行周期性的内存回收,包括 - 及不限于以下几个方面:删除过期键值 根据 LRU(Least Recently Used) 算法淘汰长时间未使用的键/值 数据库压缩 2、开启内存压缩 在 Redis 默认的内存回收机制中,虽然会清除过期的键值对,但是只有在访问键值对时才会真正删除。而如果在存储大量短生命期的数据 (比如计数器),就容易出现内存占满的情况。为了防止这种情况,可以开启 Redis 内存压缩功能,让所有键值对占用的内存更加紧凑。通过 Redis 提供的 Ziplist 和 Intset 等编码来压缩字符串和整数类型的数据。这些接口可以有效地减少 Redis 服务器上的内存使用。3、压缩字符串类型值 字符串是 Redis 最基础数据类型之一,在 Redis 中,一个字符串是一个二进制安全的序列。当需要存储大量的字符串类型的数据时,我们可以使用这些技巧:对于一些小的字符串类型值,可以使用 Redis 中的短字符串 (short string) 作为其数据结构 对于大字符串类型值,可以使用 Redis 的 sds、zmalloc_malloc()、jemalloc 等工具实现内存分配,此外还可以设置 maxmemory 参数,以定义 Redis 实例所消耗的最大内存 4、选择合适的数据结构 在 Redis 中有多种类型的数据结构可供选择。不同的数据结构之间,虽然贮存相同的数据,但它们所需的内存量可能会存在显著的差异。因此,选择最小化所需内存的数据结构非常重要。例如:在将许多非常小的 hash 数据结构存储在 Redis 中时,如果要从这些数据去除必要的分隔符,就可以使用 zipmap 格式而非 hashtable。当元素数量非常稀疏时,可以选择使用稀疏矩阵来存储数据 在需要进行 2D 和 3D 索引,以及地理数据查询时,可以使用 GeoHash 5、优化写入性能 数据的读取和存取操作是 Redis 中的两个最基本操作。系统的写入性能往往直接决定着其实际的处理能力。在常规的运行中,写入操作会因为数据的吸盘而慢慢变慢。但是我们可以通过以下几个措施来最大程度的优化 Redis 的写入性能:(来自 2025 年 10 月 31 日的资料)

FAQ

Redis 被动清理策略会立即删除过期键吗?

不会,被动清理策略(惰性删除)只有在客户端访问某个键时,Redis 才会检查该键是否过期,如果过期则直接删除。

Redis被动清理策略是什么?怎么用它自动优化存储空间?

如何优化 Redis 存储空间?

可以通过结合定期删除策略,由 serverCron 定时任务随机扫描部分键进行清理,并设置 maxmemory 参数触发内存淘汰策略。

被动清理策略有什么缺点?

Redis被动清理策略是什么?怎么用它自动优化存储空间?

可能导致内存中存在大量过期键未被及时删除,占用内存资源,极端情况下可能影响内存可用性。

定期删除的频率由什么控制?

由配置文件中的 hz 参数控制,默认值为 10,代表每秒运行 10 次,调大 hz 会增加 CPU 压力。