简单实现
1.在项目的pom.xml中引入spring-cache和redis的相关包
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- springboot-cache -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2.为缓存建立对应的config类,实现bean.
/**
* redis全局配置
* redis默认生成的bean是RedisTemplate<Object, Object>
* 如果洗完实现其他类型的bean,需要手动生成
*/
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{
/**
* 主键生成策略
*/
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
System.out.println("key "+sb.toString());
return sb.toString();
}
};
}
/**
* 缓存bean
* yaoyz 2018年4月14日
*/
@Bean
public CacheManager cacheManager(RedisTemplate<Object, Object> redisTemplate) {
RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
//设置缓存过期时间
//rcm.setDefaultExpiration(60);//秒
return rcm;
}
}
3.在control方法上添加对应的注解,实现缓存。
/**
* 使用spring-cache,可以对方法或者类进行缓存
* yaoyz 2018年4月12日
*/
@RequestMapping(value = "/testCache",method = RequestMethod.POST)
@Cacheable(value="cachemethod")
public String testCache(){
System.out.println("执行了方法-----");
return "success";
}
4.直接启动application,第一次会执行对应的方法,第二次并没有执行,说明是从缓存中执行的。
总结
cacheManager
spring针对cacheManager接口有多种不同的实现,分别对应了多种不同的缓存技术,上文的简单实现中使用的是redis.
cacheManager接口 | 对应的技术实现 |
simplecachemanager | 使用检点的collection作为缓存,主要用来测试 |
concurrentMapCacheManager | 使用concurrentmap来存储缓存 |
noopcacheManager | 仅测试用途,不会实际存储缓存 |
ehcachecachemanager | 使用ehcache来存储缓存 |
guavacachemanager | 使用google guava来存储缓存 |
hazelcastcachemanager | 使用hazelcast作为缓存技术 |
jcachecachemanager | 支持jcach标准的实现作为缓存 |
rediscachemanager | 会用redis作为缓存 |
缓存注解
spring提供了四个注解来声明缓存规则,声明式注解可以放在类或者方法上,可以对类或者方法都添加缓存。
@cacheable | 在方法执行之前,首先去检查缓存,如果有就直接返回缓存数据 如果没有数据,执行方法,并且将方法的结果放入缓存。 一般用于查询操作 |
@cacheput | 始终把方法的返回值放入缓存,(更新缓存) 一般用于更新和插入操作 @cacheout(key='name') 针对指定的key做相关操作 |
@cacheevict | 将一条或者多条数据从缓存中删除。(删除缓存) @cacheEvict(key='name') 针对指定的key操作 @cacheEvict(allEntries =true) 清空所有的缓存 |
@caching | 组合多个注解策略在一个方法上 |