mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-07-21 15:09:48 +08:00
add groupTimeInterval
This commit is contained in:
@@ -45,7 +45,6 @@ public interface Cache<K, V> extends Iterable<V>, Serializable {
|
||||
* @param key 键
|
||||
* @param object 缓存的对象
|
||||
* @param timeout 失效时长,单位毫秒
|
||||
* @see Cache#put(Object, Object, long)
|
||||
*/
|
||||
void put(K key, V object, long timeout);
|
||||
|
||||
@@ -159,4 +158,15 @@ public interface Cache<K, V> extends Iterable<V>, Serializable {
|
||||
* @return 是否包含key
|
||||
*/
|
||||
boolean containsKey(K key);
|
||||
|
||||
/**
|
||||
* 设置监听
|
||||
*
|
||||
* @param listener 监听
|
||||
* @return this
|
||||
* @since 5.5.2
|
||||
*/
|
||||
default Cache<K, V> setListener(CacheListener<K, V> listener){
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
20
hutool-cache/src/main/java/cn/hutool/cache/CacheListener.java
vendored
Normal file
20
hutool-cache/src/main/java/cn/hutool/cache/CacheListener.java
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
package cn.hutool.cache;
|
||||
|
||||
/**
|
||||
* 缓存监听,用于实现缓存操作时的回调监听,例如缓存对象的移除事件等
|
||||
*
|
||||
* @param <K> 缓存键
|
||||
* @param <V> 缓存值
|
||||
* @author looly
|
||||
* @since 5.5.2
|
||||
*/
|
||||
public interface CacheListener<K, V> {
|
||||
|
||||
/**
|
||||
* 对象移除回调
|
||||
*
|
||||
* @param key 键
|
||||
* @param cachedObject 被缓存的对象
|
||||
*/
|
||||
void onRemove(K key, V cachedObject);
|
||||
}
|
@@ -1,6 +1,7 @@
|
||||
package cn.hutool.cache.impl;
|
||||
|
||||
import cn.hutool.cache.Cache;
|
||||
import cn.hutool.cache.CacheListener;
|
||||
import cn.hutool.core.collection.CopiedIter;
|
||||
import cn.hutool.core.lang.func.Func0;
|
||||
|
||||
@@ -51,6 +52,11 @@ public abstract class AbstractCache<K, V> implements Cache<K, V> {
|
||||
*/
|
||||
protected AtomicLong missCount = new AtomicLong();
|
||||
|
||||
/**
|
||||
* 缓存监听
|
||||
*/
|
||||
protected CacheListener<K, V> listener;
|
||||
|
||||
// ---------------------------------------------------------------- put start
|
||||
@Override
|
||||
public void put(K key, V object) {
|
||||
@@ -164,7 +170,7 @@ public abstract class AbstractCache<K, V> implements Cache<K, V> {
|
||||
|
||||
if (co.isExpired()) {
|
||||
missCount.getAndIncrement();
|
||||
} else{
|
||||
} else {
|
||||
// 命中
|
||||
hitCount.getAndIncrement();
|
||||
return co.get(isUpdateLastAccess);
|
||||
@@ -280,13 +286,29 @@ public abstract class AbstractCache<K, V> implements Cache<K, V> {
|
||||
// ---------------------------------------------------------------- common end
|
||||
|
||||
/**
|
||||
* 对象移除回调。默认无动作
|
||||
* 设置监听
|
||||
*
|
||||
* @param listener 监听
|
||||
* @return this
|
||||
* @since 5.5.2
|
||||
*/
|
||||
public AbstractCache<K, V> setListener(CacheListener<K, V> listener) {
|
||||
this.listener = listener;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 对象移除回调。默认无动作<br>
|
||||
* 子类可重写此方法用于监听移除事件,如果重写,listener将无效
|
||||
*
|
||||
* @param key 键
|
||||
* @param cachedObject 被缓存的对象
|
||||
*/
|
||||
protected void onRemove(K key, V cachedObject) {
|
||||
// ignore
|
||||
final CacheListener<K, V> listener = this.listener;
|
||||
if (null != listener) {
|
||||
listener.onRemove(key, cachedObject);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -18,6 +18,12 @@ public class CacheTest {
|
||||
@Test
|
||||
public void fifoCacheTest(){
|
||||
Cache<String,String> fifoCache = CacheUtil.newFIFOCache(3);
|
||||
fifoCache.setListener((key, value)->{
|
||||
// 监听测试,此测试中只有key1被移除,测试是否监听成功
|
||||
Assert.assertEquals("key1", key);
|
||||
Assert.assertEquals("value1", value);
|
||||
});
|
||||
|
||||
fifoCache.put("key1", "value1", DateUnit.SECOND.getMillis() * 3);
|
||||
fifoCache.put("key2", "value2", DateUnit.SECOND.getMillis() * 3);
|
||||
fifoCache.put("key3", "value3", DateUnit.SECOND.getMillis() * 3);
|
||||
|
Reference in New Issue
Block a user