cache CacheManager @Cacheable

    今天研究了会spring自带的缓存cache,首先得弄清楚cache和CacheManager究竟是什么。

一.Cache,CacheManager结构

   Cache是一个接口,可以像Map一样put,get值,一个name为people的cache,可以存储多个不同key的数据,如key=22,value="123";key=23;value="224".种类如下,默认采用的是ConcurrentMapCache。

    cache CacheManager @Cacheable_第1张图片

    ConcurrentMapCache的属性如下

    cache CacheManager @Cacheable_第2张图片

    CacheManager也是一个接口,用于管理Cache的集合。

    

    它的抽象实现类AbstractCacheManager中是这么管理Cache的

	private final ConcurrentMap cacheMap = new ConcurrentHashMap(16);

	private volatile Set cacheNames = Collections.emptySet();  //  不可变集合,每次改变都得新建一个重新赋值

     具体的代码自行查看底层。

二.CacheManager能干嘛

    SpringBoot中默认以ConcurrentMapCacheManager作为CacheManager的实现类,当然也可以手动配置成RedisCacheManager,ehcache,guava等。

        cache CacheManager @Cacheable_第3张图片

        这里先只介绍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的值

    cache CacheManager @Cacheable_第4张图片

    cache CacheManager @Cacheable_第5张图片

  四.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]

cache CacheManager @Cacheable_第6张图片


参考:

https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/index.html

你可能感兴趣的:(spring)