分布式缓存
redis
memcahe
本地(进程内的)缓存
enhance
guaua cache 不需要太多的配置文件
一般cache的基础功能
提供存放读取 容器大小有限设置清除策略
一般是线程安全 单例
private static Cache<String, BaseResponseVo<CartVo>> CACHE_CART = CacheBuilder.newBuilder().maximumSize(10000).expireAfterWrite(1, TimeUnit.SECONDS).build();
final static Cache<Integer, String> cache = CacheBuilder.newBuilder()
//设置cache的初始大小为10,要合理设置该值
.initialCapacity(10)
//设置并发数为5,即同一时间最多只能有5个线程往cache执行写入操作
.concurrencyLevel(5)
//设置cache中的数据在写入之后的存活时间为10秒
.expireAfterWrite(10, TimeUnit.SECONDS)
//构建cache实例
.build();
GuavaCache的实现是基于ConcurrentHashMap的。
再看看cache提供的方法
/**
* 该接口的实现被认为是线程安全的,即可在多线程中调用
* 通过被定义单例使用
*/
public interface Cache<K, V> {
/**
* 通过key获取缓存中的value,若不存在直接返回null
*/
V getIfPresent(Object key);
/**
* 通过key获取缓存中的value,若不存在就通过valueLoader来加载该value
* 整个过程为 "if cached, return; otherwise create, cache and return"
* 注意valueLoader要么返回非null值,要么抛出异常,绝对不能返回null
*/
V get(K key, Callable<? extends V> valueLoader) throws ExecutionException;
/**
* 添加缓存,若key存在,就覆盖旧值
*/
void put(K key, V value);
/**
* 删除该key关联的缓存
*/
void invalidate(Object key);
/**
* 删除所有缓存
*/
void invalidateAll();
/**
* 执行一些维护操作,包括清理缓存
*/
void cleanUp();
}
guauacache的几种清除策略
time eviction
expireAfterAccess(long, TimeUnit)
缓存项在创建后,在给定时间内没有被读/写访问,则清除。
expireAfterWrite(long, TimeUnit)
缓存项在创建后,在给定时间内没有被写访问(创建或覆盖),则清除。
sizebased evication
通过CacheBuilder.maximumSize(long)方法可以设置Cache的最大容量数,当缓存数量达到或接近该最大值时,Cache将清除掉那些最近最少使用的缓存。
基于权重的策略
你可以使用CacheBuilder.weigher(Weigher)指定一个权重函数,并且用CacheBuilder.maximumWeight(long)指定最大总重。
显示清除
(1)个别清除:Cache.invalidate(key)
(2)批量清除:Cache.invalidateAll(keys)
(3)清除所有缓存项:Cache.invalidateAll()
基于引用的清除
在构建Cache实例过程中,通过设置使用弱引用的键、或弱引用的值、或软引用的值,从而使JVM在GC时顺带实现缓存的清除,不过一般不轻易使用这个特性。
(1)CacheBuilder.weakKeys():使用弱引用存储键
(2)CacheBuilder.weakValues():使用弱引用存储值
(3)CacheBuilder.softValues():使用软引用存储值
cache延迟删除
guaguacache实现中没有启动任何线程 都是通过调用其他线程来完成。
面向本地轻量级缓存