最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Caffeine實現(xiàn)類似redis的動態(tài)過期時間設(shè)置示例

 更新時間:2023年08月29日 10:37:33   作者:TinyThing  
這篇文章主要為大家介紹了Caffeine實現(xiàn)類似redis的動態(tài)過期時間示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

使用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è)置示例的詳細(xì)內(nèi)容,更多關(guān)于Caffeine動態(tài)過期時間設(shè)置的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Redis實現(xiàn)Session共享與單點登錄

    Redis實現(xiàn)Session共享與單點登錄

    本文主要介紹了Redis實現(xiàn)Session共享與單點登錄,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • redis內(nèi)存空間效率問題的深入探究

    redis內(nèi)存空間效率問題的深入探究

    redis緩存固然高效,可是它會占用我們系統(tǒng)中寶貴的內(nèi)存資源,那該如何解決呢?這篇文章主要給大家介紹了關(guān)于redis內(nèi)存空間效率問題的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • 詳解redis中的鎖以及使用場景

    詳解redis中的鎖以及使用場景

    這篇文章主要介紹了詳解redis中的鎖以及使用場景,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Redis遠(yuǎn)程字典服務(wù)器?hash類型示例詳解

    Redis遠(yuǎn)程字典服務(wù)器?hash類型示例詳解

    這篇文章主要介紹了Redis遠(yuǎn)程字典服務(wù)器?hash類型示例詳解,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • redis事務(wù)執(zhí)行常用命令及watch監(jiān)視詳解

    redis事務(wù)執(zhí)行常用命令及watch監(jiān)視詳解

    這篇文章主要為大家介紹了redis事務(wù)執(zhí)行常用命令及watch監(jiān)視詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 基于redis實現(xiàn)的點贊功能設(shè)計思路詳解

    基于redis實現(xiàn)的點贊功能設(shè)計思路詳解

    點贊是我們現(xiàn)在經(jīng)常見到的一個效果,如朋友圈、微博都有點贊的效果,下面這篇文章主要跟大家分享了基于redis實現(xiàn)的點贊功能設(shè)計思路的相關(guān)資料,文中介紹的非常詳細(xì),對大家實現(xiàn)點贊功能具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • Windows系統(tǒng)設(shè)置Redis服務(wù)使其開機(jī)自啟動

    Windows系統(tǒng)設(shè)置Redis服務(wù)使其開機(jī)自啟動

    Redis是一種鍵值對數(shù)據(jù)庫,也稱為內(nèi)存數(shù)據(jù)庫,因為它可以將數(shù)據(jù)存儲在內(nèi)存中,而不是在磁盤上,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)設(shè)置Redis服務(wù)使其開機(jī)自啟動的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Redis哨兵監(jiān)控的使用

    Redis哨兵監(jiān)控的使用

    在Redis集群模式中,哨兵模式是一種常用的方案,本文主要介紹了Redis哨兵監(jiān)控的使用,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • redis中bind配置的詳細(xì)步驟

    redis中bind配置的詳細(xì)步驟

    本文主要介紹了redis中bind配置的詳細(xì)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • spring?boot集成redis基礎(chǔ)入門實例詳解

    spring?boot集成redis基礎(chǔ)入門實例詳解

    redis在spring?boot項目開發(fā)中是常用的緩存套件,常見使用的是spring-boot-starter-data-redis,這篇文章主要介紹了spring?boot集成redis基礎(chǔ)入門,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10

最新評論

宁德市| 大荔县| 莲花县| 博湖县| 金溪县| 天长市| 五台县| 宁陕县| 禄劝| 郸城县| 麟游县| 石台县| 文成县| 溧阳市| 泽州县| 康平县| 康保县| 娱乐| 平定县| 商河县| 鄂托克旗| 博白县| 黄梅县| 社旗县| 利川市| 西峡县| 积石山| 汤原县| 甘肃省| 喀喇沁旗| 英吉沙县| 米脂县| 武乡县| 沈丘县| 邹平县| 巴彦县| 商丘市| 当涂县| 邵东县| 高唐县| 衡水市|