Spring缓存注解Cacheable, 主要几个参数说明:

  • value 即cacheName,集成ehcache时,会以该命名创建一个cache,cache中再存储不同的key-value。
  • key,缓存对象的唯一标识,集成redis时,key的定义需要严格区分,不能简单的按照某个变量来定义,因为cacheName并不能起到区分缓存的作用。
  • keyGenerator 自定义的key值生成器,下面会有demo实现。
  • cacheManager 选择指定的缓存管理器,一般使用默认管理器,不需要特别指定,
  • cacheResolver 定义如何访问缓存列表,默认SimpleCacheResolver实现,NamedCacheResolver也比较常见。
  • condition 满足缓存条件(SPEL表达式)的数据才会放入缓存,condition在调用方法之前和之后都会判断。
  • unless 用于否决缓存更新的,不同于condition,unless的SPEL表达式仅在方法执行之后判断

下面以Redis集成为例,介绍key的主要用法。 自定义KeyGenerator

@Bean
    public KeyGenerator myKeyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object o, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(o.getClass().getName());
                sb.append(method.getName());
                sb.append("(");
                for (Object param : params) {
                    sb.append(param.toString());
                    sb.append(",");
                }
                sb.append(")");
                return sb.toString();
            }
        };
    }

固定key示例

 @Cacheable(value = CacheConsts.MASTER_SYSTEMCONFIG_CACHE_KEY, key = "'SYSTEMCONFIG_MAP'")
    public Map<String, SystemConfigDto> loadSystemConfigMap() {

变量key示例

 @Cacheable(value = CacheConsts.WS_FILTER_TIME_KEY, key = CacheConsts.WS_FILTER_TIME_KEY + "#appId")
    public List<WsTimeFilterDto> loadByAppId(String appId) {
 @Cacheable(value = CacheConsts.MASTER_CITY_CACHE_KEY, key = CacheConsts.MASTER_CITY_CACHE_KEY + "#exchangeRateEntity.currency")
    public List<ExchangeRateEntity> loadExchangeRate(ExchangeRateEntity exchangeRateEntity) {

自定义Key示例 @Cacheable(value = CacheConsts.WS_PRICE_RULE_KEY, keyGenerator = "myKeyGenerator")

condition示例

  @Cacheable(value = CacheConsts.MASTER_CITY_CACHE_KEY, key = CacheConsts.MASTER_CITY_CACHE_KEY + "#exchangeRateEntity.currency",condition = "#exchangeRateEntity.currency ne  'CNY' ")
    public List<ExchangeRateEntity> loadExchangeRate(ExchangeRateEntity exchangeRateEntity) {