Cache.put变更策略,对于替换的键值对,不清理队列

This commit is contained in:
Looly 2024-06-18 11:34:46 +08:00
parent c5e1ba85f8
commit 2d40dd1927
3 changed files with 35 additions and 2 deletions

View File

@ -2,7 +2,7 @@
# 🚀Changelog
-------------------------------------------------------------------------------------------------------------
# 5.8.29(2024-06-17)
# 5.8.29(2024-06-18)
### 🐣新特性
* 【core 】 DateUtil增加offsetYear方法
@ -11,6 +11,7 @@
* 【core 】 优化DateUtil.format(Date date, String format)接口效率pr#1226@Gitee
* 【csv 】 CsvWriter.writeBeans增加重载可选是否写出表头issue#IA57W2@Gitee
* 【core 】 BetweenFormatter支持自定义设置单位pr#1228@Gitee
* 【cache 】 Cache.put变更策略对于替换的键值对不清理队列issue#3618@Github
### 🐞Bug修复
* 【core 】 修复AnnotationUtil可能的空指针错误

View File

@ -85,10 +85,20 @@ public abstract class AbstractCache<K, V> implements Cache<K, V> {
if (timeout != 0) {
existCustomTimeout = true;
}
final MutableObj<K> mKey = MutableObj.of(key);
// issue#3618 对于替换的键值对不做满队列检查和清除
if (cacheMap.containsKey(mKey)) {
// 存在相同key覆盖之
cacheMap.put(mKey, co);
return;
}
if (isFull()) {
pruneCache();
}
cacheMap.put(MutableObj.of(key), co);
cacheMap.put(mKey, co);
}
// ---------------------------------------------------------------- put end

View File

@ -0,0 +1,22 @@
package cn.hutool.cache;
import cn.hutool.cache.impl.FIFOCache;
import org.junit.Assert;
import org.junit.Test;
public class Issue3618Test {
@Test
public void putTest() {
FIFOCache<Object, Object> cache = CacheUtil.newFIFOCache(3);
cache.put(1, 1);
cache.put(2, 1);
cache.put(3, 1);
Assert.assertEquals(3, cache.size());
// issue#3618 对于替换的键值对不做满队列检查和清除
cache.put(3, 2);
Assert.assertEquals(3, cache.size());
}
}