1)配置Spring对Cache的支持
配置Spring对基于注解的Cache的支持,首先我们需要在Spring的配置文件中引
入cache命名空间,其次通过<cache:annotation-driven />就可以启用Spring
对基于注解的Cache的支持。
2)配置jedis工厂、redis模板、cache管理器
<!-- 配置jedis工厂 -->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="127.0.0.1"></property>
<property name="port" value="6379"></property>
<property name="usePool" value="true"></property>
<property name="database" value="0"></property>
</bean>
<!-- 配置redis模板 -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory"></property>
</bean>
<!-- 配置cache管理器 -->
<bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">
<constructor-arg index="0" ref="redisTemplate"></constructor-arg>
</bean>
3)声明某些方法要使用缓存
**@Cacheable**
标记在一个方法上,表示该方法是支持缓存的.对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法
@Cacheable中常用的有三个属性,value、key和condition。
value属性是必须指定的,其表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称。注意是cache的名称,而不是cache中的key,key值会默认生成也可以是自己指定的。cache的名称是我们操作时用的,cache的key是redis中存储value时用的。
key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key。
例如:使用user的id值作为缓存的key值
@Cacheable(value="users", key="#user.id")
public User find(User user) {..}
condition属性指定缓存发生的条件,有的时候我们可能希望满足一定条件才进行缓存。其值是通过SpringEL表达式来指定的,当为true时表示进行缓存处理;当为false时表示不进行缓存处理
例如:user的id值大于等于100的时候才进行缓存
@Cacheable(value="users",condition="#user.id>=100")
public User find(User user) {..}
**2)@CachePut**
对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是,使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
**3)@CacheEvict**
该注解是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。
@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的意思与@Cacheable对应的属性类似。
allEntries属性
allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false。
@CacheEvict(value="users", allEntries=true)
public void delete(Integer id) {...}
beforeInvocation属性
清除操作默认是在对应方法成功执行之后触发的,但是方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素
@CacheEvict(value="users", beforeInvocation=true)
public void delete(Integer id) {...}