说说redis的过期策略以及内存淘汰机制?

1 个回答

  • 小龙女
    人面不知何处去,桃花依旧笑春风。
    Redis 使用定期删除和惰性删除相结合的策略来管理键的过期,同时提供多种内存淘汰机制来应对内存不足的情况。 #### 一、过期策略 **1. 定期删除 (Periodic Deletion)** - Redis 每隔 100ms 检查一次是否有过期的键,并删除这些过期键。 - Redis 并不会每隔 100ms 检查所有的键,而是随机抽取一部分键进行检查,以避免影响性能。 **2. 惰性删除 (Lazy Deletion)** - 当客户端尝试访问某个键时,Redis 会检查该键是否过期,如果过期则删除该键。 - 这种策略保证了即使定期删除未及时删除过期键,访问时仍能确保过期键被删除。 ### 二、内存淘汰机制 当 Redis 内存使用达到上限时,会根据配置的内存淘汰策略来选择要删除的键。Redis 提供了多种内存淘汰策略,可以通过 `redis.conf` 文件或配置命令进行配置。 #### 内存淘汰策略配置示例: ```plaintext # redis.conf 文件中配置 maxmemory 100mb # 设置最大内存使用量 maxmemory-policy allkeys-lru # 设置内存淘汰策略 ``` #### 主要内存淘汰策略: 1. **volatile-lru**: - 从设置了过期时间的键中,淘汰最近最少使用(LRU,Least Recently Used)的键。 2. **volatile-ttl**: - 从设置了过期时间的键中,淘汰将要过期的键(TTL,Time To Live)。 3. **volatile-random**: - 从设置了过期时间的键中,随机淘汰键。 4. **allkeys-lru**: - 从所有键中,淘汰最近最少使用(LRU,Least Recently Used)的键。 5. **allkeys-random**: - 从所有键中,随机淘汰键。 6. **noeviction**: - 不进行任何淘汰,当内存不足以容纳新写入数据时,新写入操作会报错。 ### 示例代码 以下是如何设置 Redis 内存淘汰策略的示例代码: ```java import redis.clients.jedis.Jedis; public class RedisConfigExample { public static void main(String[] args) { Jedis jedis = new Jedis("localhost", 6379); // 设置最大内存使用量 jedis.configSet("maxmemory", "100mb"); // 设置内存淘汰策略为 allkeys-lru jedis.configSet("maxmemory-policy", "allkeys-lru"); // 验证配置是否生效 String maxMemory = jedis.configGet("maxmemory").get(1); String policy = jedis.configGet("maxmemory-policy").get(1); System.out.println("Max Memory: " + maxMemory); System.out.println("Maxmemory Policy: " + policy); jedis.close(); } } ```
    发布于 2024-08-06 05:52 •IP属地 广东
    举报
    评论
    收藏