日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-04-09 09:07:09 241觀看
導讀在日常開發中有很多這樣的場景:有一些業務系統的配置信息,數據量不大,修改頻率不高,但是訪問很頻繁。如果每次程序都從數據庫或集中式緩存中獲取,受限于硬盤 I/O性能、遠程網絡訪問限制等,程序的執行效率不高。在這樣的業務

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

今天我們來基于ConcurrentHashMap與ScheduledThreadPoolExecutor來實現一個線程安全的本地緩存:LocalCache。在LocalCache中支持永久緩存與臨時緩存,永久緩存的數據一直有效,臨時緩存的數據在指定時間到期之后會自動從緩存中移出。aB228資訊網——每日最新資訊28at.com

LocalCache提供了數據安全的增、刪、改、查功能,具體方法如下所示:aB228資訊網——每日最新資訊28at.com

方法名稱
aB228資訊網——每日最新資訊28at.com

方法說明
aB228資訊網——每日最新資訊28at.com

put(String key , V value)
aB228資訊網——每日最新資訊28at.com

向緩存中插入數據,數據永久有效
aB228資訊網——每日最新資訊28at.com

put(String key , V value , int seconds)
aB228資訊網——每日最新資訊28at.com

向緩存中插入數據,數據根據設定的時間生效,時間到期會從緩存中移出
aB228資訊網——每日最新資訊28at.com

containKey(String key)
aB228資訊網——每日最新資訊28at.com

判斷緩存中是否包含對應的key
aB228資訊網——每日最新資訊28at.com

get(String key)
aB228資訊網——每日最新資訊28at.com

根據key從緩存中獲取數據
aB228資訊網——每日最新資訊28at.com

remove(String key)
aB228資訊網——每日最新資訊28at.com

移出緩存中對應key的數據
aB228資訊網——每日最新資訊28at.com

shutdownNow()
aB228資訊網——每日最新資訊28at.com

關閉緩存池
aB228資訊網——每日最新資訊28at.com

1. 設計原理

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

本地緩存的設計如下圖所示:aB228資訊網——每日最新資訊28at.com

圖片圖片aB228資訊網——每日最新資訊28at.com

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

每次從緩存中查詢數據,LocalCache會直接從ConcurrentHashMap中讀取數據。aB228資訊網——每日最新資訊28at.com

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

2. 實現方案

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

圖片圖片aB228資訊網——每日最新資訊28at.com

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接口:一個沒有到期時間,另一個有到期時間。沒有到期時間表示數據永久有效,有到期時間的數據會在到期后從緩存中移除。aB228資訊網——每日最新資訊28at.com

接口實現

在接口實現DefaultLocalCache內部定義了三個常量:緩存的默認大小DEFAULT_CAPACITY、最大容量MAX_CAPACITY、定時線程池的大小DEFAULT_THREAD_SIZE。核心代碼如下:aB228資訊網——每日最新資訊28at.com

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支持永久緩存與臨時緩存兩種能力。aB228資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-82181-0.html面試官:如何設計和實現一個帶過期時間的本地緩存?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: JVM類加載:如何手寫自定義類加載器,命名空間詳解

下一篇: 四萬字102道Java多線程經典面試題

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
av成人激情| 欧美激情一区在线| 亚洲一区图片| 午夜在线观看欧美| 久久久成人精品| 免费中文日韩| 欧美日韩国产综合在线| 国产精品美女黄网| 国产综合欧美在线看| 亚洲人成欧美中文字幕| 亚洲天堂av综合网| 久久国产福利| 欧美3dxxxxhd| 国产精品qvod| 激情国产一区| 一区二区三区高清不卡| 欧美影院一区| 欧美激情va永久在线播放| 欧美日韩在线电影| 国产一区二区三区网站| 亚洲黑丝一区二区| 亚洲综合视频1区| 免费在线看成人av| 国产精品久久一区二区三区| 在线日韩中文字幕| 亚洲已满18点击进入久久| 久久综合给合久久狠狠狠97色69| 欧美日韩国产不卡| 国产一区二区成人| 99视频日韩| 久久一区中文字幕| 国产精品久久久久久久久久三级| 亚洲盗摄视频| 亚洲欧美激情视频在线观看一区二区三区| 麻豆av福利av久久av| 国产精品系列在线| 亚洲伦理久久| 久久久噜噜噜久久中文字免 | 欧美日韩一区二区三区在线观看免| 国产美女一区| 一本色道88久久加勒比精品| 久久久久久久999| 国产精品系列在线播放| 日韩午夜av在线| 老司机久久99久久精品播放免费| 国产欧美精品一区aⅴ影院| av成人免费| 欧美成人在线网站| 国内精品久久久久久影视8| 亚洲永久免费精品| 欧美激情aaaa| 在线日韩av片| 欧美尤物一区| 国产精品综合| 一区二区三区日韩欧美精品| 男女激情久久| 国模吧视频一区| 亚洲欧美日韩国产成人| 欧美日韩一区在线观看| 亚洲人在线视频| 久久女同精品一区二区| 国产有码一区二区| 午夜日韩在线观看| 国产精品免费网站| 亚洲图片欧美午夜| 欧美日韩在线三级| 日韩亚洲在线| 欧美精品粉嫩高潮一区二区| 亚洲激情成人网| 美女国产一区| 在线观看视频一区二区| 久久久久一区二区三区| 国产亚洲精品综合一区91| 午夜电影亚洲| 国产精品一区二区女厕厕| 亚洲自拍啪啪| 国产精品美女久久久久aⅴ国产馆| 中国成人亚色综合网站| 欧美丝袜一区二区| 亚洲一区二区三区久久 | 久久九九精品99国产精品| 国产欧美精品一区二区三区介绍| 亚洲色诱最新| 国产精品久久久一区二区三区 | 亚洲一区二区三区高清不卡| 国产精品成人国产乱一区| 亚洲深夜影院| 国产精品久久久久久久浪潮网站| 亚洲免费视频一区二区| 国产精品视频999| 欧美一级片在线播放| 国产午夜精品麻豆| 久久久久久久综合| 亚洲第一精品影视| 欧美激情bt| 国产精品99久久久久久久vr | 一色屋精品视频在线看| 噜噜噜噜噜久久久久久91| 在线日本成人| 欧美精品九九99久久| 一本色道88久久加勒比精品 | 免费人成网站在线观看欧美高清| 亚洲国产日韩欧美| 欧美人成在线| 亚洲影视九九影院在线观看| 国产欧美一区二区精品仙草咪| 久久久国际精品| 亚洲经典视频在线观看| 欧美日韩国产一中文字不卡| 亚洲一区二区视频| 国产婷婷色一区二区三区在线| 久久欧美肥婆一二区| 亚洲激情小视频| 国产精品久久久一区二区| 久久福利毛片| 亚洲韩国一区二区三区| 欧美日韩在线播放| 欧美一区国产二区| 亚洲国产mv| 欧美体内谢she精2性欧美| 午夜精品在线| 影音先锋久久精品| 欧美日韩精品免费观看视频完整 | 亚洲性线免费观看视频成熟| 国产日韩综合| 欧美肥婆在线| 亚洲女ⅴideoshd黑人| 尤妮丝一区二区裸体视频| 欧美日韩999| 欧美一区免费| 亚洲精品在线视频| 国产欧美日韩| 欧美精品色综合| 欧美一级淫片aaaaaaa视频| 亚洲国产高潮在线观看| 国产精品国产馆在线真实露脸| 久久久久免费观看| 宅男噜噜噜66一区二区| 狠狠色噜噜狠狠狠狠色吗综合| 欧美日韩国产综合新一区| 久久成人国产| 一本色道久久综合一区| 狠狠久久婷婷| 欧美视频在线视频| 久久久噜噜噜久久狠狠50岁| 一二美女精品欧洲| 黄色成人片子| 国产精品国码视频| 欧美jizzhd精品欧美喷水| 午夜精品av| 日韩视频免费观看| 黄色成人片子| 国产精品日韩欧美| 欧美激情在线有限公司| 久久精品青青大伊人av| 亚洲视频在线免费观看| 亚洲国产精品www| 国产婷婷成人久久av免费高清| 欧美三级乱码| 欧美大片在线观看一区| 久久精品视频免费播放| 亚洲字幕一区二区| a4yy欧美一区二区三区| 亚洲国产成人久久| 国产一区二区激情| 亚洲精品一区二区在线| 国产综合av| 国产精品区一区| 欧美日韩国产三级| 能在线观看的日韩av| 欧美在线黄色| 亚洲综合好骚| 一区二区欧美日韩| 亚洲激情网站免费观看| 在线欧美三区| 国产一区二区丝袜高跟鞋图片| 国产精品高潮呻吟久久| 欧美日韩在线大尺度| 欧美连裤袜在线视频| 免费观看成人www动漫视频| 久久精品91久久久久久再现| 亚洲欧美日产图| 国产精品99久久久久久宅男 | 亚洲欧洲在线观看| 一区在线免费| 国产一区二区三区不卡在线观看| 国产精品美女视频网站| 欧美日韩在线不卡一区| 欧美日韩国产成人精品| 欧美成人午夜| 免费在线观看一区二区| 久久久夜夜夜| 久久久青草青青国产亚洲免观| 欧美一区永久视频免费观看| 午夜激情综合网| 欧美一区二区三区喷汁尤物| 午夜精品视频在线观看一区二区| 亚洲一区精品视频| 亚洲欧美国产日韩中文字幕| 亚洲一区一卡| 亚洲愉拍自拍另类高清精品| 亚洲伊人一本大道中文字幕| 亚洲欧美日韩高清| 欧美一区二区精品久久911|