一 . 概述
在spring3.x之后,spring引入了cache的支持,总体来说springcache能够帮助我们完成项目之中一些简单的缓存实现.
本节就简单的说明一下springcache的基本内容.
二 .几个核心概念
[1]CacheManager :
在一个应用之中,我们可能使用很多个cache组件,spring提供了CacheManager来进行对这些Cache组件的管理工作.
我们看一下CacheManager的基本结构:
public interface CacheManager { /** * Return the cache associated with the given name. * @param name the cache identifier (must not be {@code null}) * @return the associated cache, or {@code null} if none found */ Cache getCache(String name); /** * Return a collection of the cache names known by this manager. * @return the names of all caches known by the cache manager */ Collection<String> getCacheNames(); }
从基本的结构之中,我们可以看到CacheManager维护一个string与Cache实例的映射关系.并且提供了一些方法,我们可以通过string类型的字符串获取Cache实例,或者获取CacheManager中所有维护的Cache实例.
[2]Cache:
本接口描述了SpringCache具体完成缓存任务的接口,我们可以理解为一个键值对的集合,类似于一个Map<String,Object>的结构.
我们来看一下该接口的基本结构:
public interface Cache { String getName(); Object getNativeCache(); ValueWrapper get(Object key); //按照键值对的形式对数据进行缓存 void put(Object key, Object value); //通过键删除这个键值对 void evict(Object key); //清空整个缓存的内容 void clear(); interface ValueWrapper { Object get(); } }
我们从红色的注释部分可以看到,Cache这个接口定义的方法与Map基本类似.
三 .Cache的实现
在spring之中给我们提供了缓存的实现,我们如果不去配置任何的Cache的实现,就会使用Map这样的缓存实现,当然,我们也可以使用redis,ehcache进行Cache的实现.
四 . 缓存注解
在spring之中,我们可以通过注解完成整个缓存框架的使用.下面会重点说明我们常用的注解:
[1]@EnableCaching
该注解表示开启springCache注解驱动,该注解需要放置在一个@Configuration注解的类上面.
我们重点需要关系该注解的几个属性:
(1)proxyTargetClass : 表示是否开启cglib动态代理来实现,一般情况下,我们都会进行这种配置的.
[2]@Cacheable注解
该注解是我们最为常用的一个缓存注解,表示的含义就是一个标准的缓存使用:
当从缓存之中获取数据获取到,那么就不去调用真实的方法,如果没有获取到,就执行方法,最后将这一部分的数据放置到缓存之中.
我们来看下这个注解的一些属性:
(1)value : 描述了缓存的name.通过CacheManager找到该Cache的实例.
(2)key : 表示缓存的数据在Cache之中的key
(3)condition : 条件缓存,表示当在上面样的情况下进行缓存.
(4)unless : 条件缓存,表示不符合上面样的条件才进行缓存.
[3]@CachePut注解
该注解表示的含义强制更新,当目标方法执行完之后,或更新Cache之中的键值对.
另外该注解的属性和@Cacheable的属性的含义是一样的.
[4]@CacheEvict
该方法表示目标方法执行完毕之后,将对应的缓存内容进行删除.
我们需要注意的是该注解的属性:
(1)allEntries : 该属性设置之后,表示当目标方法执行完之后,将缓存之中的所有的数据都删除掉.
(2)beforeInvocation : 该属性表示清除缓存的操作在目标方法之前执行还是之后执行,影响这一方面的问题的原因就是目标方法如果出现了异常,可能会出现缓存的不一致性的问题.