我希望存储在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));
}
}
请给我指出正确的方向。感谢您的帮助。
如果您想在一段时间后使缓存过期,通常人们会使用Scheduled
和cacheexecute
。因此,调度程序在一段时间后运行,并调用缓存逐出。
例如:
@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");
}
在代码中:
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