我設計了一個牛逼的本地緩存!
點擊上方?好好學java?,選擇?星標?公眾號
重磅資訊、干貨,第一時間送達
重磅資訊、干貨,第一時間送達
今日推薦:硬剛一周,3W字總結,一年的經(jīng)驗告訴你如何準備校招!
個人原創(chuàng)100W+訪問量博客:點擊前往,查看更多
個人原創(chuàng)100W+訪問量博客:點擊前往,查看更多
作者:ksfzhaohui
http://dwz.win/Ws4
考慮點
1.數(shù)據(jù)結構
2.對象上限
3.清除策略
4.過期時間
5.線程安全
6.簡明的接口
7.是否持久化
8.阻塞機制
如何實現(xiàn)
1.數(shù)據(jù)結構
????Map<Object,?Object>?cache?=?new?ConcurrentHashMap<Object,?Object>()Mybatis使用HashMap本身是非線程安全的,所以可以看到起內(nèi)部使用了一個SynchronizedCache用來包裝,保證線程的安全性;?
2.對象上限
3.清除策略
LRU?:Least Recently
Used的縮寫最近最少使用,移除最長時間不被使用的對象;常見的使用LinkedHashMap來實現(xiàn),也是很多本地緩存默認使用的策略;?
FIFO?:先進先出,按對象進入緩存的順序來移除它們;常見使用隊列Queue來實現(xiàn);?
LFU?:Least Frequently
Used的縮寫大概也是最近最少使用的意思,和LRU有點像;區(qū)別點在LRU的淘汰規(guī)則是基于訪問時間,而LFU是基于訪問次數(shù)的;可以通過HashMap并且記錄訪問次數(shù)來實現(xiàn);?
SOFT?:軟引用基于垃圾回收器狀態(tài)和軟引用規(guī)則移除對象;常見使用SoftReference來實現(xiàn);?
WEAK?:弱引用更積極地基于垃圾收集器狀態(tài)和弱引用規(guī)則移除對象;常見使用WeakReference來實現(xiàn);
4.過期時間
被動刪除?:每次進行get/put操作的時候都會檢查一下當前key是否已經(jīng)過期,如果過期則刪除,類似如下代碼:
????if?(System.currentTimeMillis()?-?lastClear?>?clearInterval)?{
??????????clear();
????}
????
5.線程安全
?????public?synchronized?void?putObject(Object?key,?Object?object)?{
????????...省略...
??????}
??????@Override
??????public?synchronized?Object?getObject(Object?key)?{
????????...省略...
??????}
????
6.簡明的接口
????public?interface?Cache?{
??????String?getId();
??????void?putObject(Object?key,?Object?value);
??????Object?getObject(Object?key);
??????Object?removeObject(Object?key);
??????void?clear();
??????int?getSize();
??????ReadWriteLock?getReadWriteLock();
????}
????
????public?interface?Cache<K,?V>?{
??????V?getIfPresent(@CompatibleWith("K")?Object?key);
??????V?get(K?key,?Callable?extends?V>?loader)?throws?ExecutionException;
??????ImmutableMap?getAllPresent(Iterable>?keys) ;
??????void?put(K?key,?V?value);
??????void?putAll(Map?extends?K,???extends?V>?m);
??????void?invalidate(@CompatibleWith("K")?Object?key);
??????void?invalidateAll(Iterable>?keys);
??????void?invalidateAll();
??????long?size();
??????CacheStats?stats();
??????ConcurrentMap?asMap() ;
??????void?cleanUp();
????}
7.是否持久化
????diskPersistent="false"?//是否持久化磁盤緩存
8.阻塞機制
????public?class?Memoizerl<A,?V>?implements?Computable<A,?V>?{
????????private?final?Map>?cache?=?new?ConcurrentHashMap>();
????????private?final?Computable?c;
????????public?Memoizerl(Computable?c)?{
????????????this.c?=?c;
????????}
????????@Override
????????public?V?compute(A?arg)?throws?InterruptedException,?ExecutionException?{
????????????while?(true)?{
????????????????Future?f?=?cache.get(arg);
????????????????if?(f?==?null)?{
????????????????????Callable?eval?=?new?Callable ()?{
????????????????????????@Override
????????????????????????public?V?call()?throws?Exception?{
????????????????????????????return?c.compute(arg);
????????????????????????}
????????????????????};
????????????????????FutureTask?ft?=?new?FutureTask (eval);
????????????????????f?=?cache.putIfAbsent(arg,?ft);
????????????????????if?(f?==?null)?{
????????????????????????f?=?ft;
????????????????????????ft.run();
????????????????????}
????????????????????try?{
????????????????????????return?f.get();
????????????????????}?catch?(CancellationException?e)?{
????????????????????????cache.remove(arg,?f);
????????????????????}
????????????????}
????????????}
????????}
????}
總結
推薦文章
原創(chuàng)電子書
歷時整整一年總結的?Java 面試 + Java 后端技術學習指南,這是本人這幾年及校招的總結,各種高頻面試題已經(jīng)全部進行總結,按照章節(jié)復習即可,已經(jīng)拿到了大廠offer。
原創(chuàng)思維導圖
掃碼或者微信搜?程序員的技術圈子?回復?面試?領取原創(chuàng)電子書和思維導圖。
評論
圖片
表情



