Кэш Redis не очищается несмотря на настройку TTL - PullRequest
0 голосов
/ 14 мая 2018

Я хочу, чтобы данные, хранящиеся в кеше redis, автоматически удалялись из кеша по истечении заданного периода, не вызывая для него метод удаления. В этом POC я устанавливаю TTL как 60 секунд. Я попытался установить его в диспетчере кэша, используя API setDefaultExpiration, 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 ]

0 голосов
/ 14 мая 2018

Если вы хотите, чтобы срок действия кэша истек через некоторое время, обычно люди используют 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");
}
0 голосов
/ 14 мая 2018

В вашем коде:

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

Таким образом, вы хотите использовать ключ в хэше. Но, к сожалению, это невозможно сделать с помощью стандартной команды redis.

Ссылка

...