目录

一、Spring缓存注解

1. 注解@Cacheable

2. 注解@CachePut

3. 注解@CacheEvict

二、接口Cache

三、接口CacheManager

四、缓存封装类图 

五、参考资料


        本章节主要介绍Spring3.1后缓存注解使用和主要接口,及自己封装缓存,来实现一级、二级缓存。

一、Spring缓存注解

1. 注解@Cacheable

方法执行前:先从cache获取,若没有缓存再执行方法

方法执行后:根据condition判定参数是否符合、根据unless判定结果是否符合再进行缓存

@Cacheable(value = {"tabCache"}, key = "'tabCache:' + #tabId", cacheManager = "tabCacheManager", unless = "#result eq null")
public List<WcPendantTab> testRedisCacheAble(String tabId) {
    // 组装查询参数
    WcPendantTab tab = new WcPendantTab();
    tab.setTabId(tabId);

    // 查询
    List<WcPendantTab> tabs = wcPendantTabDao.queryAll(tab);

    return tabs;
}
package org.springframework.cache.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.Callable;

import org.springframework.core.annotation.AliasFor;

/**
 * 注意:
 * 1. 注解位置:方法或类(所有方法)
 * 2. 执行方法前,先从cache获取;若没有缓存再执行方法
 * 3. cache没有数据,执行方法后,缓存到cache
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {

	/**
	 * 别名cacheNames属性
	 */
	@AliasFor("cacheNames")
	String[] value() default {};

	/**
	 * 1. cache的名称;别名value属性
	 * 2. 可以多个cache,如:value={"xxx1", "xxx2"}
	 */
	@AliasFor("value")
	String[] cacheNames() default {};

	/**
	 * 1. key值:遵循SpEL表达式
	 * 2. SpEL表达式:#root.method , #root.caches , #p1
	 * 3. 可自定义key的生成策略
	 */
	String key() default "";

	/**
	 * 指定key的生成策略
	 */
	String keyGenerator() default "";

	/**
	 * 指定CacheManager(缓存管理器)
	 */
	String cacheManager() default "";

	/**
	 * 指定CacheResolver解析器
	 */
	String cacheResolver() default "";

	/**
	 * 参数满足condition条件的结果才能缓存
	 */
	String condition() default "";

	/**
	 * 方法执行后的结果:结果满足unless不缓存
	 * 如:unless = "#result eq null":null的结果不缓存
	 */
	String unless() default "";

	/**
	 * 是否开启缓存同步,即:多个线程同步load同一个key
	 * 默认false;若为true,满足下列条件:
	 * a. 没有unless使用
	 * b. 只有一个cache
	 * c. 没有组合其他缓存相关操作
	 */
	boolean sync() default false;

}

2. 注解@CachePut

目的:更新缓存数据。方法执行后,缓存是否有数据,都要更新缓存

参数:参考@Cacheable

3. 注解@CacheEvict

目的:清除缓存数据

参数:参考@Cacheable,其中allEntries、beforeInvocation见下代码注释

package org.springframework.cache.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.core.annotation.AliasFor;

/**
 * 目的:清除缓存数据
 * @author Costin Leau
 * @author Stephane Nicoll
 * @author Sam Brannen
 * @since 3.1
 * @see CacheConfig
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface CacheEvict {

	@AliasFor("cacheNames")
	String[] value() default {};

	@AliasFor("value")
	String[] cacheNames() default {};

	String key() default "";

	String keyGenerator() default "";

	String cacheManager() default "";

	String cacheResolver() default "";

	String condition() default "";

	/**
	 * 1. true时,清除cache下所有key,忽略#key
	 * 2. false(默认)时,清除cache下指定key
	 */
	boolean allEntries() default false;

	/**
	 * 开启方法执行前清除缓存数据,默认false
	 * false时:方法正常执行结束后清除缓存,若异常结束则无法清除数据
	 * true时: 方法执行前清除缓存,与方法执行是否异常没有关系
	 */
	boolean beforeInvocation() default false;

}

二、接口Cache

该接口org.springframework.cache.Cache是定义对缓存基本的操作方法,如:get、put、evict、putIfAbsent等操作。如下图所示,是该接口的类图。

多级缓存需要存null到Redis吗_redis

三、接口CacheManager

该接口org.springframework.cache.CacheManager是定义获取Cache的方法,如:getCache、getCacheNames。如下图所示,是该接口的类图。 

多级缓存需要存null到Redis吗_java_02

四、缓存封装类图 

本节参考多级缓存框架<一>,自己封装缓存的类图:

多级缓存需要存null到Redis吗_多级缓存需要存null到Redis吗_03

五、参考资料

缓存注解: 

@AliasFor注解: