Java缓存对比 guava限流介绍 guava缓存介绍 caffeine缓存介绍
- 2018-06-18 22:16:00
- admin
- 原创 2591
一、Java缓存对比
guava:简单并且满足大部分人需求,并且还包含很多实用工具;
caffeine:基于Java8的高性能缓存,操作功能基本和guava一致;
ehcache:支持缓存策略种类多,支持持久化,并且支持集群方案;
二、guava限流介绍
Uninterruptibles:
void sleepUninterruptibly(long sleepFor, TimeUnit unit),休眠指定时间,休眠无法中断;
Stopwatch:
1、Stopwatch createUnstarted(),创建一个计时器,计时器未启动;
2、Stopwatch createStarted(),创建一个计时器,并启动计时器;
3、Stopwatch start(),开始计时器;
4、Stopwatch stop(),停止计时器;
5、Stopwatch reset(),重置计时器;
6、long elapsed(TimeUnit desiredUnit),返回当前计时;
RateLimiter:
1、RateLimiter create(double permitsPerSecond),创建一个平滑限流器,参数是每秒可以获取的许可数;
2、RateLimiter create(double permitsPerSecond, warmupPeriod, unit),创建一个具备预热功能的限流器;
3、void setRate(double permitsPerSecond),设置每秒可以获取的许可数;
4、double getRate(),查询每秒可以获取的许可数;
5、double acquire(),获取许可,当前计时小于许可可用时间,线程进入休眠;
6、boolean tryAcquire(),获取许可,当前计时小于许可可用时间,线程返回false;
7、boolean tryAcquire(long timeout, TimeUnit unit),获取许可,允许等待指定时间;
RateLimiter使用详解:
1、RateLimiter基于令牌桶算法,可用许可使用浮点数存储,通过计时器计时不断释放许可;
2、nginx基于漏斗算法,令牌桶算法优势是允许突发流量,令牌桶中存在令牌就允许传输;
3、setRate设置每秒可以获取的许可数,同时按比例调整可用许可;
4、nextFreeTicketMicros许可可用时间,当前计时小于许可可用时间,线程进入休眠;
5、当前计时大于等于许可可用时间,线程立即成功获取许可,同时修改下次许可可用时间;
6、初始许可可用时间等于当前计时,可以立即成功获取许可,同时许可不够时可以透支未来许可;
7、平滑限流器初始可用许可是0,最大可用许可是permitsPerSecond,消耗缓存的许可不需要耗时;
8、预热限流器初始可用许可等于最大可用许可permitsPerSecond*warmupPeriod,消耗缓存的许可需要耗时;
9、预热限流器消耗缓存的许可需要耗时,消耗缓存的许可越多耗时越长,最长耗时是1.5*warmupPeriod;
三、guava缓存介绍
CacheBuilder:
1、newBuilder(),创建缓存构建器;
2、build(),创建缓存对象;
3、build(CacheLoader loader),创建自动加载数据的缓存对象;
4、maximumSize(long maximumSize),设置缓存最大容量;
5、expireAfterWrite(long duration, TimeUnit unit),缓存修改多久后清除;
6、expireAfterAccess(long duration, TimeUnit unit),缓存访问多久后清除;
7、initialCapacity(int initialCapacity),缓存初始容量;
8、concurrencyLevel(int concurrencyLevel),设置并发级别;
9、removalListener(RemovalListener listener),设置清除监听器;
10、recordStats(),记录缓存状态;
interface Cache<K, V>:
1、void put(K key, V value),写入缓存;
2、V getIfPresent(Object key),读取缓存,数据不存在时返回空值;
3、ImmutableMap getAllPresent(Iterable keys),读取缓存,查询不去除重复key,结果去除重复key;
4、V get(K key, Callable valueLoader),读取缓存,数据不存在或过期时进行数据加载;
5、void cleanUp(),尝试清除过期元素,获取不到锁则无法清除;
6、void invalidate(Object key),清除缓存;
7、void invalidateAll(),清除所有缓存;
8、CacheStats stats(),获取缓存状态;
interface LoadingCache<K, V> extends Cache<K, V>:
1、V get(K key),读取缓存,等价于get(key,loader);
2、ImmutableMap getAll(Iterable keys),读取缓存,等价于多次调用get(key,loader);
3、V getUnchecked(K key),读取缓存,等价于get(key,loader),异常类型转化为运行时异常;
4、void refresh(K key),更新缓存,不抛出任何异常;
Cache使用详解:
1、CacheBuilder参数不能重复设置,重复设置会抛出异常;
2、LocalManualCache实现了Cache接口,包含一个LocalCache对象;
3、LocalCache实现了ConcurrentMap接口,实现了缓存的主要功能逻辑;
4、LocalCache分段存储数据,每个数据段是一个重入锁,concurrencyLevel决定数据段数量;
5、获取的元素状态过期才尝试读操作清除数据,读写操作清除数据只清除命中的数据段数据;
6、读操作清除数据:如果获取的元素状态过期,尝试清除修改状态过期数据、访问状态过期数据;
7、写操作清除数据:写之前清除修改状态过期数据、访问状态过期数据,写之后清除超过容量数据;
8、删操作清除数据:删之前清除修改状态过期数据、访问状态过期数据;
9、RemovalListeners.asynchronous用于将清除数据同步通知变成异步通知;
a、get(key,loader),如果数据需要加载,则只有一个线程能够加载成功,其他线程等待该线程加载;
b、get(key,loader),如果加载数据抛出异常,则异常会抛到调用线程,其他等待线程也会异常;
四、caffeine缓存介绍
1、官网链接:https://github.com/ben-manes/caffeine
2、使用文档:https://github.com/ben-manes/caffeine/wiki
3、caffeine2.x最低要求JDK8,caffeine3.x最低要求JDK11;
Caffeine:
1、newBuilder(),创建缓存构建器;
2、build(),创建缓存对象;
3、build(CacheLoader loader),创建自动加载数据的缓存对象;
4、buildAsync(),创建缓存对象,返回AsyncCache;
5、buildAsync(CacheLoader loader),创建自动加载数据的缓存对象,返回AsyncLoadingCache;
6、buildAsync(AsyncCacheLoader loader),创建自动加载数据的缓存对象,返回AsyncLoadingCache;
interface Cache:
1、V getIfPresent(Object key),读取缓存,数据不存在时返回空值;
2、V get(K key, Function mapFunc),读取缓存,数据不存在或过期时进行数据加载;
3、void invalidate(Object key),清除缓存;
interface AsyncCache<K, V>:
1、void put(K key, CompletableFuture<V> valueFuture),写入缓存,数据来源异步任务;
2、CompletableFuture<V> getIfPresent(Object key),读取缓存,数据不存在时返回空值;
3、CompletableFuture<V> get(K key, Function mapFunc),读取缓存,数据不存在或过期时进行数据加载;
Cache使用详解:
1、get(key,mapFunc)相比guava.get(key,loader),加载函数返回空值时,整个函数不会抛出异常;
2、AsyncCache写入缓存是写入异步任务,读取缓存是读取异步任务,异步任务失败时会清除缓存;
3、CacheLoader接口继承AsyncCacheLoader,所以两个buildAsync(loader)方法实现完全一样;
4、caffeine使用异步任务清除过期数据,读操作影响比guava更小一些,读操作性能更高一些;