目录
在使用 Redis 时,一个常见的问题是:Redis 中 key 过期了一定会立即删除吗?答案是否定的。
Redis 对于过期 key 的删除策略主要有两种:惰性删除和定期删除,这两种策略相结合来保证过期 key 的清理。
一、惰性删除
当 Redis 中的 key 过期后,并不会马上被清除。而是在有请求访问这个 key 的时候,Redis 才会去删除它。例如,以下是一个使用 Java 连接 Redis 并可能触发惰性删除的示例代码:
import redis.clients.jedis.Jedis;
public class RedisLazyDeletionExample {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
// 设置一个 key 并设置过期时间
jedis.setex("myKey", 10, "value");
// 等待一段时间,让 key 过期
try {
Thread.sleep(11000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 此时如果没有访问,key 不会被删除
System.out.println("Before access: " + jedis.exists("myKey"));
// 访问 key,触发惰性删除
System.out.println(jedis.get("myKey"));
System.out.println("After access: " + jedis.exists("myKey"));
jedis.close();
}
}
二、定期删除
Redis 在后台会定期地去删除过期的 key。默认情况下,大约每隔 100ms,Redis 会扫描一次过期的 key,然后进行删除。这个扫描的间隔频率可以通过一些参数进行调整。但是,定期删除并不是一次性把所有过期的 key 全部拿出来删除,而是定期随机抽取一部分 key 去做删除。
如果只是采用惰性删除,当有 key 过期后一直没有被访问,那么这个 key 就会一直占用内存。结合定期删除策略,可以在一定程度上清理这些未被访问的过期 key。
然而,即使有这两种删除策略,Redis 中的过期 key 也不会立即被完全删除。这可能会导致在某些情况下,即使删除了很多 key,但 Redis 的内存使用率还是很高。例如,在短时间内删除了巨量的过期 key,可能由于删除机制的原因,内存占用并没有立即下降。
了解 Redis 过期 key 的删除机制,可以帮助我们更好地理解 Redis 的内存管理,在实际应用中遇到类似问题时能够快速定位原因。