在将Redis缓存与Redis结合使用时,请在特定时间设置到期密钥

时间:2018-08-02 18:33:15

标签: redis spring-data-redis spring-cache

我正在春季缓存抽象注释,以将缓存应用于我的服务方法。

由于我将Redis用作缓存存储,因此我想使用在特定时间使缓存过期的选项,因为Redis支持该选项。 redis中的expireat命令可用于设置将来的到期时间。

我不确定使用RedisCache时如何对属于缓存的键进行操作。

我试图通过创建一个bean来自定义RedisCacheManager。

我看到公开了一个getNativeCache()方法。但是我找不到任何使用它设置expireat值的方法。

如果有一种自定义RedisCacheManager的方法,以便特定缓存的所有键在到期时使用同一时间,请告诉我。

2 个答案:

答案 0 :(得分:1)

@Bean (name="cacheManager")
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
    RedisCacheConfiguration conf_ready_info = RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMillis(50000));

    RedisCacheConfiguration conf_base_info = RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMillis(60000));

    Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<String, RedisCacheConfiguration>();
    cacheConfigurations.put("base_info", conf_base_info);
    cacheConfigurations.put("ready_info", conf_ready_info);

    return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(connectionFactory)
            .withInitialCacheConfigurations(cacheConfigurations).build();
}


@Cacheable(value = "ready_info", key = "#aid")
public String  findByAid(String aid) throws Exception { 
    String readyInfo = "";
    return readyInfo;
}

答案 1 :(得分:0)

实际上是。请检查以下内容:

RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig()
            .disableCachingNullValues()
            .entryTtl(<your duration>)
            .computePrefixWith(CacheKeyPrefix.simple())
            .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory)
            .cacheDefaults(configuration)
            .build();

我正在使用2.0.4.RELEASE版本的spring boot。如果您使用的是旧版本,请按以下步骤操作:

RedisCacheManager cacheManager =
            new RedisCacheManager(
                    redisTemplate,//redis template
                    Arrays.asList("my-cahce"),//loads these caches at startup
                    false);//Do not allow null values
    cacheManager.setLoadRemoteCachesOnStartup(true);
    cacheManager.setCachePrefix(new DefaultRedisCachePrefix());
    cacheManager.setDefaultExpiration(TimeUnit.SECONDS.convert(365, TimeUnit.DAYS));