【问题标题】:How can I prevent cache override expiry time in redis如何防止redis中的缓存覆盖到期时间
【发布时间】:2026-02-11 07:00:01
【问题描述】:

我有一个名为 save 的通用方法,带有 Redis 模板:

redisTemplate.expire(cacheType.name(), redisPropertyConfiguration.getTimeToLive(), TimeUnit.MINUTES);

每次调用Redis模板的expire这个方法都会覆盖过期时间,我想防止过期时间,如果过期时间结束就放

【问题讨论】:

    标签: spring spring-boot redis spring-data


    【解决方案1】:

    这是意料之中的,因为expire(K key, long timeout, TimeUnit unit)EXPIRE Redis 命令的包装器)记录为

    为给定的键设置生存时间。

    你问:

     I wanna prevent the expiration time and put it if the expiration time end
    

    如果您在过期时间之后检查密钥,则无法防止过期。

    如果密钥已过期,您可以做的是再次添加密钥。
    在 Redis 中,命令 TTL fooKey 返回密钥的剩余生存时间。
    好消息:Spring Boot Redis 模板 API 也实现了:

    public Long getExpire(K key)

    在几秒钟内获得关键的生存时间。

    所以你可以写这样的东西:

    if (redisTemplate.getExpire(cacheType.name()) == -1L){
      // re-add the key-value
      redisTemplate.opsForValue.set(cacheType.name(), fooValue);
    }
    

    【讨论】:

    • redisTemplate.getExpire(cacheType.name()) 总是返回 (-1)
    • 如果getExpire() 返回一个否定的值,它会说要么密钥被设置为“永不过期”,要么密钥不再退出。如果您在过期时间之后检查密钥,则无法防止过期。因此,要解决您的问题,您应该添加第二次检查以在缓存键过期时重新创建它。