Redis 提供了多种键过期策略来管理数据的生命周期。主要的过期策略包括:
- 定时过期(TTL, Time To Live):设置键在特定的时间点或特定的时间段后自动删除。
- 惰性删除:当访问一个键时,如果发现它已经过期,则将其删除。
- 定期删除:Redis 以一定的时间间隔随机抽取一部分键,并删除其中已经过期的键。
具体使用这些策略的命令和代码示例如下:
1. 设置键的过期时间
命令
EXPIRE:设置键的过期时间(秒)。PEXPIRE:设置键的过期时间(毫秒)。EXPIREAT:设置键在指定的时间点过期(UNIX 时间戳,秒)。PEXPIREAT:设置键在指定的时间点过期(UNIX 时间戳,毫秒)。TTL:获取键的剩余过期时间(秒)。PTTL:获取键的剩余过期时间(毫秒)。PERSIST:移除键的过期时间,使其永久存在。
示例代码
java
import redis.clients.jedis.Jedis;
public class RedisExpireExample {
public static void main(String[] args) {
try (Jedis jedis = new Jedis("localhost")) {
// 设置键值
jedis.set("key1", "value1");
// 设置键的过期时间为10秒
jedis.expire("key1", 10);
System.out.println("key1 TTL: " + jedis.ttl("key1"));
// 设置键的过期时间为10毫秒
jedis.pexpire("key2", 10000);
System.out.println("key2 PTTL: " + jedis.pttl("key2"));
// 设置键在特定的时间点过期(UNIX 时间戳,秒)
long unixTime = System.currentTimeMillis() / 1000 + 20;
jedis.expireAt("key1", unixTime);
System.out.println("key1 TTL after expireAt: " + jedis.ttl("key1"));
// 设置键在特定的时间点过期(UNIX 时间戳,毫秒)
long unixTimeMs = System.currentTimeMillis() + 20000;
jedis.pexpireAt("key2", unixTimeMs);
System.out.println("key2 PTTL after pexpireAt: " + jedis.pttl("key2"));
// 移除键的过期时间
jedis.persist("key1");
System.out.println("key1 TTL after persist: " + jedis.ttl("key1"));
}
}
}
2. 检查和删除过期键
惰性删除
当你访问一个键时,如果键已经过期,Redis 会自动将其删除。
示例代码
java
import redis.clients.jedis.Jedis;
public class RedisLazyDeleteExample {
public static void main(String[] args) throws InterruptedException {
try (Jedis jedis = new Jedis("localhost")) {
// 设置键值和过期时间
jedis.set("key1", "value1");
jedis.expire("key1", 2); // 2秒过期
// 等待3秒,让键过期
Thread.sleep(3000);
// 访问键,如果键已经过期,则返回null
String value = jedis.get("key1");
if (value == null) {
System.out.println("key1 has expired and is deleted.");
} else {
System.out.println("key1: " + value);
}
}
}
}
3. 定期删除
Redis 会以一定的时间间隔随机抽取一部分键,并删除其中已经过期的键。这种策略对于程序来说是透明的,不需要显式代码来管理。
4. 组合示例
结合使用以上策略的示例代码:
java
import redis.clients.jedis.Jedis;
public class RedisExpireStrategiesExample {
public static void main(String[] args) throws InterruptedException {
try (Jedis jedis = new Jedis("localhost")) {
// 设置键值
jedis.set("key1", "value1");
// 设置键的过期时间为10秒
jedis.expire("key1", 10);
System.out.println("key1 TTL: " + jedis.ttl("key1"));
// 等待5秒
Thread.sleep(5000);
// 访问键,检查是否删除(惰性删除)
String value = jedis.get("key1");
if (value == null) {
System.out.println("key1 has expired and is deleted.");
} else {
System.out.println("key1: " + value);
}
// 等待更多的时间,让Redis的定期删除策略生效
Thread.sleep(10000);
// 检查键是否被删除
value = jedis.get("key1");
if (value == null) {
System.out.println("key1 has expired and is deleted (periodic delete).");
} else {
System.out.println("key1: " + value);
}
}
}
}
通过上述示例代码,展示了Redis中键过期策略的多种实现及其具体用法。定时过期、惰性删除和定期删除共同保证了Redis中数据的有效管理。