<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          進(jìn)程緩存和緩存服務(wù),如何抉擇?

          共 3094字,需瀏覽 7分鐘

           ·

          2021-08-18 21:30

          上一篇:深夜看了張一鳴的微博,讓我越想越后怕

          作者:翁智華
          出處:https://www.cnblogs.com/wzh2010/

          概述

          我們所說的緩存分為進(jìn)程內(nèi)部緩存(系統(tǒng)內(nèi)部緩存)和 緩存服務(wù)(如redis/memcache)。

          計(jì)算機(jī)服務(wù)從原來的單體結(jié)構(gòu),到多實(shí)例,到現(xiàn)在流行的微服務(wù),緩存服務(wù)變得原來越流行了。

          進(jìn)程緩存

          先說說進(jìn)程緩存,它將數(shù)據(jù)存儲(chǔ)在站點(diǎn)、服務(wù)的進(jìn)程內(nèi)。在Web的發(fā)展歷史上,這樣的方式備受歡迎。比如早期常用的.Net的 System.Web.Caching.

          這種實(shí)現(xiàn)載體很簡單,比如一個(gè)帶鎖的HasTable,或者一個(gè)List對(duì)象。使用簡單便捷,能存儲(chǔ)數(shù)據(jù)、html頁面片段、文件,甚至任何對(duì)象。

          在單體結(jié)構(gòu)的Web模式下,進(jìn)程內(nèi)緩存被開發(fā)到極致,大概流程如下圖:

          與原先沒有緩存相比,進(jìn)程內(nèi)緩存的好處是,數(shù)據(jù)讀取不再直接訪問數(shù)據(jù)庫,先判斷緩存中是否存在,如果存在,則直接讀取,不存在則再去數(shù)據(jù)庫中取,同時(shí)寫入緩存。

          這樣避免了每次的請(qǐng)求都走數(shù)據(jù)庫,減少網(wǎng)絡(luò)開銷和數(shù)據(jù)請(qǐng)求次數(shù),提高了數(shù)據(jù)獲取效率,基本等同在內(nèi)存中執(zhí)行。

          緩存的目的是為了冷熱數(shù)據(jù)的隔離,對(duì)于頻繁被修改的數(shù)據(jù),緩存的意義不是很大,比如微信用戶的實(shí)時(shí)步數(shù)。比較有價(jià)值的是那些不被頻繁修改且數(shù)據(jù)量較大的內(nèi)容,比如系統(tǒng)字典、配置數(shù)據(jù)。

          判斷是否需要?jiǎng)?chuàng)建緩存需要一定的依據(jù),以下是我的團(tuán)隊(duì)的策略,不一定適用,可以參考:

          緩存的必要性:數(shù)據(jù)的變更是否過于頻繁,過于頻繁則可能導(dǎo)致緩存不斷重建,反而降低效率。評(píng)估方式:緩存的過期時(shí)間內(nèi)沒被主動(dòng)更新的量值應(yīng)該超過60%。

          假設(shè)緩存時(shí)間:3600s

          假設(shè)同一種類型緩存數(shù)據(jù)基數(shù):6000個(gè)

          6000 * 60% = 3600 的數(shù)據(jù)在一個(gè)小時(shí)內(nèi)事務(wù)未更新,這樣的緩存價(jià)值更大。另外,Redis 系列面試題和答案全部整理好了,微信搜索互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)發(fā)送:2T,可以在線閱讀。

          進(jìn)程緩存的問題

          在互聯(lián)網(wǎng)大潮下,隨著用戶量的激增,原來單體結(jié)構(gòu)逐漸的向Web服務(wù)集群發(fā)展,在多實(shí)例目標(biāo)下,進(jìn)程緩存的弊端越來越明顯。

          比如緩存無法統(tǒng)一的問題。

          如果站點(diǎn)和服務(wù)中的多個(gè)節(jié)點(diǎn)訪問統(tǒng)一的緩存服務(wù)(比如redis 或者 memerche),數(shù)據(jù)統(tǒng)一存儲(chǔ),數(shù)據(jù)的一致性就比較容易保障。

          但如果是進(jìn)程緩存,數(shù)據(jù)存儲(chǔ)在站點(diǎn)和服務(wù)的多個(gè)節(jié)點(diǎn)內(nèi),每個(gè)節(jié)點(diǎn)一個(gè)緩存,存儲(chǔ)多份,一致性就比較難保障。

          如上圖,但是有個(gè)問題,Cache1、Cache1、Cache3一致性難以保障,如果想保持緩存的一致性時(shí),該怎么辦呢?

          一般有以下幾種方法:

          1、單一服務(wù)節(jié)點(diǎn)通知其他服務(wù)節(jié)點(diǎn),如果我們只是Web Service1 在執(zhí)行業(yè)務(wù)操作的時(shí)候修改數(shù)據(jù)庫,更新緩存,同時(shí)通知其他Web Service

          服務(wù),其他Web Service 接收到信息的時(shí)候,進(jìn)行緩存更新。

          2、 啟動(dòng)MQ通知其他節(jié)點(diǎn):如下圖,可以通過MQ通知其他節(jié)點(diǎn)。寫請(qǐng)求發(fā)生在server1,在修改完自己緩存數(shù)據(jù)與數(shù)據(jù)庫中的數(shù)據(jù)之后,給MQ生產(chǎn)數(shù)據(jù)變化通知,

          server2和server1訂閱MQ消息,當(dāng)消費(fèi)到MQ信息的時(shí)候,也修改緩存數(shù)據(jù)。另外,MQ 系列面試題和答案全部整理好了,微信搜索互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)發(fā)送:2T,可以在線閱讀。

          3、有一種簡單的方式,也可以解耦與Web Server的關(guān)系,就是直接放棄了“實(shí)時(shí)一致性”,啟動(dòng)一個(gè)獨(dú)立的進(jìn)程服務(wù),定時(shí)從后端拉取最新的數(shù)據(jù),更新內(nèi)存緩存。

          上述的幾種方法為了保持?jǐn)?shù)據(jù)的一致性,增加了一定的開銷,一方面緩存數(shù)據(jù)同步過程中會(huì)有出錯(cuò)的風(fēng)險(xiǎn);

          另一方面實(shí)際上違背了緩存的原則:冷熱數(shù)據(jù)隔絕,有效的利用冷數(shù)據(jù),減輕數(shù)據(jù)庫壓力,提升效率。如果緩存被頻繁修改或者同步,那緩存的價(jià)值就不大了。

          補(bǔ)充:1、2 兩種方式,實(shí)例越多,緩存冗余越多,各緩存節(jié)點(diǎn)數(shù)據(jù)同步的原子性越難保證,一致性也就越難保證。

          第3種方式:采用定時(shí)拉取本身已經(jīng)放棄了數(shù)據(jù)的實(shí)時(shí)一致性。

          所以我們?cè)谝韵逻@幾種情況下拋棄進(jìn)程緩存,選用緩存服務(wù):

          1、Web集群下,包含多個(gè)實(shí)例,并且不允許業(yè)務(wù)數(shù)據(jù)的不一致性(我相信大部分業(yè)務(wù)不允許)

          2、進(jìn)程內(nèi)緩存數(shù)據(jù)量較大,緩存內(nèi)存空間不足,影響Web性能,可以考慮走緩存服務(wù)(緩存服務(wù)如redis,一般獨(dú)立服務(wù)甚至集群配置,支持超大量級(jí))。

          3、評(píng)估value大小、緩存內(nèi)存空間、峰值QPS、過期時(shí)間、緩存命中率、讀寫更新策略、key值分布路由策略、過期策略以及數(shù)據(jù)一致性方案,根據(jù)實(shí)際需要判斷是否走緩存服務(wù)。

          緩存服務(wù)

          在互聯(lián)網(wǎng)分層架構(gòu)中,最常用的kv結(jié)構(gòu)的緩存是redis。他有如下特點(diǎn):

          1、它支持復(fù)雜數(shù)據(jù)結(jié)構(gòu)

          value是字符串、哈希,列表,集合,有序集合這類復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。支持各種場景,如客戶訂單信息列表,用戶消息,帖子評(píng)論等。

          2、支持持久化

          首先,redis的所有數(shù)據(jù)都是保存在內(nèi)存中,然后不定期的通過異步方式保存到磁盤上(這稱為“半持久化模式”);

          也可以把每一次數(shù)據(jù)變化都寫入到一個(gè)append only file(aof)里面(這稱為“全持久化模式”,效率會(huì)低一點(diǎn))。

          但是我們盡量不要把redis當(dāng)作數(shù)據(jù)庫用,如果真的需要持久化數(shù)據(jù),建議可以走M(jìn)ySQL:

          2.1、redis的定期快照不能保證數(shù)據(jù)不丟失
          2.2、redis的AOF會(huì)降低效率,并且不能支持太大的數(shù)據(jù)量

          另外,Redis/ MySQL 系列面試題和答案全部整理好了,微信搜索互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)發(fā)送:2T,可以在線閱讀。

          3、具備高可用特性

          redis天然支持集群功能,可以實(shí)現(xiàn)主動(dòng)復(fù)制,讀寫分離。官方也提供了sentinel集群管理工具,能夠?qū)崿F(xiàn)主從服務(wù)監(jiān)控,故障自動(dòng)轉(zhuǎn)移。

          4、存儲(chǔ)的內(nèi)容比較大

          String類型:一個(gè)String類型的value最大可以存儲(chǔ)512M,List、Set、Hash類型:list的元素個(gè)數(shù)最多為2^32-1個(gè),也就是4294967295個(gè)。

          5、 支持事務(wù)

          操作都是原子性,對(duì)數(shù)據(jù)的更改要么全部執(zhí)行,要么全部不執(zhí)行。避免業(yè)務(wù)數(shù)據(jù)的不一致性。

          緩存使用注意

          1、Web服務(wù) 單體模式轉(zhuǎn)為多實(shí)例之后,我們將進(jìn)程緩存升級(jí)為緩存服務(wù)(redis),清清理了所有的緩存使用,都改成了對(duì)接redis。但是有一些地方漏掉,因?yàn)槲覀冇?個(gè)實(shí)例,所以漏掉的那幾個(gè)地方,一旦修改某個(gè)數(shù)據(jù)之后,一會(huì)兒是新值,一會(huì)兒舊值,很神奇。

          2、謹(jǐn)防緩存擊穿、雪崩的產(chǎn)生,這個(gè)我們有慘痛的教訓(xùn),后續(xù)來一篇專門分析下。

          感謝您的閱讀,也歡迎您發(fā)表關(guān)于這篇文章的任何建議,關(guān)注我,技術(shù)不迷茫!小編到你上高速。
              · END ·
          最后,關(guān)注公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全。


          正文結(jié)束


          推薦閱讀 ↓↓↓

          1.不認(rèn)命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵(lì)志故事

          2.如何才能成為優(yōu)秀的架構(gòu)師?

          3.從零開始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧

          4.程序員一般可以從什么平臺(tái)接私活?

          5.37歲程序員被裁,120天沒找到工作,無奈去小公司,結(jié)果懵了...

          6.IntelliJ IDEA 2019.3 首個(gè)最新訪問版本發(fā)布,新特性搶先看

          7.這封“領(lǐng)導(dǎo)痛批95后下屬”的郵件,句句扎心!

          8.15張圖看懂瞎忙和高效的區(qū)別!

          一個(gè)人學(xué)習(xí)、工作很迷茫?


          點(diǎn)擊「閱讀原文」加入我們的小圈子!

          瀏覽 31
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人人操,人人摸,人人透, | 无码一区二区三区在线观看 | 日日夜夜费免费精品 | 黑人久久久久 | 日韩精品视频中文字幕无码 |