Redis(106)Redis的键过期策略有哪些?

Redis 提供了多种键过期策略来管理数据的生命周期。主要的过期策略包括:

  1. 定时过期(TTL, Time To Live):设置键在特定的时间点或特定的时间段后自动删除。
  2. 惰性删除:当访问一个键时,如果发现它已经过期,则将其删除。
  3. 定期删除: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中数据的有效管理。

相关推荐
码事漫谈1 小时前
告别数据孤岛与AI“水土不服”:金仓多模融合时序库如何让数据真正服务于业务
后端
IT_陈寒1 小时前
Redis的持久化配置把我坑惨了:你以为数据安全了?
前端·人工智能·后端
星栈1 小时前
Node 接口该写同步还是异步?
后端·node.js
红烧大青虫2 小时前
HarmonyOS应用开发实战:小事记 - UIAbility 的冷启动/热启动/后台启动三种场景与 launchParam 解析
后端·华为·harmonyos·鸿蒙系统
码事漫谈2 小时前
AI Token 缓存:命中省 10 倍,不命中白扔钱
后端
65岁退休Coder2 小时前
LangChain v1.3.4 笔记 - 04 Agent 中间件
后端
神奇小汤圆3 小时前
一个接口多个实现,Spring 怎么"适配多场景"?
后端
花开彼岸天~3 小时前
鸿蒙原生开发手记:徒步迹 - 自定义组件开发规范
后端·华为·harmonyos·鸿蒙系统
songroom4 小时前
Kimi K3:Rust封装XTP接口详细教程实践
开发语言·后端·rust
kebeiovo4 小时前
游戏服务端开发:Actor模型详解(Go语言)
开发语言·后端·golang