1. 程式人生 > >redis結合springboot設定不同快取失效配置

redis結合springboot設定不同快取失效配置

redis 設定多個快取不同時間失效 (JAVA) 

先說問題,在使用Spring Data Redis時,先設定不同cacheName 或者 key 的失效時間。官方文件中https://docs.spring.io/spring-data/redis/docs/2.0.0.RELEASE/reference/html/也只是提到Support for Spring Cache Abstraction,並沒有實際的案例。網上有的也是命令列的操作(大家都知道)。沒辦法,看文件中cache 也只提到了RedisCacheMaager這個類,那麼只能看看能不能在它上面做做文章。下面是他的幾個屬性。
使用過redis的童鞋一定會對expires這個單詞敏感,因為設定快取失效時間經常用到,下面我們就看看這個集合在哪裡被用到。
protected RedisCache createCache(String cacheName) {
    long expiration = this.computeExpiration(cacheName);
    return new RedisCache(cacheName, this.usePrefix?this.cachePrefix.prefix(cacheName):null, this.redisOperations, expiration);
}

protected long computeExpiration(String name) {
    Long expiration = null;
if(this.expires != null) { expiration = (Long)this.expires.get(name); } return expiration != null?expiration.longValue():this.defaultExpiration; }

我們可以看到computeExpiration這個方法中對其進行了使用。createCashe這個方法根據cacheName進行建立。 當然這個類也提供設定casheNames的方法。
public void setCacheNames(Collection<String> cacheNames) {
    Object newCacheNames = CollectionUtils.isEmpty(cacheNames)?Collections.emptySet():new 
HashSet(cacheNames); this.configuredCacheNames = (Set)newCacheNames; this.dynamic = ((Set)newCacheNames).isEmpty(); }
這時我們的路就越來越清晰了。只要配置自己的RedisCasheManager。方法也很簡單。
@Configuration
//@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600 * 12)
@EnableCaching
public class RedisAutoConfig extends CachingConfigurerSupport {

    @Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
//設定快取過期時間
Map<String, Long> expires = new HashMap<>();
expires.put("12h",3600 * 12L);
expires.put("1h",3600 * 1L);
expires.put("10m",60 * 5L);
rcm.setExpires(expires);
//        rcm.setDefaultExpiration(60 * 60 * 12);//秒
return rcm;
}
這樣我們就定義了3個不同失效時間的cache。(key=12h,失效時間12個小時) 然後通過@Cacheable註解就可以很方便的使用了。
@Cacheable(value = "12h", keyGenerator = "keyGenerator")
public PagingResultDTO<YearlySalesDto> queryYearlySales(@RequestBody SalesOrderQuery query) {
    PageHelper.startPage(query.getPageNum(), query.getPageSize());
    return MybatisPaginationUtil.paginationResult(salesOrderDao.queryYearlySales(query));
}