提交 | 用户 | 时间
e7c126 1 package com.iailab.framework.common.util.cache;
H 2
3 import com.google.common.cache.CacheBuilder;
4 import com.google.common.cache.CacheLoader;
5 import com.google.common.cache.LoadingCache;
6
7 import java.time.Duration;
8 import java.util.concurrent.Executors;
9
10 /**
11  * Cache 工具类
12  *
13  * @author iailab
14  */
15 public class CacheUtils {
16
17     /**
18      * 构建异步刷新的 LoadingCache 对象
19      *
20      * 注意:如果你的缓存和 ThreadLocal 有关系,要么自己处理 ThreadLocal 的传递,要么使用 {@link #buildCache(Duration, CacheLoader)} 方法
21      *
22      * 或者简单理解:
23      * 1、和“人”相关的,使用 {@link #buildCache(Duration, CacheLoader)} 方法
24      * 2、和“全局”、“系统”相关的,使用当前缓存方法
25      *
26      * @param duration 过期时间
27      * @param loader  CacheLoader 对象
28      * @return LoadingCache 对象
29      */
30     public static <K, V> LoadingCache<K, V> buildAsyncReloadingCache(Duration duration, CacheLoader<K, V> loader) {
31         return CacheBuilder.newBuilder()
32                 // 只阻塞当前数据加载线程,其他线程返回旧值
33                 .refreshAfterWrite(duration)
34                 // 通过 asyncReloading 实现全异步加载,包括 refreshAfterWrite 被阻塞的加载线程
35                 .build(CacheLoader.asyncReloading(loader, Executors.newCachedThreadPool())); // TODO iailab:可能要思考下,未来要不要做成可配置
36     }
37
38     /**
39      * 构建同步刷新的 LoadingCache 对象
40      *
41      * @param duration 过期时间
42      * @param loader  CacheLoader 对象
43      * @return LoadingCache 对象
44      */
45     public static <K, V> LoadingCache<K, V> buildCache(Duration duration, CacheLoader<K, V> loader) {
46         return CacheBuilder.newBuilder().refreshAfterWrite(duration).build(loader);
47     }
48
49 }