Java Spring-Cache key配置注意事项介绍

 更新时间:2017年10月17日 08:36:34   作者:liuyazhuang  
本文主要对java spring-cache key配置注意事项进行了介绍,小编觉得还是挺不错的,这里分享给大家,供需要的朋友参考。

为了提升项目的并发性能,考虑引入本地内存Cache,对:外部数据源访问、Restful API调用、可重用的复杂计算 等3种类型的函数处理结果进行缓存。目前采用的是spring Cache的@Cacheable注解方式,缓存具体实现选取的是Guava Cache。
具体缓存的配置此处不再介绍,重点对于key的配置进行说明:

1、基本形式

@Cacheable(value="cacheName", key"#id")  
public ResultDTO method(int id);  

2、组合形式

@Cacheable(value="cacheName", key"T(String).valueOf(#name).concat('-').concat(#password))  
public ResultDTO method(int name, String password);  

3、对象形式

@Cacheable(value="cacheName", key"#user.id) 
public ResultDTO method(User user); 

4、自定义key生成器

@Cacheable(value="gomeo2oCache", keyGenerator = "keyGenerator") 
public ResultDTO method(User user); 

注意:Spring默认的SimpleKeyGenerator是不会将函数名组合进key中的

如下:

@Component 
public class CacheTestImpl implements CacheTest { 
  @Cacheable("databaseCache") 
  public Long test1() 
  { return 1L; } 
  @Cacheable("databaseCache") 
  public Long test2() 
  { return 2L; } 
  @Cacheable("databaseCache") 
  public Long test3() 
  { return 3L; } 
  @Cacheable("databaseCache") 
  public String test4() 
  { return "4"; } 
} 

我们期望输出:

1 
2 
3 
4

实际却输出:

1 
1 
1 
ClassCastException: java.lang.Long cannot be cast to java.lang.String 

此外,原子类型的数组,直接作为key使用也是不会生效的

为了解决上述2个问题,自定义了一个KeyGenerator如下:

class CacheKeyGenerator implements KeyGenerator { 
  // custom cache key 
  public static final int NO_PARAM_KEY = 0; 
  public static final int NULL_PARAM_KEY = 53; 
  @Override 
  public Object generate(Object target, Method method, Object... params) { 
    StringBuilder key = new StringBuilder(); 
    key.append(target.getClass().getSimpleName()).append(".").append(method.getName()).append(":"); 
    if (params.length == 0) { 
      return key.append(NO_PARAM_KEY).toString(); 
    } 
    for (Object param : params) { 
      if (param == null) { 
        log.warn("input null param for Spring cache, use default key={}", NULL_PARAM_KEY); 
        key.append(NULL_PARAM_KEY); 
      } else if (ClassUtils.isPrimitiveArray(param.getClass())) { 
        int length = Array.getLength(param); 
        for (int i = 0; i < length; i++) { 
          key.append(Array.get(param, i)); 
          key.append(','); 
        } 
      } else if (ClassUtils.isPrimitiveOrWrapper(param.getClass()) || param instanceof String) { 
        key.append(param); 
      } else { 
        log.warn("Using an object as a cache key may lead to unexpected results. " + 
            "Either use @Cacheable(key=..) or implement CacheKey. Method is " + target.getClass() + "#" + method.getName()); 
        key.append(param.hashCode()); 
      } 
      key.append('-'); 
    } 
    String finalKey = key.toString(); 
    long cacheKeyHash = Hashing.murmur3_128().hashString(finalKey, Charset.defaultCharset()).asLong(); 
    log.debug("using cache key={} hashCode={}", finalKey, cacheKeyHash); 
    return key.toString(); 
  } 
} 

采用此方式后可以解决:多参数、原子类型数组、方法名识别 等问题

总结

以上就是本文关于Java Spring-Cache key配置注意事项介绍的全部内容,感兴趣的朋友可以继续参阅:spark之Standalone模式部署配置详解struts2开发流程及详细配置Java之Spring注解配置bean实例代码解析等,如有不足之处,欢迎留言指出,小编会及时回复大家并修正,给广大编程爱好者提供更好的阅读体验,希望对大家有所帮助。在此也非常希望朋友们对本站多多支持!

相关文章

  • java+selenium爬取图片签名的方法

    java+selenium爬取图片签名的方法

    这篇文章主要为大家详细介绍了java+selenium爬取图片签名的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • 详解Java序列化如何破坏单例模式

    详解Java序列化如何破坏单例模式

    这篇文章主要为大家详细介绍了Java序列化是如何破坏单例模式的,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以学习一下
    2023-12-12
  • java实现邮件发送详解

    java实现邮件发送详解

    这篇文章主要为大家详细介绍了java实现邮件发送示例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • SpringBoot中Zookeeper分布式锁的原理和用法详解

    SpringBoot中Zookeeper分布式锁的原理和用法详解

    Zookeeper是一个分布式协调服务,它提供了高可用、高性能、可扩展的分布式锁机制,SpringBoot是一个基于Spring框架的开发框架,它提供了对Zookeeper分布式锁的集成支持,本文将介绍SpringBoot中的 Zookeeper分布式锁的原理和使用方法,需要的朋友可以参考下
    2023-07-07
  • Java的JSON转换类库GSON的基础使用教程

    Java的JSON转换类库GSON的基础使用教程

    GSON是谷歌开源的一款Java对象与JSON对象互相转换的类库,Java的JSON转换类库GSON的基础使用教程,需要的朋友可以参考下
    2016-06-06
  • SpringBoot使用flyway初始化数据库

    SpringBoot使用flyway初始化数据库

    这篇文章主要介绍了SpringBoot如何使用flyway初始化数据库,帮助大家更好的理解和学习使用SpringBoot框架,感兴趣的朋友可以了解下
    2021-03-03
  • IDEA POM文件配置profile实现不同环境切换的方法步骤

    IDEA POM文件配置profile实现不同环境切换的方法步骤

    这篇文章主要介绍了IDEA POM文件配置profile实现不同环境切换的方法步骤
    2024-03-03
  • Java Spring Boot实现简易扫码登录详解

    Java Spring Boot实现简易扫码登录详解

    这篇文章主要为大家详细介绍了java Spring Boot实现app扫码登录功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-09-09
  • 详解Java的Hibernate框架中的Interceptor和Collection

    详解Java的Hibernate框架中的Interceptor和Collection

    这篇文章主要介绍了Java的Hibernate框架中的Interceptor和Collection,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2016-01-01
  • 详解Java中多进程编程的实现

    详解Java中多进程编程的实现

    这篇文章主要介绍了详解Java中多进程编程的实现,和多线程一样,多进程同样是实现并发的一种方式,需要的朋友可以参考下
    2015-11-11

最新评论