diff --git a/net/src/main/java/com/zfoo/net/util/SimpleCache.java b/net/src/main/java/com/zfoo/net/util/SimpleCache.java index 48bb8c64..3ae1b580 100644 --- a/net/src/main/java/com/zfoo/net/util/SimpleCache.java +++ b/net/src/main/java/com/zfoo/net/util/SimpleCache.java @@ -36,7 +36,7 @@ import java.util.function.Function; * 1.支持批量查找,批量更新。 * 2.可以防止缓存穿透,缓存击穿,缓存雪崩 *

- * 批量查找通过batchReloadCallback方法查找,当查找的key不存在的时候,调用defaultValueBuilder生成一个默认值放入缓存。 + * 批量查找通过batchLoadCallback方法查找,当查找的key不存在的时候,调用defaultValueBuilder生成一个默认值放入缓存。 * * @author jaysunxiao * @version 3.0 @@ -53,24 +53,24 @@ public class SimpleCache { private long expiredAccessDuration; private long refreshDuration; - private Function, List>> batchReloadCallback; + private Function, List>> batchLoadCallback; private Function defaultValueBuilder; /** * @param expiredAccessDuration 访问过期时间,毫秒;通常情况下,这个值比refreshDuration大会得到更好的缓存效果,一般是2倍 * @param refreshDuration 刷新实际那,毫秒;因为是通过后台scheduler去更新缓存,所以更新的refresh可能是这个值的2倍 * @param maxSize 缓存大小 - * @param batchReloadCallback 一组key取value的回调方法 + * @param batchLoadCallback 一组key取value的回调方法 * @param defaultValueBuilder 默认值构建 * @return 简单的缓存 */ public static SimpleCache build(long expiredAccessDuration, long refreshDuration, long maxSize - , Function, List>> batchReloadCallback + , Function, List>> batchLoadCallback , Function defaultValueBuilder) { var linkedQueue = new ConcurrentLinkedQueue(); - // 没有用guava的expireAfterWrite的原因是容易造成缓存击穿 + // 没有用expireAfterWrite的原因是容易造成缓存击穿 var cache = Caffeine.newBuilder() .expireAfterAccess(expiredAccessDuration, TimeUnit.MILLISECONDS) .refreshAfterWrite(refreshDuration, TimeUnit.MILLISECONDS) @@ -79,15 +79,15 @@ public class SimpleCache { .build(new CacheLoader() { @Override public @Nullable V load(@NonNull K key) { - // 因为通过SimpleCache封装过后,上层逻辑是不会调用guava的cache的get方法,所以理论上load不会执行 - var resultList = batchReloadCallback.apply(List.of(key)); + var resultList = batchLoadCallback.apply(List.of(key)); return CollectionUtils.isEmpty(resultList) ? defaultValueBuilder.apply(key) : resultList.get(0).getValue(); } @Override public @Nullable V reload(@NonNull K key, @NonNull V oldValue) { + // 将待刷新的缓存放入队列,等Scheduler周期任务批量刷新老的缓存值 linkedQueue.offer(key); - // 先返回老的值,等周期任务刷新新的值 + // 先返回老的值 return oldValue; } }); @@ -105,14 +105,14 @@ public class SimpleCache { var key = linkedQueue.poll(); list.add(key); if (list.size() >= BATCH_RELOAD_SIZE) { - var result = batchReloadCallback.apply(list); + var result = batchLoadCallback.apply(list); result.forEach(it -> cache.put(it.getKey(), it.getValue())); list.clear(); } } if (CollectionUtils.isNotEmpty(list)) { - var result = batchReloadCallback.apply(list); + var result = batchLoadCallback.apply(list); result.forEach(it -> cache.put(it.getKey(), it.getValue())); } } @@ -126,7 +126,7 @@ public class SimpleCache { simpleCache.linkedQueue = linkedQueue; simpleCache.expiredAccessDuration = expiredAccessDuration; simpleCache.refreshDuration = refreshDuration; - simpleCache.batchReloadCallback = batchReloadCallback; + simpleCache.batchLoadCallback = batchLoadCallback; simpleCache.defaultValueBuilder = defaultValueBuilder; return simpleCache; } @@ -175,7 +175,7 @@ public class SimpleCache { } if (CollectionUtils.isNotEmpty(notPresentIdSet)) { - batchReloadCallback.apply(new ArrayList<>(notPresentIdSet)) + batchLoadCallback.apply(new ArrayList<>(notPresentIdSet)) .forEach(it -> { result.put(it.getKey(), it.getValue()); cache.put(it.getKey(), it.getValue());