mirror of
https://gitee.com/dromara/hutool.git
synced 2025-04-05 17:37:59 +08:00
增加获取缓存对象方法
This commit is contained in:
parent
d254f7670d
commit
52958fee78
@ -186,4 +186,21 @@ public interface Cache<K, V> extends Iterable<V>, Serializable {
|
||||
default Cache<K, V> setListener(CacheListener<K, V> listener){
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取缓存对象
|
||||
*
|
||||
* @param key 键
|
||||
* @return 值或null
|
||||
*/
|
||||
CacheObj<K, V> getObj(K key);
|
||||
|
||||
/**
|
||||
* 获取缓存对象
|
||||
*
|
||||
* @param isUpdateLastAccess 是否更新最后访问时间
|
||||
* @param key 键
|
||||
* @return 值或null
|
||||
*/
|
||||
CacheObj<K, V> getObj(K key, boolean isUpdateLastAccess);
|
||||
}
|
||||
|
@ -120,4 +120,13 @@ public class NoCache<K, V> implements Cache<K, V> {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CacheObj<K, V> getObj(K key) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CacheObj<K, V> getObj(K key, boolean isUpdateLastAccess) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -105,11 +105,27 @@ public abstract class ReentrantCache<K, V> extends AbstractCache<K, V> {
|
||||
* @return 值或null
|
||||
*/
|
||||
private V getOrRemoveExpired(final K key, final boolean isUpdateLastAccess, final boolean isUpdateCount) {
|
||||
CacheObj<K, V> co = getOrRemoveExpiredObj(key, isUpdateLastAccess, isUpdateCount);
|
||||
if (co != null) {
|
||||
return co.get(isUpdateLastAccess);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得值或清除过期值
|
||||
*
|
||||
* @param key 键
|
||||
* @param isUpdateLastAccess 是否更新最后访问时间
|
||||
* @param isUpdateCount 是否更新计数器
|
||||
* @return 值或null
|
||||
*/
|
||||
private CacheObj<K, V> getOrRemoveExpiredObj(final K key, final boolean isUpdateLastAccess, final boolean isUpdateCount) {
|
||||
CacheObj<K, V> co;
|
||||
lock.lock();
|
||||
try {
|
||||
co = getWithoutLock(key);
|
||||
if(null != co && co.isExpired()){
|
||||
if (null != co && co.isExpired()) {
|
||||
//过期移除
|
||||
removeWithoutLock(key);
|
||||
onRemove(co.key, co.obj);
|
||||
@ -121,15 +137,38 @@ public abstract class ReentrantCache<K, V> extends AbstractCache<K, V> {
|
||||
|
||||
// 未命中
|
||||
if (null == co) {
|
||||
if(isUpdateCount){
|
||||
if (isUpdateCount) {
|
||||
missCount.increment();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
if(isUpdateCount){
|
||||
if (isUpdateCount) {
|
||||
hitCount.increment();
|
||||
}
|
||||
return co.get(isUpdateLastAccess);
|
||||
return co;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取缓存对象
|
||||
*
|
||||
* @param key 键
|
||||
* @return 值或null
|
||||
*/
|
||||
@Override
|
||||
public CacheObj<K, V> getObj(K key) {
|
||||
return getOrRemoveExpiredObj(key, false, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取缓存对象
|
||||
*
|
||||
* @param isUpdateLastAccess 是否更新最后访问时间
|
||||
* @param key 键
|
||||
* @return 值或null
|
||||
*/
|
||||
@Override
|
||||
public CacheObj<K, V> getObj(K key, boolean isUpdateLastAccess) {
|
||||
return getOrRemoveExpiredObj(key, isUpdateLastAccess, true);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user