国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

Redis + Caffeine 太強(qiáng)了!

0
分享至

Java精選面試題(微信小程序):5000+道面試題和選擇題,真實(shí)面經(jīng)簡歷模版,包含Java基礎(chǔ)、并發(fā)、JVM、線程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架構(gòu)設(shè)計(jì)、大廠真題等,在線隨時(shí)刷題!

背景

在高性能的服務(wù)架構(gòu)設(shè)計(jì)中,緩存是一個(gè)不可或缺的環(huán)節(jié)。在實(shí)際的項(xiàng)目中,我們通常會將一些熱點(diǎn)數(shù)據(jù)存儲到Redis或Memcached 這類緩存中間件中,只有當(dāng)緩存的訪問沒有命中時(shí)再查詢數(shù)據(jù)庫。在提升訪問速度的同時(shí),也能降低數(shù)據(jù)庫的壓力。

隨著不斷的發(fā)展,這一架構(gòu)也產(chǎn)生了改進(jìn),在一些場景下可能單純使用Redis類的遠(yuǎn)程緩存已經(jīng)不夠了,還需要進(jìn)一步配合本地緩存使用,例如Guava cache或Caffeine,從而再次提升程序的響應(yīng)速度與服務(wù)性能。于是,就產(chǎn)生了使用本地緩存作為一級緩存,再加上遠(yuǎn)程緩存作為二級緩存的兩級緩存架構(gòu)。

在先不考慮并發(fā)等復(fù)雜問題的情況下,兩級緩存的訪問流程可以用下面這張圖來表示:

為什么要使用本地緩存

本地緩存基于本地環(huán)境的內(nèi)存,訪問速度非???,對于一些變更頻率低、實(shí)時(shí)性要求低的數(shù)據(jù),可以放在本地緩存中,提升訪問速度。

使用本地緩存能夠減少和Redis類的遠(yuǎn)程緩存間的數(shù)據(jù)交互,減少網(wǎng)絡(luò)I/O開銷,降低這一過程中在網(wǎng)絡(luò)通信上的耗時(shí)。

設(shè)計(jì)一個(gè)本地內(nèi)存需要有什么功能

  1. 存儲,并可以讀、寫;

  2. 原子操作(線程安全),如ConcurrentHashMap;

  3. 可以設(shè)置緩存的最大限制;

  4. 超過最大限制有對應(yīng)淘汰策略,如LRU、LFU;

  5. 過期時(shí)間淘汰,如定時(shí)、懶式、定期;

  6. 持久化;

  7. 統(tǒng)計(jì)監(jiān)控。

本地緩存方案選型

1. 使用ConcurrentHashMap實(shí)現(xiàn)本地緩存

緩存的本質(zhì)就是存儲在內(nèi)存中的KV數(shù)據(jù)結(jié)構(gòu),對應(yīng)的就是jdk中線程安全的ConcurrentHashMap,但是要實(shí)現(xiàn)緩存,還需要考慮淘汰、最大限制、緩存過期時(shí)間淘汰等等功能;

優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,不需要引入第三方包,比較適合一些簡單的業(yè)務(wù)場景。缺點(diǎn)是如果需要更多的特性,需要定制化開發(fā),成本會比較高,并且穩(wěn)定性和可靠性也難以保障。對于比較復(fù)雜的場景,建議使用比較穩(wěn)定的開源工具。

2. 基于Guava Cache實(shí)現(xiàn)本地緩存

Guava是Google團(tuán)隊(duì)開源的一款 Java 核心增強(qiáng)庫,包含集合、并發(fā)原語、緩存、IO、反射等工具箱,性能和穩(wěn)定性上都有保障,應(yīng)用十分廣泛。Guava Cache支持很多特性:

  • 支持最大容量限制

  • 支持兩種過期刪除策略(插入時(shí)間和訪問時(shí)間)

  • 支持簡單的統(tǒng)計(jì)功能

  • 基于LRU算法實(shí)現(xiàn)

使用代碼如下:

    com.google.guava     guava     31.1-jre @Slf4j public class GuavaCacheTest {     public static void main(String[] args) throws ExecutionException {         Cache cache = CacheBuilder.newBuilder()                 .initialCapacity(5)  // 初始容量                 .maximumSize(10)     // 最大緩存數(shù),超出淘汰                 .expireAfterWrite(60, TimeUnit.SECONDS) // 過期時(shí)間                 .build();         String orderId = String.valueOf(123456789);         // 獲取orderInfo,如果key不存在,callable中調(diào)用getInfo方法返回?cái)?shù)據(jù)         String orderInfo = cache.get(orderId, () -> getInfo(orderId));         log.info("orderInfo = {}", orderInfo);     }     private static String getInfo(String orderId) {         String info = "";         // 先查詢r(jià)edis緩存         log.info("get data from redis");         // 當(dāng)redis緩存不存在查db         log.info("get data from mysql");         info = String.format("{orderId=%s}", orderId);         return info;     } }

3. Caffeine

Caffeine是基于java8實(shí)現(xiàn)的新一代緩存工具,緩存性能接近理論最優(yōu)??梢钥醋魇荊uava Cache的增強(qiáng)版,功能上兩者類似,不同的是Caffeine采用了一種結(jié)合LRU、LFU優(yōu)點(diǎn)的算法:W-TinyLFU,在性能上有明顯的優(yōu)越性

使用代碼如下:

    com.github.ben-manes.caffeine     caffeine     2.9.3 @Slf4j public class CaffeineTest {     public static void main(String[] args) {         Cache cache = Caffeine.newBuilder()                 .initialCapacity(5)                 // 超出時(shí)淘汰                 .maximumSize(10)                 //設(shè)置寫緩存后n秒鐘過期                 .expireAfterWrite(60, TimeUnit.SECONDS)                 //設(shè)置讀寫緩存后n秒鐘過期,實(shí)際很少用到,類似于expireAfterWrite                 //.expireAfterAccess(17, TimeUnit.SECONDS)                 .build();         String orderId = String.valueOf(123456789);         String orderInfo = cache.get(orderId, key -> getInfo(key));         System.out.println(orderInfo);     }     private static String getInfo(String orderId) {         String info = "";         // 先查詢r(jià)edis緩存         log.info("get data from redis");         // 當(dāng)redis緩存不存在查db         log.info("get data from mysql");         info = String.format("{orderId=%s}", orderId);         return info;     } }

4. Encache

Encache是一個(gè)純Java的進(jìn)程內(nèi)緩存框架,具有快速、精干等特點(diǎn),是Hibernate中默認(rèn)的CacheProvider。同Caffeine和Guava Cache相比,Encache的功能更加豐富,擴(kuò)展性更強(qiáng):

  • 支持多種緩存淘汰算法,包括LRU、LFU和FIFO

  • 緩存支持堆內(nèi)存儲、堆外存儲、磁盤存儲(支持持久化)三種

  • 支持多種集群方案,解決數(shù)據(jù)共享問題

使用代碼如下:

    org.ehcache     ehcache     3.9.7 @Slf4j public class EhcacheTest {     private static final String ORDER_CACHE = "orderCache";     public static void main(String[] args) {         CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()                 // 創(chuàng)建cache實(shí)例                 .withCache(ORDER_CACHE, CacheConfigurationBuilder                         // 聲明一個(gè)容量為20的堆內(nèi)緩存                         .newCacheConfigurationBuilder(String.class, String.class, ResourcePoolsBuilder.heap(20)))                 .build(true);         // 獲取cache實(shí)例         Cache cache = cacheManager.getCache(ORDER_CACHE, String.class, String.class);         String orderId = String.valueOf(123456789);         String orderInfo = cache.get(orderId);         if (StrUtil.isBlank(orderInfo)) {             orderInfo = getInfo(orderId);             cache.put(orderId, orderInfo);         }         log.info("orderInfo = {}", orderInfo);     }     private static String getInfo(String orderId) {         String info = "";         // 先查詢r(jià)edis緩存         log.info("get data from redis");         // 當(dāng)redis緩存不存在查db         log.info("get data from mysql");         info = String.format("{orderId=%s}", orderId);         return info;     } }
本地緩存問題及解決

1. 緩存一致性

兩級緩存與數(shù)據(jù)庫的數(shù)據(jù)要保持一致,一旦數(shù)據(jù)發(fā)生了修改,在修改數(shù)據(jù)庫的同時(shí),本地緩存、遠(yuǎn)程緩存應(yīng)該同步更新。

解決方案1: MQ

一般現(xiàn)在部署都是集群部署,有多個(gè)不同節(jié)點(diǎn)的本地緩存; 可以使用MQ的廣播模式,當(dāng)數(shù)據(jù)修改時(shí)向MQ發(fā)送消息,節(jié)點(diǎn)監(jiān)聽并消費(fèi)消息,刪除本地緩存,達(dá)到最終一致性;

解決方案2:Canal + MQ

如果你不想在你的業(yè)務(wù)代碼發(fā)送MQ消息,還可以適用近幾年比較流行的方法:訂閱數(shù)據(jù)庫變更日志,再操作緩存。Canal 訂閱Mysql的 Binlog日志,當(dāng)發(fā)生變化時(shí)向MQ發(fā)送消息,進(jìn)而也實(shí)現(xiàn)數(shù)據(jù)一致性。

2. 如何提高本地緩存命中率

參考:如何提高緩存命中率

3. 本地內(nèi)存的技術(shù)選型問題

  • 從易用性角度,Guava Cache、Caffeine和Encache都有十分成熟的接入方案,使用簡單。

  • 從功能性角度,Guava Cache和Caffeine功能類似,都是只支持堆內(nèi)緩存,Encache相比功能更為豐富

  • 從性能上進(jìn)行比較,Caffeine最優(yōu)、GuavaCache次之,Encache最差(下圖是三者的性能對比結(jié)果)

對于本地緩存的方案中,我比較推薦Caffeine,性能上遙遙領(lǐng)先。

雖然Encache功能更為豐富,甚至提供了持久化和集群的功能,但是這些功能完全可以依靠其他方式實(shí)現(xiàn)。真實(shí)的業(yè)務(wù)工程中,建議使用Caffeine作為本地緩存,另外使用redis或者memcache作為分布式緩存,構(gòu)造多級緩存體系,保證性能和可靠性。

來源:https://blog.csdn.net/One_hundred_nice/article/details/123950638

公眾號“Java精選”所發(fā)表內(nèi)容注明來源的,版權(quán)歸原出處所有(無法查證版權(quán)的或者未注明出處的均來自網(wǎng)絡(luò),系轉(zhuǎn)載,轉(zhuǎn)載的目的在于傳遞更多信息,版權(quán)屬于原作者。如有侵權(quán),請聯(lián)系,筆者會第一時(shí)間刪除處理!

最近有很多人問,有沒有讀者交流群!加入方式很簡單,公眾號Java精選,回復(fù)“加群”,即可入群!

文章有幫助的話,點(diǎn)在看,轉(zhuǎn)發(fā)吧!

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
尤爾曼德:我們在聯(lián)賽階段戰(zhàn)勝了本菲卡、曼城,這表現(xiàn)可接受

尤爾曼德:我們在聯(lián)賽階段戰(zhàn)勝了本菲卡、曼城,這表現(xiàn)可接受

懂球帝
2026-01-29 16:24:06
清華美女教授在三亞突然去世:事發(fā)全過程披露,學(xué)生披露大量隱情

清華美女教授在三亞突然去世:事發(fā)全過程披露,學(xué)生披露大量隱情

博士觀察
2026-01-28 20:46:56
商業(yè)航天概念震蕩拉升 航天科技直線漲停

商業(yè)航天概念震蕩拉升 航天科技直線漲停

每日經(jīng)濟(jì)新聞
2026-01-29 11:06:08
被曝“丑聞”才2小時(shí),交警回應(yīng)金晨肇事逃逸,惡心的一幕出現(xiàn)了

被曝“丑聞”才2小時(shí),交警回應(yīng)金晨肇事逃逸,惡心的一幕出現(xiàn)了

靜若梨花
2026-01-29 16:25:55
“流氓有文化更可怕”,退休老干部頻繁聯(lián)系女幼師,聊天記錄曝光

“流氓有文化更可怕”,退休老干部頻繁聯(lián)系女幼師,聊天記錄曝光

妍妍教育日記
2026-01-27 19:58:28
隨著吉達(dá)國民4-0,費(fèi)哈3-1,沙特聯(lián)積分榜出爐:C羅率隊(duì)跌至第3

隨著吉達(dá)國民4-0,費(fèi)哈3-1,沙特聯(lián)積分榜出爐:C羅率隊(duì)跌至第3

凌空倒鉤
2026-01-29 07:56:44
15年前,徐帆砸了沈星的豪宅。 15年后沈星還住在4500萬房子里。

15年前,徐帆砸了沈星的豪宅。 15年后沈星還住在4500萬房子里。

歲月有情1314
2026-01-29 13:47:16
把水賣給酒鬼?河南一藥企“不務(wù)正業(yè)”,一年掙了40億

把水賣給酒鬼?河南一藥企“不務(wù)正業(yè)”,一年掙了40億

毒sir財(cái)經(jīng)
2026-01-28 15:27:05
退位后的李淵日子有多難過?李世民:您的宮女太多,不如回家嫁人

退位后的李淵日子有多難過?李世民:您的宮女太多,不如回家嫁人

掠影后有感
2026-01-29 10:44:30
這次軍委的動作,真是讓人倒吸一口涼氣!

這次軍委的動作,真是讓人倒吸一口涼氣!

百態(tài)人間
2026-01-27 15:31:38
他是五代十國最好皇帝,計(jì)劃30年開創(chuàng)太平年,可老天只給他5年半

他是五代十國最好皇帝,計(jì)劃30年開創(chuàng)太平年,可老天只給他5年半

長風(fēng)文史
2026-01-29 14:46:17
還八百就八百,你可知八百精兵意味著什么?

還八百就八百,你可知八百精兵意味著什么?

小豫講故事
2026-01-28 06:00:07
開年大瓜!國產(chǎn)女優(yōu)上岸成功嫁為人妻,拍短視頻后遭惡語相向

開年大瓜!國產(chǎn)女優(yōu)上岸成功嫁為人妻,拍短視頻后遭惡語相向

社會醬
2026-01-16 16:54:49
特朗普:她不會辭職;我可能面臨被彈劾

特朗普:她不會辭職;我可能面臨被彈劾

揚(yáng)子晚報(bào)
2026-01-28 07:23:00
凍干草莓檢出鎘超標(biāo)、國家禁用農(nóng)藥克百威殘留?采購企業(yè)投訴,市監(jiān)認(rèn)為沒標(biāo)準(zhǔn)不立案

凍干草莓檢出鎘超標(biāo)、國家禁用農(nóng)藥克百威殘留?采購企業(yè)投訴,市監(jiān)認(rèn)為沒標(biāo)準(zhǔn)不立案

大風(fēng)新聞
2026-01-28 19:04:04
自己在家養(yǎng)發(fā)半年:頭發(fā)越來越多,白的越來越少,我做對了3件事

自己在家養(yǎng)發(fā)半年:頭發(fā)越來越多,白的越來越少,我做對了3件事

君笙的拂兮
2026-01-28 16:47:18
俄邀澤連斯基赴莫斯科和普京會面!總統(tǒng)助理:來吧,保證你的安全

俄邀澤連斯基赴莫斯科和普京會面!總統(tǒng)助理:來吧,保證你的安全

娛樂督察中
2026-01-29 16:00:30
價(jià)格大跳水!主力車型直降超15萬,中年男人的夢中豪車撐不住了?

價(jià)格大跳水!主力車型直降超15萬,中年男人的夢中豪車撐不住了?

財(cái)經(jīng)八卦
2026-01-28 20:05:03
國鐵集團(tuán):12306客戶端沒與任何第三方平臺合作,不便上網(wǎng)的老年人可電話購票

國鐵集團(tuán):12306客戶端沒與任何第三方平臺合作,不便上網(wǎng)的老年人可電話購票

紅星新聞
2026-01-29 11:19:02
腸癌手術(shù)一做,人生倒計(jì)時(shí)就開始了?醫(yī)生實(shí)話實(shí)說:這5點(diǎn)要注意

腸癌手術(shù)一做,人生倒計(jì)時(shí)就開始了?醫(yī)生實(shí)話實(shí)說:這5點(diǎn)要注意

荷蘭豆愛健康
2026-01-29 13:04:32
2026-01-29 17:16:49
Java精選
Java精選
一場永遠(yuǎn)也演不完的戲
1768文章數(shù) 3859關(guān)注度
往期回顧 全部

科技要聞

周亞輝的AI新賭局:國內(nèi)太卷 出海另起爐灶

頭條要聞

女大學(xué)生到東北游玩暈倒雪地凍傷 三根手指或面臨截肢

頭條要聞

女大學(xué)生到東北游玩暈倒雪地凍傷 三根手指或面臨截肢

體育要聞

詹姆斯哭了!騎士視頻致敬41歲超巨

娛樂要聞

張譯不再隱瞞!公開回應(yīng)退圈息影真相

財(cái)經(jīng)要聞

崔東樹:中國汽車未來年銷或達(dá)5000萬輛

汽車要聞

車長超5米還帶后輪轉(zhuǎn)向 比亞迪海豹08/海獅08將亮相

態(tài)度原創(chuàng)

手機(jī)
數(shù)碼
本地
時(shí)尚
公開課

手機(jī)要聞

游戲直播神器!iQOO 15 Ultra支持一鍵投屏 開播0門檻

數(shù)碼要聞

這種電熱水袋國家早已禁售:別再用了

本地新聞

云游中國|撥開云霧,巫山每幀都是航拍大片

冬天大衣怎么穿才更好看?選好顏色、找對單品,高級簡約又大氣

公開課

李玫瑾:為什么性格比能力更重要?

無障礙瀏覽 進(jìn)入關(guān)懷版