尽管设置了 TTL,但 Redis 缓存未被清除
Redis cache not being cleared despite setting TTL
我希望存储在redis缓存中的数据在给定时间后自动从缓存中清除,而不调用其上的delete方法。在此 POC 中,我将 TTL 设置为 60 秒。我尝试使用 API setDefaultExpiration、setExpires 在缓存管理器中设置它,并在 RedisTemplate 中使用 API 过期设置它。到目前为止,None 个解决方案对我有用。
@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));
}
}
请指点我正确的方向。感谢任何帮助。
在您的代码中:
redisTemplate.opsForHash().put(MfaConstants.REDIS_SHAREDSECRET_REGION, myKey, myValue);
redisTemplate.expire(myKey, 1, TimeUnit.MINUTES);
所以基本上你想要使散列中的键过期。但不幸的是,它不能使用标准的 redis 命令来完成。
如果您想在一段时间后使缓存过期,usually the people use Scheduled
和 CacheEvict
。因此,调度程序 运行 一段时间后调用缓存逐出。
例如:
@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");
}
我希望存储在redis缓存中的数据在给定时间后自动从缓存中清除,而不调用其上的delete方法。在此 POC 中,我将 TTL 设置为 60 秒。我尝试使用 API setDefaultExpiration、setExpires 在缓存管理器中设置它,并在 RedisTemplate 中使用 API 过期设置它。到目前为止,None 个解决方案对我有用。
@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));
}
}
请指点我正确的方向。感谢任何帮助。
在您的代码中:
redisTemplate.opsForHash().put(MfaConstants.REDIS_SHAREDSECRET_REGION, myKey, myValue);
redisTemplate.expire(myKey, 1, TimeUnit.MINUTES);
所以基本上你想要使散列中的键过期。但不幸的是,它不能使用标准的 redis 命令来完成。
如果您想在一段时间后使缓存过期,usually the people use Scheduled
和 CacheEvict
。因此,调度程序 运行 一段时间后调用缓存逐出。
例如:
@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");
}