Java缓存对比 guava限流介绍 guava缓存介绍 caffeine缓存介绍

2018-06-18 22:16:00
admin
原创 2591
摘要:Java缓存对比 guava限流介绍 guava缓存介绍 caffeine缓存介绍

一、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更小一些,读操作性能更高一些;

发表评论
评论通过审核之后才会显示。