springboot 集成缓存jetcache

springboot 集成缓存jetcache

前言

为什么不使用 spring cache?

最开始使用的spring cache,但是由于springcache只支持全局的缓存过期时间设置,不支持单个设置缓存过期时间,且jetcache支持三种缓存方式LOCAL/REMOTE/BOTH 三种选择, 分别代表本地内存/远程 Cache Server(如Redis)/两级缓存。
下面以redis为存储,springboot整合jetcache。

JetCache简介

JetCache 是由阿里巴巴开源的一款通用缓存访问框架。官方文档说明JetCache 提供的核心能力包括:

  • 提供统一的,类似jsr-107风格的API访问Cache,并可通过注解创建并配置Cache实例
  • 通过注解实现声明式的方法缓存,支持TTL和两级缓存
  • 分布式缓存自动刷新,分布式锁 (2.2+)
  • 支持异步Cache API
  • Spring Boot支持
  • Key的生成策略和Value的序列化策略是可以定制的
  • 针对所有Cache实例和方法缓存的自动统计
    image.png

springboot +JetCache 使用

1、引入pom依赖

 	<dependency>
            <groupId>com.alicp.jetcache</groupId>
            <artifactId>jetcache-starter-redis</artifactId>
            <version>2.5.11</version>
        </dependency>

2、增加jetCache的缓存配置

 jetcache:
  statIntervalMinutes: 15
  areaInCacheName: false
  local:
    default:
      type: linkedhashmap
      keyConvertor: fastjson
    otherCacheName:
      type: xxx
      keyConverter: yyy
  remote:
    default:
      type: redis
      keyConvertor: fastjson
      valueEncoder: java
      valueDecoder: java
      poolConfig:
        minIdle: 5
        maxIdle: 20
        maxTotal: 50
      host: 127.0.0.1
      port: 6379
      password: redis

3、 在启动类上增加注解

EnableMethodCache,EnableCreateCacheAnnotation这两个注解分别激活Cached和CreateCache注解,其他和标准的Spring Boot程序是一样的。这个类可以直接main方法运行。

@SpringBootApplication
@EnableMethodCache(basePackages = "cn.fengpt")
@EnableCreateCacheAnnotation
public class CloudServiceAuthApplication {
    public static void main(String[] args) {
        SpringApplication.run(CloudServiceAuthApplication.class, args);
    }
}

其中需要注意的是:

  • 增加注解EnableMethodCache,并制定开启缓存对应的包路径。
  • 增加注解EnableCreateCacheAnnotation,这个注解是开启对应的CreateCache注解。

4、两种缓存的使用

1).自定义缓存的方式,@CreateCache注解创建一个缓存实例

JetCache中提供了@createCache的注解的支持,可以自己定义的cache,灵活性比较高,下面讲一下具体的用法
加入createCache的支持----@EnableCreateCacheAnnotation

@CreateCache(expire = 100)
private Cache<Long, UserDO> userCache;

用起来就像map一样,注意对象实现可序列化接口。

UserDO user = userCache.get(123L);
userCache.put(123L, user);
userCache.remove(123L);

创建一个两级(内存+远程)的缓存,内存中的元素个数限制在50个。

@CreateCache(name = "UserService.userCache", expire = 100, cacheType = CacheType.BOTH, localLimit = 50)
private Cache<Long, UserDO> userCache

2)创建方法缓存

实现方式是spring aop,采用注解的方式@cache
JetcacheService :

public interface JetcacheService {

    @Cached(name = "sys_user_cache_", expire = 3600)
    SysUserDTO getUserById(Long id);

}

JetcacheServiceImpl :

@Service
public class JetcacheServiceImpl implements JetcacheService {
    @Override
    public SysUserDTO getUserById(Long id) {
        SysUserDTO sysUserDTO=new SysUserDTO();
        sysUserDTO.setId(1L);
        sysUserDTO.setUserName("A");
        System.out.println("查数据库");
        return sysUserDTO;
    }
}

调用接口测试:
image.png

注意:
@Cached定义在接口上的坑
还有一个呢就是@Cached如果定义在接口上就不能指定key属性,框架中会自动根据参数生成key, 如果非得自己用SPEL表达式指定key的话,项目编译设置target必须为1.8格式,并且指定javac的-parameters参数,否则就要使用key="args[0]"这样按下标访问的形式
Cached参数说明:

  • name
    缓存名称
  • key
    缓存key,追加到name后面构成唯一的缓存key, 使用SpEL指定key,如果没有指定会根据所有参数自动生成。
  • expire
    缓存失效时间
  • cacheType
    缓存的类型,包括CacheType.REMOTE、CacheType.LOCAL、CacheType.BOTH。如果定义为BOTH,会使用LOCAL和REMOTE组合成两级缓存

更多配置的介绍请查看文档:https://github.com/alibaba/jetcache/wiki/MethodCache_CN

JetCache还有一个优点不得不提,这也是在应用之后不经意之间发现的,那就是JetCache的统计报表功能
image.png