今天研究了会spring自带的缓存cache,首先得弄清楚cache和CacheManager究竟是什么。
一.Cache,CacheManager结构
Cache是一个接口,可以像Map一样put,get值,一个name为people的cache,可以存储多个不同key的数据,如key=22,value="123";key=23;value="224".种类如下,默认采用的是ConcurrentMapCache。
ConcurrentMapCache的属性如下
CacheManager也是一个接口,用于管理Cache的集合。
它的抽象实现类AbstractCacheManager中是这么管理Cache的
private final ConcurrentMap cacheMap = new ConcurrentHashMap(16);
private volatile Set cacheNames = Collections.emptySet(); // 不可变集合,每次改变都得新建一个重新赋值
具体的代码自行查看底层。
二.CacheManager能干嘛
SpringBoot中默认以ConcurrentMapCacheManager作为CacheManager的实现类,当然也可以手动配置成RedisCacheManager,ehcache,guava等。
这里先只介绍ConcurrentMapCacheManager。
三.@Cacheable,@CachePut,@CacheEvict
上面只是讲概念,下面才是重头戏,怎么用。
这几个注解很常见,可作用于类和方法上。
@Cacheable是如果没有发现key,则往指定name的cache里put key value,如果有key了,则跳过执行注解的方法,直接返回方法返回值。说白了经过@Cacheable注解的方法,会将方法参数值作为key,方法返回值作为value,存入cache中。
@CachePut则是每次都会执行方法,并将结果存入指定的缓存中
@CacheEvict消除cache中指定key,可以用allEntities=true消除所有key
@Service
public class UserService {
@Autowired
UserJPA jpa;
@Autowired
CacheManager cacheManager;
// 如果方法没有参数,则使用SimpleKey[]作为key
@Cacheable(value="people")
public List list(String name){
return jpa.findAll();
}
// 如果有相同key,则跳过方法执行,直接获得结果
// @Cacheable(value="people")
public UserEntity findOne(Long id) {
Cache pCache = cacheManager.getCache("people");
pCache.put("list", null); // 其实@Cacheable就相当于put值进去
return jpa.findOne(id);
}
// 每次都会执行方法,并将结果存入指定的缓存中
@CachePut(value="people",key="#userEntity.id")
public UserEntity add(UserEntity userEntity) {
UserEntity userEntity2 = jpa.save(userEntity);
System.out.println("为id、key为:"+userEntity2.getId()+"数据做了缓存");
return userEntity2;
}
// 删除,默认策略是用参数值代替,如id=22,则key=22
@CacheEvict(value="people")
public void delete(Long id) {
System.out.println("删除了id、key为"+id+"的数据缓存");
// jpa.delete(id); // 不做数据库处理,数据应该也会变
}
}
红色代码处打断点,可以观察得到cacheManager和cache的值
四.keygenerator默认策略
@Cacheable(value="people")
public UserEntity findOne(Long id)
生成的key值为参数id值
@Cacheable(value="people")
public UserEntity findOne()
生成的key值为SimpleKey[]
@Cacheable(value="people")
public UserEntity findOne(Long id,String name)
生成的key值为SimpleKey[23,abc]
参考:
https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/index.html