当前位置: 首页 > 知识库问答 >
问题:

尽管设置了TTL,Redis缓存仍未被清除

越雨泽
2023-03-14

我希望存储在redis缓存中的数据在给定的时间段后自动从缓存中清除,而无需对其调用delete方法。在这个POC中,我将TTL设置为60秒。我曾尝试在缓存管理器中使用API SetDefaultExpire、setExpires设置它,并在RedisTemplate中使用API expire设置它。到目前为止,没有一个解决方案对我有效。

@Configuration
public class RedisServerConfig extends CachingConfigurerSupport {
    @Bean
    public RedisTemplate<String, String> redisTemplate() {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
    @Bean
    public CacheManager cacheManager(RedisTemplate<String, String> redisTemplate) {
        RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate);
        redisCacheManager.setUsePrefix(true);
        redisCacheManager.setCacheNames(cacheNames);
        redisCacheManager.setTransactionAware(true);
        redisCacheManager.setLoadRemoteCachesOnStartup(true);

        // Using setDefaultExpiration
        //redisCacheManager.setDefaultExpiration(60);

        // Using setExpires
        //Map<String, Long> expires = new HashMap<>();
        //cacheNames.stream().forEach(name->expires.put(name, 60L));
        //redisCacheManager.setExpires(expires);
        return redisCacheManager;
    }
    @Bean
    public RedisConnectionFactory connectionFactory() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(maxTotal);
        poolConfig.setMaxIdle(maxIdle);
        poolConfig.setMinIdle(minIdle);
        poolConfig.setTestOnBorrow(true);
        poolConfig.setTestOnReturn(true);
        poolConfig.setTestWhileIdle(true);
        poolConfig.setMaxWaitMillis(secondsToWait);
        JedisConnectionFactory factory = new JedisConnectionFactory(sentinelConfig(), poolConfig);
        factory.setUsePool(true);
        factory.setPassword(redisPassword);
        factory.setPort(redisPort);

        return factory;
    }
}

在使用的redis存储库中,

@Repository
public class RedisRepository {
    private static final Logger logger = LoggerFactory.getLogger(RedisRepositoryImpl.class);
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    public void saveSharedSecret(String customerNumber, String sharedSecret) {
        redisTemplate.opsForHash().put(MfaConstants.REDIS_SHAREDSECRET_REGION, myKey, myValue);
        redisTemplate.expire(myKey, 1, TimeUnit.MINUTES);

        // The timeOut obtained here is zero
        logger.info("myKey: [{}], timeOut: [{}]", myKey, redisTemplate.getExpire(myKey, TimeUnit.SECONDS));
    }
}

请给我指出正确的方向。感谢您的帮助。

共有2个答案

邰棋
2023-03-14

如果您想在一段时间后使缓存过期,通常人们会使用Scheduledcacheexecute。因此,调度程序在一段时间后运行,并调用缓存逐出。

例如:

@Cacheable(value = "parameters-all")
public List<ParametroResponse> getAll() {
    return repository.findAll();
}

@CacheEvict(allEntries = true, cacheNames = { "parameters-all" })
@Scheduled(fixedDelayString = "${spring.cache.redis.ttl}")
public void cacheEvict() {
    log.info("parameters-all cache evict");
}
袁华清
2023-03-14

在代码中:

redisTemplate.opsForHash().put(MfaConstants.REDIS_SHAREDSECRET_REGION, myKey, myValue);
redisTemplate.expire(myKey, 1, TimeUnit.MINUTES);

所以基本上你想让散列中的密钥过期。但不幸的是,这不能用标准的redis命令来完成。

参考

 类似资料:
  • 问题内容: 我正在尝试将IBM的CPLEX库与我的Java应用程序集成。现在,我只是试图创建一个IloCplex对象。我添加了Cplex.jar,它可以很好地编译,但是当我运行它时: Cplex在抛出异常之前打印此消息: 我通过这个参数给JVM: 。这是cplex124.dll的位置。我看过的每个教程都给出了相同的步骤,我觉得自己很好地遵循了它们。 我究竟做错了什么?? 问题答案: 我在互连网上发

  • 问题内容: 我不明白…是我还是这是节点中的错误? 可以按预期进行: 这发出了警告: 我懂了 问题答案: 使用与承诺回报新希望(这就是所谓的链接)。因此,当您执行以下操作时: 您的最初承诺在哪里,您将在第1行上创建一个新的承诺(现在不再存在。我们称它为 )。因此,即使您使用with ,也不会处理上的拒绝,这解释了您在控制台上看到的消息。 为了避免出现此消息,您应该在第1行的新承诺中添加a

  • 我注意到Docker似乎在使用大量磁盘空间。我可以看到目录。docker/machine/machines/default是27.4GB 我最近清理了我没有使用的所有图像和容器。现在,当我运行时,我看到没有图像正在运行。 我还可以看到我有2个容器可用。 然后我可以看到我有3个图像。 它们怎么会占用近30GB的空间?

  • 周日快乐, 我为运行在Ubuntu 16上Azure上的Bitnami lamp打包实例上的缓存管理苦苦挣扎了3天(担心到月底会变得更大胆)。十、 我从事一个PHP5到PHP7迁移的大系统已经有几个星期了,即将完成任务。 我使用该系统的测试站点可在以下位置访问:https://stephanedeluca.com让你看看缓存。 不幸的是,我看到的是,我的PHP脚本没有立即反映我在部署(简单上传)到

  • 问题内容: 我是Laravel的新手。我已经对该主题进行了研究,但似乎找不到找到可以解决问题的答案。 我知道Laravel的默认缓存驱动程序设置为 file ,可以更改。它还有一些手工缓存命令,例如: 1) 即使Laravel具有一些自动处理某些缓存的内置命令和功能(无法确切了解哪些部分),我仍然必须在查询结果上手动使用Cache Facade,对吗? 它不会自动执行操作,仅在我想更改某些内容时才

  • 本文向大家介绍Spring Cache手动清理Redis缓存,包括了Spring Cache手动清理Redis缓存的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Spring Cache手动清理Redis缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 注册cacheRedisTemplate 将 cache 的 RedisTemp