From 1b423b2e0f6bb0cb4c4c822b08d69d65763d3a3c Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 14 Nov 2023 09:10:41 +0800 Subject: [PATCH] =?UTF-8?q?Cache=E5=A2=9E=E5=8A=A0get=E9=87=8D=E8=BD=BD?= =?UTF-8?q?=EF=BC=8C=E5=8F=AF=E8=87=AA=E5=AE=9A=E4=B9=89=E8=B6=85=E6=97=B6?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/hutool/core/cache/Cache.java | 15 +++++++++++++++ .../hutool/core/cache/impl/AbstractCache.java | 7 ++++++- .../dromara/hutool/core/cache/impl/NoCache.java | 5 +++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/cache/Cache.java b/hutool-core/src/main/java/org/dromara/hutool/core/cache/Cache.java index 6e1f01f7b..cab8ecc0b 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/cache/Cache.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/cache/Cache.java @@ -104,6 +104,21 @@ public interface Cache extends Iterable, Serializable { */ V get(K key, boolean isUpdateLastAccess, SerSupplier supplier); + /** + * 从缓存中获得对象,当对象不在缓存中或已经过期返回SerSupplier回调产生的对象 + *

+ * 调用此方法时,会检查上次调用时间,如果与当前时间差值大于超时时间返回{@code null},否则返回值。 + *

+ * 每次调用此方法会可选是否刷新最后访问时间,{@code true}表示会重新计算超时时间。 + * + * @param key 键 + * @param isUpdateLastAccess 是否更新最后访问时间,即重新计算超时时间。 + * @param timeout 自定义超时时间 + * @param supplier 如果不存在回调方法,用于生产值对象 + * @return 值对象 + */ + V get(K key, boolean isUpdateLastAccess, final long timeout, SerSupplier supplier); + /** * 从缓存中获得对象,当对象不在缓存中或已经过期返回{@code null} *

diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/cache/impl/AbstractCache.java b/hutool-core/src/main/java/org/dromara/hutool/core/cache/impl/AbstractCache.java index 015727f97..b00ce796a 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/cache/impl/AbstractCache.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/cache/impl/AbstractCache.java @@ -121,6 +121,11 @@ public abstract class AbstractCache implements Cache { @Override public V get(final K key, final boolean isUpdateLastAccess, final SerSupplier supplier) { + return get(key, isUpdateLastAccess, this.timeout, supplier); + } + + @Override + public V get(final K key, final boolean isUpdateLastAccess, final long timeout, final SerSupplier supplier) { V v = get(key, isUpdateLastAccess); if (null == v && null != supplier) { //每个key单独获取一把锁,降低锁的粒度提高并发能力,see pr#1385@Github @@ -131,7 +136,7 @@ public abstract class AbstractCache implements Cache { final CacheObj co = getWithoutLock(key); if (null == co || co.isExpired()) { v = supplier.get(); - put(key, v, this.timeout); + put(key, v, timeout); } else { v = co.get(isUpdateLastAccess); } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/cache/impl/NoCache.java b/hutool-core/src/main/java/org/dromara/hutool/core/cache/impl/NoCache.java index 901611b23..622a47239 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/cache/impl/NoCache.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/cache/impl/NoCache.java @@ -69,6 +69,11 @@ public class NoCache implements Cache { @Override public V get(final K key, final boolean isUpdateLastAccess, final SerSupplier supplier) { + return get(key, isUpdateLastAccess, 0, supplier); + } + + @Override + public V get(final K key, final boolean isUpdateLastAccess, final long timeout, final SerSupplier supplier) { return (null == supplier) ? null : supplier.get(); }