spring cache API介绍 - 书目录

spring cache API介绍

Cache接口

理解这个接口有助于我们实现自己的缓存管理器

package org.springframework.cache;

public interface Cache {

	/**
	 * 缓存的名字
	 */
	String getName();

	/**
	 * 得到底层使用的缓存
	 */
	Object getNativeCache();

	/**
	 * 根据key得到一个ValueWrapper,然后调用其get方法获取值 
	 */
	ValueWrapper get(Object key);

	/**
	 * 根据key,和value的类型直接获取value  
	 */
	<T> T get(Object key, Class<T> type);

	/**
	 * 存数据
	 */
	void put(Object key, Object value);

	/**
	 * 如果值不存在,则添加,用来替代如下代码
	 * Object existingValue = cache.get(key);
	 * if (existingValue == null) {
	 *     cache.put(key, value);
	 *     return null;
	 * } else {
	 *     return existingValue;
	 * }
	 */
	ValueWrapper putIfAbsent(Object key, Object value);

	/**
	 * 根据key删数据
	 */
	void evict(Object key);

	/**
	 * 清空数据
	 */
	void clear();

	/**
	 * 缓存值的Wrapper  
	 */
	interface ValueWrapper {
		/**
		 * 得到value
		 */
		Object get();
	}
}

默认实现

默认已经实现了几个常用的cache
位于spring-context-x.RELEASE.jar和spring-context-support-x.RELEASE.jar的cache目录下

  • ConcurrentMapCache:基于java.util.concurrent.ConcurrentHashMap
  • GuavaCache:基于Google的Guava工具
  • EhCacheCache:基于Ehcache
  • JCacheCache:基于javax.cache.Cache(不常用)

CacheManager

用来管理多个cache

package org.springframework.cache;

import java.util.Collection;

public interface CacheManager {

	/**
	 * 根据cache名获取cache
	 */
	Cache getCache(String name);

	/**
	 * 得到所有cache的名字
	 */
	Collection<String> getCacheNames();

}

默认实现

对应Cache接口的默认实现

  • ConcurrentMapCacheManager / ConcurrentMapCacheFactoryBean
  • GuavaCacheManager
  • EhCacheCacheManager / EhCacheManagerFactoryBean
  • JCacheCacheManager / JCacheManagerFactoryBean

CompositeCacheManager

用于组合CacheManager,可以从多个CacheManager中轮询得到相应的Cache

<bean id="cacheManager" class="org.springframework.cache.support.CompositeCacheManager">
    <property name="cacheManagers">
        <list>
            <ref bean="concurrentMapCacheManager"/>
            <ref bean="guavaCacheManager"/>
        </list>
    </property>
    <!-- 都找不到时,不返回null,而是返回NOP的Cache -->
    <property name="fallbackToNoOpCache" value="true"/>
</bean>

事务

除GuavaCacheManager外,其他Cache都支持Spring事务,如果注解方法出现事务回滚,对应缓存操作也会回滚

缓存策略

都是Cache自行维护,Spring只提供对外抽象API

内容摘录于:http://liuxing.info/2015/06/18/Spring%20Cache%E4%BD%BF%E7%94%A8/