del[cache]: delete sizeCheckTimeAtomic

This commit is contained in:
godotg committed 2024-03-27 17:00:50 +08:00
1 parent 7fcf726371
commit 03d7996815
2 files changed
+10 -17

No files matched your search

@@ -17,7 +17,6 @@ import java.util.function.BiConsumer;
public class LazyCache<K, V> { public class LazyCache<K, V> {
private static final float DEFAULT_BACK_PRESSURE_FACTOR = 0.11f; private static final float DEFAULT_BACK_PRESSURE_FACTOR = 0.11f;
private static final long MILLIS_MAX_SIZE_CHECK_INTERVAL = 3;
private static class CacheValue<V> { private static class CacheValue<V> {
public volatile V value; public volatile V value;
@@ -58,7 +57,6 @@ public class LazyCache<K, V> {
private long expireCheckIntervalMillis; private long expireCheckIntervalMillis;
private volatile long minExpireTime; private volatile long minExpireTime;
private AtomicLong expireCheckTimeAtomic; private AtomicLong expireCheckTimeAtomic;
private AtomicLong sizeCheckTimeAtomic;
private ConcurrentMap<K, CacheValue<V>> cacheMap; private ConcurrentMap<K, CacheValue<V>> cacheMap;
private BiConsumer<Pair<K, V>, RemovalCause> removeListener = (pair, removalCause) -> { private BiConsumer<Pair<K, V>, RemovalCause> removeListener = (pair, removalCause) -> {
}; };
@@ -70,7 +68,6 @@ public class LazyCache<K, V> {
this.expireCheckIntervalMillis = expireCheckIntervalMillis; this.expireCheckIntervalMillis = expireCheckIntervalMillis;
this.minExpireTime = TimeUtils.now(); this.minExpireTime = TimeUtils.now();
this.expireCheckTimeAtomic = new AtomicLong(TimeUtils.now() + expireCheckIntervalMillis); this.expireCheckTimeAtomic = new AtomicLong(TimeUtils.now() + expireCheckIntervalMillis);
this.sizeCheckTimeAtomic = new AtomicLong(TimeUtils.now());
this.cacheMap = new ConcurrentHashMap<>(Math.max(maximumSize / 16, 512)); this.cacheMap = new ConcurrentHashMap<>(Math.max(maximumSize / 16, 512));
if (removeListener != null) { if (removeListener != null) {
this.removeListener = removeListener; this.removeListener = removeListener;
@@ -136,19 +133,12 @@ public class LazyCache<K, V> {
// ----------------------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------------------
private void checkMaximumSize() { private void checkMaximumSize() {
if (cacheMap.size() > backPressureSize) { if (cacheMap.size() > backPressureSize) {
var currentTimeMillis = TimeUtils.currentTimeMillis(); cacheMap.entrySet()
var sizeCheckTime = sizeCheckTimeAtomic.get(); .stream()
if (currentTimeMillis > sizeCheckTime) { .map(it -> new PairLong<>(it.getValue().expireTime, it.getKey()))
if (sizeCheckTimeAtomic.compareAndSet(sizeCheckTime, currentTimeMillis + MILLIS_MAX_SIZE_CHECK_INTERVAL)) { .sorted((a, b) -> Long.compare(a.getKey(), b.getKey()))
var exceedList = cacheMap.entrySet() .limit(Math.max(0, cacheMap.size() - maximumSize))
.stream() .forEach(it -> removeForCause(it.getValue(), RemovalCause.SIZE));
.map(it -> new PairLong<>(it.getValue().expireTime, it.getKey()))
.sorted((a, b) -> Long.compare(a.getKey(), b.getKey()))
.limit(Math.max(0, cacheMap.size() - maximumSize))
.toList();
exceedList.forEach(it -> removeForCause(it.getValue(), RemovalCause.SIZE));
}
}
} }
} }
@@ -127,7 +127,10 @@ public class LazyCacheTest {
} }
}); });
} }
ThreadUtils.sleep(Long.MAX_VALUE); for (int i = 0; i < 10000; i++) {
logger.info("cache size:[{}]", lazyCache.size());
ThreadUtils.sleep(1000);
}
} }
} }