Caffeine實現(xiàn)類似redis的動態(tài)過期時間設(shè)置示例
使用Caffeine實現(xiàn)緩存功能
為了替換原有的redis接口,發(fā)現(xiàn)存在一個問題:
原本的redis支持set(key, value, expire)這樣的功能,而原始的caffeine只能全局設(shè)置過期策略,不支持類似的功能,因此需要對Caffeine包裝一下,做了一個工具類實現(xiàn)類似redis的動態(tài)過期時間設(shè)置。
工具類實現(xiàn)類似redis
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.Expiry;
import org.checkerframework.checker.index.qual.NonNegative;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.springframework.stereotype.Component;
import java.util.Collection;
import java.util.concurrent.TimeUnit;
import static java.util.Objects.isNull;
/**
* 工具類
*
* @author guo
*/
public class CacheUtils {
/**
* 不設(shè)置過期時長
*/
public static final long NOT_EXPIRE = Long.MAX_VALUE;
public static final Cache<String, CacheObject<?>> CAFFEINE = Caffeine.newBuilder()
.expireAfter(new Expiry<String, CacheObject<?>>() {
@Override
public long expireAfterCreate(@NonNull String key, @NonNull CacheObject<?> value, long currentTime) {
return value.expire;
}
@Override
public long expireAfterUpdate(@NonNull String key, @NonNull CacheObject<?> value, long currentTime, @NonNegative long currentDuration) {
return value.expire;
}
@Override
public long expireAfterRead(@NonNull String key, @NonNull CacheObject<?> value, long currentTime, @NonNegative long currentDuration) {
return value.expire;
}
})
.initialCapacity(100)
.maximumSize(1024)
.build();
private static class CacheObject<T> {
T data;
long expire;
public CacheObject(T data, long second) {
this.data = data;
this.expire = TimeUnit.SECONDS.toNanos(second);
}
}
public static <T> void set(String key, T value, long expire) {
CacheObject<T> cacheObject = new CacheObject<>(value, expire);
CAFFEINE.put(key, cacheObject);
}
public static void set(String key, Object value) {
set(key, value, NOT_EXPIRE);
}
@SuppressWarnings("unchecked")
public static <T> T get(String key) {
CacheObject<?> cacheObject = CAFFEINE.getIfPresent(key);
if (isNull(cacheObject)) {
return null;
}
return (T) cacheObject.data;
}
public static void delete(String key) {
CAFFEINE.invalidate(key);
}
public static void delete(Collection<String> keys) {
CAFFEINE.invalidateAll(keys);
}
public static void main(String[] args) throws InterruptedException {
CacheUtils.set("A", 1, 2);
CacheUtils.set("B", 2, 5);
CacheUtils.set("C", 3, 8);
System.out.println(CAFFEINE.asMap());
Object a = CacheUtils.get("A");
Object b = CacheUtils.get("B");
Object c = CacheUtils.get("C");
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println("-----------------");
Thread.sleep(2000);
a = CacheUtils.get("A");
b = CacheUtils.get("B");
c = CacheUtils.get("C");
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println("-----------------");
Thread.sleep(5000);
a = CacheUtils.get("A");
b = CacheUtils.get("B");
c = CacheUtils.get("C");
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println("-----------------");
Thread.sleep(8000);
a = CacheUtils.get("A");
b = CacheUtils.get("B");
c = CacheUtils.get("C");
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println("-----------------");
}
}以上就是Caffeine實現(xiàn)類似redis的動態(tài)過期時間設(shè)置示例的詳細內(nèi)容,更多關(guān)于Caffeine動態(tài)過期時間設(shè)置的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
redis事務(wù)執(zhí)行常用命令及watch監(jiān)視詳解
這篇文章主要為大家介紹了redis事務(wù)執(zhí)行常用命令及watch監(jiān)視詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11
基于redis實現(xiàn)的點贊功能設(shè)計思路詳解
點贊是我們現(xiàn)在經(jīng)常見到的一個效果,如朋友圈、微博都有點贊的效果,下面這篇文章主要跟大家分享了基于redis實現(xiàn)的點贊功能設(shè)計思路的相關(guān)資料,文中介紹的非常詳細,對大家實現(xiàn)點贊功能具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-05-05
Windows系統(tǒng)設(shè)置Redis服務(wù)使其開機自啟動
Redis是一種鍵值對數(shù)據(jù)庫,也稱為內(nèi)存數(shù)據(jù)庫,因為它可以將數(shù)據(jù)存儲在內(nèi)存中,而不是在磁盤上,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)設(shè)置Redis服務(wù)使其開機自啟動的相關(guān)資料,需要的朋友可以參考下2024-01-01
spring?boot集成redis基礎(chǔ)入門實例詳解
redis在spring?boot項目開發(fā)中是常用的緩存套件,常見使用的是spring-boot-starter-data-redis,這篇文章主要介紹了spring?boot集成redis基礎(chǔ)入門,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-10-10

