分几篇文章总结 spring-boot与 Redis的整合
1、redis的安装
2、redis的设置
3、spring-boot的缓存
4、自定义key
5、spring-boot引入redis
spring-boot对缓存的支持非常不错,少量的配置即可完成。
支持的缓存类型
spring-boot支持的缓存类型如下:
- Generic
- JCache (JSR-107) (EhCache 3, Hazelcast,Infinispan, etc)
- EhCache 2.x
- Hazelcast
- Infinispan
- Couchbase
- Redis
- Caffeine
- Guava (deprecated)
- Simple
这里有两点需要说明:1、如果没有显示指明所用的缓存,spring-boot会通过扫描classpath去寻找引入的jar包,并按照上面提到的缓存类型从上到下的优先级,把该类型的缓存作为使用的缓存。比如在classpath同时扫描到JCache和Redis的jar包,则把JCache作为缓存。2、Simple为spring通过CurrentHashMap实现的缓存,由于是CurrentHashMap实现的,所以自然是线程安全的。
配置方式
配置方式支持xml,properties,yml,和javaconfig。其配置项由所用的缓存的不同而不同。这篇文章将用javaconfig的方式据一个配置Simple缓存的例子。
虽然由于不同的缓存,配置方式不同,但是在缓存管理方面,spring-boot是遵从JSR-107标准的。也就是需要一个CacheManager去管理多个Cache。你可以通过配置去指定CacheManager和Cache。当然你也可以自己实现CacheManager。
使用方式
使用方式非常简单,只需要使用如下几个声明式注释即可。
@Cacheable 用来标明该方法返回的结果是否被缓存,或者通过缓存返回结果
其提供的参数有
value:缓存名,也就是cacheManager中缓存的名字,可以指定多个
cacheNames:和value一样
key:key的作用为,在同一个缓存中,用来识别缓存数据的。这里是指定key的值,可以使用spel表达式
keyGenerator:你可以定义一个keyGenerator,可以实现生成key的逻辑
cacheManager:可以指定cacheManager,比如你有个name为area的cache在MyCacheManager中。你在配置时,配置的cacheManager为SimpleCacheManager,其
中没有area缓存,那么就可以指定该参数为MyCacheManager
cacheResolver:可以指定cacheManager的获得cache的逻辑
condition:spel表达式,加入缓存的条件,在方法执行前,后判断
unless:spel表达式,和condition相反,只在方法执行之后判断
@CachePut 用来表明该方法的结果是否更新到缓存中
其提供的参数和@Cacheable一样
@CacheEvict 用来表明该方法的结果是否从缓存中移除
其提供的参数和@Cacheable一样,并多了以下参数
allEntries:移除该缓存中的所有数据
beforeInvocation:移除缓存在调用方法之前,默认为false,即方法成功调用之后才移除缓存
例子
举一个配置SimpleCacheManager的例子
@EnableCaching
@Configuration
public class SimpleCacheConfiguration {
@Bean
public CacheManager simpleCacheManager(){
SimpleCacheManager simpleCacheManager=new SimpleCacheManager();
//simpleCacheManager.setCaches(Collections.singletonList(new ConcurrentMapCache("authTree")));
List<ConcurrentMapCache> caches=new ArrayList<ConcurrentMapCache>();
caches.add(new ConcurrentMapCache("user"));
caches.add(new ConcurrentMapCache("authTree"));
caches.add(new ConcurrentMapCache("auth"));
caches.add(new ConcurrentMapCache("role"));
caches.add(new ConcurrentMapCache("vehicle"));
caches.add(new ConcurrentMapCache("vehicleApply"));
caches.add(new ConcurrentMapCache("vehicleApplyCollection"));
caches.add(new ConcurrentMapCache("msgBox"));
caches.add(new ConcurrentMapCache("report"));
caches.add(new ConcurrentMapCache("breakRule"));
caches.add(new ConcurrentMapCache("deviceParam"));
caches.add(new ConcurrentMapCache("device"));
caches.add(new ConcurrentMapCache("driver"));
caches.add(new ConcurrentMapCache("route"));
caches.add(new ConcurrentMapCache("area"));
caches.add(new ConcurrentMapCache("system"));
List<ConcurrentMapCache> cachesWrapper=Collections.unmodifiableList(caches);
simpleCacheManager.setCaches(cachesWrapper);
return simpleCacheManager;
}
}
这里的cache也可以通过spring.cache.cache-name在properties或者yml中来配置,比如:
spring.cache.cache-name:user,authTree,auth,role,vehicle,vehicleApply,vehicleApplyCollection,msgBox,report,breakRule,deviceParam,device,driver,route,area,system