Redis的内存淘汰策略是怎么样的?

1 个回答

  • 鬼厉
    永远喜欢简单而真诚的人。
    Redis 提供了多种内存淘汰策略(eviction policy),用来管理当 Redis 内存达到最大限制时,如何处理新的写入操作。Redis 的内存淘汰策略可以通过配置 `maxmemory` 参数来指定最大内存限制,并通过 `maxmemory-policy` 配置来选择淘汰策略。 ### Redis 内存淘汰策略 Redis 提供了以下几种内存淘汰策略,每种策略的行为不同,适用于不同的场景: #### 1. **noeviction** - **说明**:当达到 `maxmemory` 限制时,不会执行任何淘汰策略,新的写操作会导致错误。 - **使用场景**:适用于对数据持久化和一致性要求较高的场景,在内存不足时宁可报错,也不丢弃任何数据。 - **适用情况**:如果你有重要的数据需要保持,不希望 Redis 丢弃任何键值。 #### 2. **volatile-lru** - **说明**:仅对设置了 **过期时间(expire)** 的键应用 LRU(Least Recently Used,最近最少使用)策略。当内存不足时,Redis 会淘汰最少使用的过期键。 - **使用场景**:适用于你希望对过期数据进行自动清理的场景,并且不希望丢弃常用的数据。 - **适用情况**:缓存过期数据时,优先淘汰过期的数据,保留常用的数据。 #### 3. **allkeys-lru** - **说明**:对所有的键都应用 LRU 策略,不管这些键是否设置了过期时间。内存不足时,Redis 会淘汰最少使用的键。 - **使用场景**:适用于你希望对所有数据应用 LRU 策略的场景,不管数据是否过期。 - **适用情况**:在内存资源有限的情况下,保持最常用的数据,淘汰不常用的数据。 #### 4. **volatile-ttl** - **说明**:仅对设置了 **过期时间(expire)** 的键应用 TTL(Time To Live,生存时间)策略。当内存不足时,Redis 会淘汰那些剩余有效时间最短的过期键。 - **使用场景**:适用于当内存不足时,优先淘汰即将过期的数据。 - **适用情况**:当你希望优先清除即将过期的键时,可以使用此策略。 #### 5. **allkeys-random** - **说明**:对所有键都应用随机策略,当内存不足时,Redis 会随机选择一个键进行淘汰。 - **使用场景**:适用于你不关心特定键是否被淘汰的场景,只要 Redis 在内存满时能够自动清理某些数据。 - **适用情况**:内存不够用时,随机删除一些键来释放内存。 #### 6. **volatile-random** - **说明**:仅对设置了 **过期时间(expire)** 的键应用随机淘汰策略。当内存不足时,Redis 会随机选择一个过期的键进行淘汰。 - **使用场景**:适用于你只关心过期数据的自动淘汰,但不关心淘汰的具体键。 - **适用情况**:当你有一些缓存数据,且对淘汰的键不敏感时,选择这个策略。 #### 7. **volatile-lfu (从 Redis 4.0 引入)** - **说明**:仅对设置了 **过期时间(expire)** 的键应用 LFU(Least Frequently Used,最不常用)策略。当内存不足时,Redis 会淘汰使用频率最低的过期键。 - **使用场景**:适用于缓存场景中需要保留频繁访问的数据,丢弃较少使用的数据。 - **适用情况**:保留访问频繁的缓存数据,淘汰不常用的过期数据。 #### 8. **allkeys-lfu (从 Redis 4.0 引入)** - **说明**:对所有键应用 LFU 策略,不管这些键是否设置了过期时间。内存不足时,Redis 会淘汰使用频率最低的键。 - **使用场景**:适用于希望对所有键应用 LFU 策略的场景,无论数据是否过期。 - **适用情况**:适用于对数据访问频率较高的数据进行保留,淘汰频率较低的数据。 ### 配置方式 你可以通过修改 Redis 配置文件(`redis.conf`)来设置内存淘汰策略,也可以在运行时使用 `CONFIG SET` 命令来动态调整。 #### 在配置文件中设置 ```bash maxmemory 100mb maxmemory-policy allkeys-lru ``` #### 在运行时设置 ```bash CONFIG SET maxmemory 100mb CONFIG SET maxmemory-policy allkeys-lru ``` ### 总结 Redis 提供了多种内存淘汰策略,用户可以根据实际需求选择合适的策略: - **noeviction**:不淘汰数据,内存满时返回错误。 - **volatile-lru**、**allkeys-lru**:基于 LRU 策略淘汰最少使用的数据。 - **volatile-ttl**:根据 TTL 优先淘汰即将过期的键。 - **allkeys-random**、**volatile-random**:随机淘汰数据。 - **volatile-lfu**、**allkeys-lfu**:基于 LFU 策略淘汰最不常用的数据。
    发布于 2025-02-24 22:43 •IP属地 山东
    举报
    评论
    收藏