精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試官問我,如何設計和實現一個帶過期時間的本地緩存?

開發 前端
今天我們來基于ConcurrentHashMap與ScheduledThreadPoolExecutor來實現一個線程安全的本地緩存:LocalCache。在LocalCache中支持永久緩存與臨時緩存,永久緩存的數據一直有效,臨時緩存的數據在指定時間到期之后會自動從緩存中移出。

在日常開發中有很多這樣的場景:有一些業務系統的配置信息,數據量不大,修改頻率不高,但是訪問很頻繁。如果每次程序都從數據庫或集中式緩存中獲取,受限于硬盤 I/O性能、遠程網絡訪問限制等,程序的執行效率不高。在這樣的業務場景中,我們可以通過本地緩存來提升數據訪問的效率。

今天我們來基于ConcurrentHashMapScheduledThreadPoolExecutor來實現一個線程安全的本地緩存:LocalCache。在LocalCache中支持永久緩存與臨時緩存,永久緩存的數據一直有效,臨時緩存的數據在指定時間到期之后會自動從緩存中移出。

LocalCache提供了數據安全的增、刪、改、查功能,具體方法如下所示:

方法名稱

方法說明

put(String key , V value)

向緩存中插入數據,數據永久有效

put(String key , V value , int seconds)

向緩存中插入數據,數據根據設定的時間生效,時間到期會從緩存中移出

containKey(String key)

判斷緩存中是否包含對應的key

get(String key)

根據key從緩存中獲取數據

remove(String key)

移出緩存中對應key的數據

shutdownNow()

關閉緩存池

1. 設計原理

LocalCache主要由3個部分組成:數據緩存、數據超時時間、數據清理任務。數據緩存和數據超時時間都采用ConcurrentHashMap來存儲數據,數據超時時間中Key為數據存儲的鍵,value是數據的時間戳。數據清理任務采用ScheduledThreadPoolExecutor實現任務調度,默認的任務線程數為1,這樣可以避免多線程帶來的并發修改問題,同時線程都是內存操作,這樣單線程同樣具備高性能。

本地緩存的設計如下圖所示:

圖片image-20240402165304172

每次項緩存中插入數據時,LocalCache首先會將數據插入到ConcurrentHashMap中。然后判斷有沒有設置超時時間,如果有超時時間,LocalCache會將失效時間插入到ConcurrentHashMap中,并創建數據清理任務,之后任務提交到ScheduledThreadPoolExecutor線程池中。

每次從緩存中查詢數據,LocalCache會直接從ConcurrentHashMap中讀取數據。

定時任務線程池會按照超時時間來觸發數據清理任務,數據清理任務會從數據時長的緩存池中獲取Key對應的時間,判斷當前Key對應的數據是否已經到期了。如果數據已經到期了,LocalCache會調用remove方法將數據從緩存池中移除。

2. 實現方案

LocalCache作為本地緩存的接口,定義了數據插入、數據刪除、數據查詢的相關接口方法。DefaultLocalCache 定義了兩個ConcurrentHashMap變量:dataMap和timeOutMap。dataMap用來緩存數據信息,timeOutMap用來存儲數據失效的時間戳,同時還定義了數據清理任務ClearTask,ClearTask負責將過期的數據從dataMap中移除。UML圖如下所示:

圖片image-20240402165313203

3. 代碼展示

3.1 接口定義

public interface LocalCache<V> {
    /**
     * 插入數據,數據永久有效
     */
    boolean put(String key, V value);

    /**
     * 插入數據,在指定時間內生效
     */
    boolean put(String key, V value, int seconds);

    /**
     * 是否包含指定的key
     */
    boolean containKey(String key);

    /**
     * 獲取指定Key的值
     */
    V get(String key);

    /**
     * 從緩存中移除key對應的數據
     */
    void remove(String key);

    void shutdownNow();
}

在接口LocalCache中定義了兩個數據插入的put接口:一個沒有到期時間,另一個有到期時間。沒有到期時間表示數據永久有效,有到期時間的數據會在到期后從緩存中移除。

接口實現

在接口實現DefaultLocalCache內部定義了三個常量:緩存的默認大小DEFAULT_CAPACITY、最大容量MAX_CAPACITY、定時線程池的大小DEFAULT_THREAD_SIZE。核心代碼如下:

public class DefaultLocalCache<V> implements LocalCache<V> {
    // 默認容量
    private static final int DEFAULT_CAPACITY = 1024;
    private static final int MAX_CAPACITY = 100000;

    private static final int DEFAULT_THREAD_SIZE = 1;

    private final int maxSize;

    //數據map
    private volatile ConcurrentHashMap<String,V> dataMap;
    //過期時間
    private final ConcurrentHashMap<String,Long> timeOutMap;

    //定時任務
    private final ScheduledExecutorService executorService;

    public DefaultLocalCache() {
        maxSize = MAX_CAPACITY;
        dataMap = new ConcurrentHashMap<>(DEFAULT_CAPACITY);
        timeOutMap = new ConcurrentHashMap<>(DEFAULT_CAPACITY);
        executorService = new ScheduledThreadPoolExecutor(DEFAULT_THREAD_SIZE) ;
    }

    public DefaultLocalCache(int size) {
        maxSize = size;
        dataMap = new ConcurrentHashMap<>(DEFAULT_CAPACITY);
        timeOutMap = new ConcurrentHashMap<>(DEFAULT_CAPACITY);
        executorService = new ScheduledThreadPoolExecutor(DEFAULT_THREAD_SIZE) ;
    }

    @Override
    public boolean put(String key, V value) {
        //檢查容量
        if(checkCapacity()){
            dataMap.put(key,value);
            return true;
        }
        return false;
    }



    @Override
    public boolean put(String key, V value, int seconds) {
        if(checkCapacity()){
            dataMap.put(key,value);
            if(seconds >= 0){
                timeOutMap.put(key,getTimeOut(seconds));
                ClearTask task = new ClearTask(key);
                executorService.schedule(task, seconds, TimeUnit.SECONDS);
            }
        }
        return false;
    }

 ......

    class ClearTask implements Runnable{
        private String key;

        public ClearTask(String key){
            this.key = key;
        }
        @Override
        public void run() {
            //判斷緩存中是否有key
            if(timeOutMap.contains(key)){
                //獲取失效時間
                Long expire = timeOutMap.get(key);
                //如果失效時間大于0,并且比當前時間小,則刪除緩存
                if(expire > 0){
                    long now = System.currentTimeMillis();
                    if(now >= expire){
                        remove(key);
                    }
                }
            }
        }
    }
}

在LocalCache的默認實現DefaultLocalCache中,基于ConcurrentHashMap與ScheduledThreadPoolExecutor結合使用,使得LocalCache支持永久緩存與臨時緩存兩種能力。

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2024-04-09 08:39:16

本地緩存開發線程安全

2021-05-19 08:17:35

秒殺場景高并發

2025-11-11 09:25:19

2025-10-20 04:00:00

2021-05-20 08:54:16

Go面向對象

2024-02-20 14:10:55

系統緩存冗余

2024-01-19 14:03:59

Redis緩存系統Spring

2025-09-19 09:57:46

2021-12-13 09:02:13

localStorag面試前端

2024-01-15 10:38:20

多級緩存數據一致性分布式緩存

2025-06-04 03:15:00

高并發短鏈系統

2022-08-18 20:02:04

JSLRU緩存

2021-06-09 07:55:19

NodeEventEmitte驅動

2021-12-02 08:19:06

MVCC面試數據庫

2022-04-08 08:26:03

JavaHTTP請求

2021-09-28 13:42:55

Chrome Devwebsocket網絡協議

2025-09-15 10:05:00

后端URL短鏈

2022-02-09 09:37:54

ReactorNettyI/O

2022-05-24 08:03:28

InnoDBMySQL數據

2024-10-07 08:52:59

分布式系統分布式 IDID
點贊
收藏

51CTO技術棧公眾號

老司机一区二区三区| 精品国内亚洲2022精品成人| 国产精品久久久久影院| 91性高湖久久久久久久久_久久99| 欧美被狂躁喷白浆精品| 欧美影院天天5g天天爽| 欧美三区在线观看| 欧美一级免费播放| 91欧美在线视频| 成人99免费视频| 国产精品青青在线观看爽香蕉| 欧美日韩在线观看成人| 狠狠做六月爱婷婷综合aⅴ| 91精品国产综合久久蜜臀| 9久久9毛片又大又硬又粗| 视频免费一区| 久久久精品tv| 高清视频一区| 91丨九色丨丰满| 亚洲一区二区三区免费在线观看| 久久婷婷国产麻豆91天堂| 成人免费无遮挡无码黄漫视频| 日本一区二区乱| 欧美三级乱人伦电影| 国产精品沙发午睡系列| 色老头在线观看| 国产精品私房写真福利视频| 久久综合入口| 国产91久久久| 久久99精品国产| 国产精品吹潮在线观看| 亚洲国产综合久久| 欧美69视频| 久久精品视频在线| 亚洲天堂精品一区| 精品国产中文字幕第一页| 亚洲第一精品自拍| 国产在线a视频| 99久久999| 欧美日韩美少妇| 欧美精品成人网| 成人美女大片| 色综合天天综合网国产成人综合天 | 国产午夜精品久久久| 亚洲精品乱码久久久久久9色| 日韩欧美另类一区二区| 欧美日韩亚洲精品内裤| 男女视频网站在线观看| 国产污视频在线播放| 亚洲国产一区在线观看| 成人短视频在线观看免费| av免费在线免费| 亚洲蜜桃精久久久久久久| 中文字幕免费在线不卡| 男人影院在线观看| 亚洲女爱视频在线| 4444亚洲人成无码网在线观看 | 久久久久亚洲精品国产| 欧美激情一区二区视频| 亚洲午夜伦理| 欧美国产在线视频| 日韩乱码一区二区| 国产乱码精品| 国产成人精品免高潮在线观看| 国产精品视频一区在线观看| 日韩国产精品久久久久久亚洲| 国产精品国产三级国产专播精品人| 中文字幕黄色片| 日韩电影在线一区二区| 国产美女久久久| 99精品在线看| 成人app下载| 日本一区精品| 九七久久人人| 亚洲高清久久久| 国产又大又硬又粗| 精品福利在线| 日韩欧美在线不卡| 一本加勒比波多野结衣| 精品视频99| 久久成人这里只有精品| 亚洲国产精品午夜在线观看| 香蕉久久夜色精品国产| 国产欧美精品一区二区| 精品人妻午夜一区二区三区四区| 不卡一二三区首页| 水蜜桃一区二区| 中文字幕在线三区| 狠狠躁夜夜躁人人躁婷婷91| 午夜免费看毛片| 高潮按摩久久久久久av免费| 亚洲视频一区二区| 欧美精品一级片| 丝袜诱惑制服诱惑色一区在线观看| 成人黄色免费看| 偷拍自拍在线视频| 中文字幕一区三区| 春日野结衣av| 亚洲人体在线| 精品亚洲精品福利线在观看| 久久精品亚洲a| 国产欧美三级| 亚洲a中文字幕| 国产一级网站视频在线| 亚洲综合在线五月| 性欧美1819| 欧美美女黄色| 九九热精品视频国产| 久久人人爽人人爽人人片av免费| 国产一区二区调教| 欧美中文娱乐网| brazzers在线观看| 91麻豆精品国产91久久久更新时间 | 国产免费黄色片| 91丨porny丨户外露出| dy888午夜| 成人黄色在线| 日韩国产精品视频| 妺妺窝人体色www聚色窝仙踪 | 韩国久久久久| 国产在线观看精品| 欧美91精品久久久久国产性生爱| 亚洲精品中文在线观看| 婷婷激情四射五月天| 欧美精品国产白浆久久久久| 欧美黑人xxxx| 国产精品视频一区二区三区,| 久久亚洲捆绑美女| 国产精品无码一区二区在线| 影音先锋欧美激情| 久久亚洲精品成人| 怡红院成永久免费人全部视频| 久久婷婷色综合| 日本国产在线播放| 好吊妞视频这里有精品| 欧美乱大交xxxxx| 国产后入清纯学生妹| 综合久久久久综合| 久久久精品高清| 日韩毛片视频| 国产日韩精品入口| av网站无病毒在线| 欧美亚洲图片小说| 99久久99久久精品免费看小说.| 久久裸体视频| 日韩免费av一区二区三区| 浪潮色综合久久天堂| 亚洲品质视频自拍网| 天天干天天操天天操| 国产女同性恋一区二区| 国产精品亚洲二区在线观看| 国产成人黄色| 国产精品海角社区在线观看| xxxxx日韩| 在线成人小视频| 国产suv一区二区三区| 黑人巨大精品欧美黑白配亚洲| 偷拍盗摄高潮叫床对白清晰| 久久av网站| 午夜精品久久久久久久99热| 色香蕉在线视频| 亚洲va中文字幕| 国产精品久久无码| 久久免费国产| 亚洲一区二区三区午夜| 免费一级欧美在线大片| 欧美福利视频在线| 日本在线一二三| 欧美系列亚洲系列| 日韩黄色免费观看| 白白色亚洲国产精品| 成人观看免费完整观看| 欧美www视频在线观看| 91久久久一线二线三线品牌| 成全电影大全在线观看| 日韩电影中文字幕| 中文字幕人妻互换av久久| 亚洲日韩欧美一区二区在线| 欧美日韩人妻精品一区在线| 久久一区欧美| 久久久99精品视频| 欧美三级电影在线| 成人h视频在线| a在线视频v视频| 中文字幕亚洲综合久久| 亚洲精品一级片| 在线看日韩精品电影| 欧美高清视频一区二区三区| www.一区二区| 久久久精品高清| 男人的天堂亚洲| 婷婷视频在线播放| 中文有码一区| 99国产在线| 久久精品女人天堂av免费观看 | 一区二区三区在线观看www| youjizz欧美| 国产精品一二三在线| 久草在线资源站资源站| 中文字幕一区二区精品| 日韩在线观看视频网站| 欧美日韩一区 二区 三区 久久精品| 国产精品999久久久| 国产精品毛片高清在线完整版| 国产女人18毛片水真多18| 久久91精品国产91久久小草| 久久久999免费视频| 一区二区影院| 亚洲福利av| 偷拍亚洲色图| http;//www.99re视频| 欧美成人一二区| 欧美在线观看网址综合| 欧美另类tv| 色七七影院综合| 久久免费看视频| 亚洲福利在线观看| 国内毛片毛片毛片毛片| 欧美日韩视频专区在线播放| 成人在线免费看视频| 亚洲一二三四久久| 欧美成人精品一区二区免费看片| 亚洲国产成人自拍| 一区二区三区伦理片| 2014亚洲片线观看视频免费| 国产高潮视频在线观看| 国产成人精品亚洲777人妖| 亚洲美女爱爱视频| 蜜臀av一区二区在线免费观看 | 99re这里只有精品首页| 男男受被啪到高潮自述| 国产一区二区久久| 涩涩网站在线看| 精品一区精品二区高清| www.夜夜爽| 久久er精品视频| 中文字幕22页| 麻豆成人久久精品二区三区小说| 激情综合网婷婷| 天堂一区二区在线| 能在线观看的av网站| 久久一区二区三区超碰国产精品| 每日在线更新av| 久久成人在线| 宅男噜噜噜66国产免费观看| 日精品一区二区三区| 能在线观看的av网站| 久久人人精品| 欧美三级理论片| 蜜桃av噜噜一区二区三区小说| 欧美性猛交xxx乱久交| 日本vs亚洲vs韩国一区三区二区| 蜜桃免费在线视频| 国产在线不卡一区| 波多野结衣网页| 成人黄色777网| 免费观看一级一片| 久久久九九九九| 在线观看天堂av| 成人欧美一区二区三区1314| 精品国产欧美日韩不卡在线观看 | 国产99久久久| 在线日韩av片| 国产精品久久免费| 日韩女优av电影| 亚州av在线播放| 亚洲新声在线观看| 激情在线小视频| 久久久久亚洲精品成人网小说| 女人高潮被爽到呻吟在线观看| 日本精品va在线观看| 欧美一级做一级爱a做片性| 91亚洲精品一区| 久久99国产精品久久99大师| 人偷久久久久久久偷女厕| 日韩大片在线观看| 特级西西444| 老鸭窝亚洲一区二区三区| 91极品视频在线观看| 国产成人在线观看免费网站| 毛茸茸多毛bbb毛多视频| 国产精品免费久久| 久久亚洲AV无码| 在线欧美小视频| 亚洲av无码国产精品永久一区| 日韩精品在线视频观看| 欧美r级在线| 欧美一区亚洲一区| 国产精品久久免费视频| 欧美日韩精品免费观看| 亚洲女同中文字幕| 超碰97人人射妻| 国产一区二区美女诱惑| 白白色免费视频| 亚洲最大成人网4388xx| 亚洲熟妇无码久久精品| 亚洲国产精品va在线看黑人动漫| av电影在线播放高清免费观看| 欧美精品www在线观看| 成人国产在线| 久久偷看各类wc女厕嘘嘘偷窃| 久久精品青草| 日韩一级片播放| www.在线成人| 久久久精品视频免费观看| 欧美中文字幕一区二区三区| 国精品人妻无码一区二区三区喝尿| 在线免费观看羞羞视频一区二区| 成年网站在线视频网站| 91在线观看免费观看| 日韩精品久久| 97在线免费公开视频| 成人动漫一区二区在线| 黄色一级大片在线免费观看| 色嗨嗨av一区二区三区| 日本高清视频www| 欧美区在线播放| 日韩欧国产精品一区综合无码| 欧洲在线视频一区| 99视频在线精品国自产拍免费观看| 国产黄色一区二区三区 | 日本免费一二三区| 538prom精品视频线放| yw视频在线观看| 国产精品高潮呻吟久久av野狼| 欧美日韩一本| 国产精品又粗又长| 成人毛片视频在线观看| 欧美三级日本三级| 日韩一区二区免费视频| 九七久久人人| 成人免费网站在线| 日韩成人三级| 天堂av2020| 亚洲欧洲无码一区二区三区| 一区二区小视频| 中文字幕在线视频日韩| 写真福利精品福利在线观看| 欧美一进一出视频| 久久亚洲综合| 中文字幕一二三四区| 欧美日韩在线看| 欧美69xxxxx| 国产精品∨欧美精品v日韩精品| 女厕嘘嘘一区二区在线播放 | 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 超级碰碰久久| 日韩av电影在线观看| 蜜臀av在线播放一区二区三区| 999精品久久久| 69堂成人精品免费视频| 天堂av中文在线| 国产精品免费一区二区三区四区| 欧美天堂亚洲电影院在线观看 | 男女视频在线看| 国产精品无遮挡| 99久久精品国产色欲| 色综合色综合久久综合频道88| 成人偷拍自拍| 日本a级片免费观看| 国产欧美日产一区| 99国产在线播放| 51色欧美片视频在线观看| 国产videos久久| 91亚洲精品久久久蜜桃借种| 亚洲精品乱码久久久久久久久| 亚洲精品成人区在线观看| 性欧美视频videos6一9| 国产一区二区三区探花| 日韩 国产 一区| 亚洲成av人在线观看| 国产女主播在线直播| 91色p视频在线| 亚洲精品美女91| 中文字幕av久久爽一区| 91精品国产综合久久精品性色| 91探花在线观看| 亚洲高清在线观看一区| 国产69精品久久777的优势| 日日摸天天添天天添破| 久久久精品久久久| 亚洲另类春色校园小说| 奇米视频7777| 五月婷婷激情综合| 最新97超碰在线| 国产精品一区二区在线观看| 日韩电影在线一区二区| 国产亚洲精久久久久久无码77777| 日韩精品中文字幕久久臀| 色综合一区二区日本韩国亚洲| 成人在线国产视频| 国产精品久久网站| 污污的视频网站在线观看| 国产男人精品视频| 国产日韩1区| 国产真实乱在线更新| 亚洲欧美中文日韩在线| 大型av综合网站| 捷克做爰xxxⅹ性视频| 日本韩国一区二区三区视频|