摘要:分布式緩存應(yīng)用和緩存分離,緩存多帶帶作為一個(gè)系統(tǒng)多帶帶部署,多個(gè)應(yīng)用可以共享的訪問緩存。通過靜態(tài)變量一次獲取所有的數(shù)據(jù)緩存起來避免頻繁的讀取。類似的分布式緩存實(shí)現(xiàn)方案還有的集群方案,其實(shí)現(xiàn)思想和的實(shí)現(xiàn)思想大相徑庭。
0x01 前言
提到緩存,那么緩存是什么,為什么需要緩存?
如果知道一點(diǎn)點(diǎn)計(jì)算機(jī)方面的知識(shí)就會(huì)知道,計(jì)算機(jī)的構(gòu)造也是由多級(jí)緩存->硬盤一起來構(gòu)造計(jì)算機(jī)的數(shù)據(jù)存儲(chǔ)。當(dāng)然這里不是來撥開計(jì)算機(jī)的神秘面紗來看透緩存的本質(zhì)設(shè)計(jì)的,此篇想來講講我們?cè)谲浖?gòu)造的過程中為了讓系統(tǒng)能提高數(shù)據(jù)的讀寫效率,同時(shí)減少網(wǎng)絡(luò)/IO延遲而進(jìn)行的緩存設(shè)計(jì)。
0x02 緩存特征命中率--緩存中取到數(shù)據(jù)的請(qǐng)求/總的數(shù)據(jù)請(qǐng)求次數(shù)
緩存空間--既然是緩存肯定緩存的數(shù)據(jù)存儲(chǔ)量不夠?qū)嶋H的存儲(chǔ)系統(tǒng)(文件系統(tǒng)、數(shù)據(jù)庫等)那么大,如何定義緩存的存儲(chǔ)上限。
淘汰策略--既然緩存有命中率、最大數(shù)據(jù)存儲(chǔ)空間,那就不可避免的引入了當(dāng)存儲(chǔ)空間接近最大存儲(chǔ)空間的時(shí)候如何將一些緩存數(shù)據(jù)從緩存中清除出去,采用什么樣的策略。
FIFO 先進(jìn)來的優(yōu)先淘汰。應(yīng)用場(chǎng)景:時(shí)效性要求比較高的場(chǎng)景,優(yōu)先保障最新的數(shù)據(jù)能被緩存命中。
LFU(least frequently used) 最近最少頻次使用的數(shù)據(jù)被優(yōu)先淘汰。應(yīng)用場(chǎng)景:在保障高頻數(shù)據(jù)可用的場(chǎng)景可以選用這類策略。
LRU(least recently used) 最近最少使用的數(shù)據(jù)優(yōu)先淘汰。應(yīng)用場(chǎng)景:熱點(diǎn)數(shù)據(jù)使用場(chǎng)景
0x03 緩存分類 存儲(chǔ)介質(zhì)分類從硬件角度進(jìn)行區(qū)分:內(nèi)存、硬盤
從技術(shù)實(shí)現(xiàn)上進(jìn)行區(qū)分:內(nèi)存、硬盤文件、數(shù)據(jù)庫
緩存實(shí)現(xiàn)分類緩存從大類上可以分為本地緩存和分布式緩存。
本地緩存:本地緩存和應(yīng)用在同一個(gè)進(jìn)程里面,數(shù)據(jù)請(qǐng)求沒有額外的網(wǎng)絡(luò)開銷,能快速得到響應(yīng),對(duì)于單應(yīng)用沒有集群支持的系統(tǒng)或者擁有集群的情況下但是集群中各個(gè)節(jié)點(diǎn)的緩存無需互通的場(chǎng)景下比較合適。缺點(diǎn):應(yīng)用進(jìn)程和本地緩存是強(qiáng)綁定在一起的,對(duì)于多應(yīng)用的情況下,每個(gè)應(yīng)用程序都要維護(hù)一套多帶帶的緩存,無法共享各自的緩存對(duì)內(nèi)存資源是一種浪費(fèi)。
分布式緩存:應(yīng)用和緩存分離,緩存多帶帶作為一個(gè)系統(tǒng)多帶帶部署,多個(gè)應(yīng)用可以共享的訪問緩存。
本地緩存相信大家在進(jìn)行編程的過程中會(huì)經(jīng)常使用到。非常簡(jiǎn)單的場(chǎng)景下會(huì)直接通過Map結(jié)構(gòu)在局部對(duì)象中直接構(gòu)建緩存存儲(chǔ)結(jié)構(gòu),局部變量實(shí)現(xiàn)緩存。
private ConcurrentHashMaplocalCache = new ConcurrentHashMap ();
這種局部緩存只能在類自身的作用域中能訪問到,而且這種簡(jiǎn)單的緩存數(shù)據(jù)結(jié)構(gòu)無需關(guān)注存取、淘汰緩存等策略。
應(yīng)用場(chǎng)景:在一次請(qǐng)求的過程中緩存此次請(qǐng)求中的重復(fù)數(shù)據(jù)請(qǐng)求,避免過多的無用請(qǐng)求、序列化反序列話對(duì)CPU造成的壓力,請(qǐng)求結(jié)束后清空緩存。
靜態(tài)變量實(shí)現(xiàn)緩存,基本實(shí)現(xiàn)思路和上面的局部緩存一樣的原理,主要是將其可見度擴(kuò)大到了本應(yīng)用程序,在本引用程序都是可見的。通過靜態(tài)變量一次獲取所有的數(shù)據(jù)緩存起來避免頻繁的I/O讀取。
應(yīng)用場(chǎng)景:一次緩存所有的數(shù)據(jù),如應(yīng)用配置信息、一些數(shù)據(jù)量不大但是應(yīng)用需要頻繁使用到的一些數(shù)據(jù),通過開關(guān)推送的方式來refresh內(nèi)存。
這里通過redis作為緩存實(shí)現(xiàn)來探討下分布式緩存。
根據(jù)應(yīng)用對(duì)緩存的數(shù)據(jù)存儲(chǔ)量的需求,可以通過redis單機(jī)或者集群的方式來實(shí)現(xiàn)緩存。下面我們主要是來聊聊通過redis集群的方式來實(shí)現(xiàn)分布式緩存:
統(tǒng)一接入層暴露統(tǒng)一的操作緩存的API,客戶端通過API像和使用單機(jī)緩存一樣透明的使用分布式緩存集群。
類似的分布式緩存實(shí)現(xiàn)方案還有memcache的集群方案,其實(shí)現(xiàn)思想和redis的實(shí)現(xiàn)思想大相徑庭。memcache主要是通過客戶端的的一致性Hash算法來實(shí)現(xiàn)集群實(shí)例選址操作。
0x04 Redis簡(jiǎn)介 持久化方案Redis是一個(gè)內(nèi)存存儲(chǔ)系統(tǒng),通常情況下都是被使用作為緩存系統(tǒng),但是它本身是支持對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行持久化的操作的,其支持兩種持久化的方式:
snapshot--save/bgsave兩個(gè)命令可以對(duì)其進(jìn)行持久化操作。save是主進(jìn)程進(jìn)行的操作會(huì)將所有的對(duì)外服務(wù)操作全部block掉;bgsave采用子線程寫時(shí)復(fù)制技術(shù)進(jìn)行持久化,主進(jìn)程繼續(xù)對(duì)外提供服務(wù),但是寫時(shí)復(fù)制技術(shù)在寫入請(qǐng)求達(dá)到一個(gè)量級(jí)的過程中可能會(huì)出現(xiàn)內(nèi)存瞬間翻倍的情況,所以在一般情況下Redis的內(nèi)存使用量不能操作物理內(nèi)存的二分之一,不然會(huì)存在潛在的數(shù)據(jù)丟失的風(fēng)險(xiǎn)。同時(shí)在進(jìn)行持久化得過程中也會(huì)有大量的I/O操作會(huì)對(duì)系統(tǒng)造成負(fù)載壓力大。
aof--在文件末尾追加對(duì)內(nèi)存的修改操作。這也會(huì)存在個(gè)嚴(yán)重的問題:當(dāng)count++循環(huán)100次的時(shí)候是不是在aof文件末尾追加了100條同樣的+1的操作,其實(shí)可以用一個(gè)語句count+=100來進(jìn)行替換。所以像這種情況下aof文件中的語句會(huì)出現(xiàn)逐漸龐大的情況,需要定期去rewrite aof文件。在rewrite aof文件的過程中,對(duì)內(nèi)存的修改語句沒法寫入到aof文件,所以Redis會(huì)將rewrite期間對(duì)內(nèi)存修改的命令寫入緩存,最后統(tǒng)一寫入aof文件中。
Redis的持久化方案使用了buffer I/O,即會(huì)使用物理內(nèi)存的page cache。計(jì)算機(jī)在發(fā)現(xiàn)page cache不足的時(shí)候會(huì)對(duì)cache和硬盤進(jìn)行swap的操作,在持久化的同時(shí)可能會(huì)導(dǎo)致系統(tǒng)的不穩(wěn)定或者崩潰的現(xiàn)象,所以Redis需要實(shí)時(shí)針對(duì)內(nèi)存的使用量進(jìn)行監(jiān)控告警。大多數(shù)的數(shù)據(jù)庫存儲(chǔ)系統(tǒng)會(huì)使用Direct I/O來繞過page cache并自行維護(hù)一個(gè)數(shù)據(jù)的cache。
主備同步方式Redis主從同步方式中包含全量/增量數(shù)據(jù)同步。第3步ACK之前都是同步snapshot文件,通過snapshot文件快速構(gòu)建一個(gè)和Master一直的內(nèi)存數(shù)據(jù),后面增量同步的過程中按照追加到aof文件中的內(nèi)存修改命令進(jìn)行同步修改Slave中的內(nèi)存數(shù)據(jù)。
Key淘汰策略Redis中會(huì)多帶帶針對(duì)帶有過期時(shí)間的Key進(jìn)行統(tǒng)一存儲(chǔ),針對(duì)這些帶有過期時(shí)間的Key有三種淘汰策略。
被動(dòng)刪除。對(duì)Key進(jìn)行訪問時(shí),檢查超時(shí)時(shí)間,如果超時(shí)則刪除K-V。
主動(dòng)刪除。定期調(diào)用清理過期Key的方法。
a) 隨機(jī)抽取100個(gè)Key
b) 刪除過期Key
c) 若刪除過期key數(shù)量>25則重復(fù)a)
整個(gè)主動(dòng)刪除是有時(shí)間限制限制的,否則時(shí)間太長(zhǎng)會(huì)影響緩存對(duì)外服務(wù)的吞吐量。
內(nèi)存空間達(dá)到Maxmemory時(shí)進(jìn)行清理。阻塞服務(wù)對(duì)Key進(jìn)行過期刪除操作,直到低于Maxmemory值,否則服務(wù)一直阻塞。
0x05 后記spring提供了注解緩存的實(shí)現(xiàn)方案,目前還沒有實(shí)踐過,后面對(duì)spring進(jìn)行深入學(xué)習(xí)其注解緩存實(shí)現(xiàn)方案后更新。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/61876.html
摘要:瀏覽器讀取資源的流程瀏覽器在加載資源時(shí),根據(jù)請(qǐng)求頭的和判斷是否命中強(qiáng)緩存,是則直接從緩存讀取資源,不會(huì)發(fā)請(qǐng)求到服務(wù)器。實(shí)際上是會(huì)被緩存的,只不過每次在向客戶端瀏覽器提供響應(yīng)數(shù)據(jù)時(shí),緩存都要向服務(wù)器評(píng)估緩存響應(yīng)的有效性。 瀏覽器讀取資源的流程 瀏覽器在加載資源時(shí),根據(jù)請(qǐng)求頭的expires和cache-control判斷是否命中強(qiáng)緩存,是則直接從緩存讀取資源,不會(huì)發(fā)請(qǐng)求到服務(wù)器。 如果...
摘要:瀏覽器讀取資源的流程瀏覽器在加載資源時(shí),根據(jù)請(qǐng)求頭的和判斷是否命中強(qiáng)緩存,是則直接從緩存讀取資源,不會(huì)發(fā)請(qǐng)求到服務(wù)器。實(shí)際上是會(huì)被緩存的,只不過每次在向客戶端瀏覽器提供響應(yīng)數(shù)據(jù)時(shí),緩存都要向服務(wù)器評(píng)估緩存響應(yīng)的有效性。 瀏覽器讀取資源的流程 瀏覽器在加載資源時(shí),根據(jù)請(qǐng)求頭的expires和cache-control判斷是否命中強(qiáng)緩存,是則直接從緩存讀取資源,不會(huì)發(fā)請(qǐng)求到服務(wù)器。 如果...
摘要:對(duì)于前端性能優(yōu)化我們不得不了解的幾個(gè)知識(shí)點(diǎn)信息今天我就來談?wù)勎覍?duì)的理解是什么全稱是即內(nèi)容分發(fā)網(wǎng)絡(luò)。將網(wǎng)站內(nèi)容發(fā)布到接近用戶的服務(wù)器上。用戶訪問網(wǎng)站時(shí),用戶訪問就近服務(wù)器,然后加載這些資源。 對(duì)于前端性能優(yōu)化我們不得不了解的幾個(gè)知識(shí)點(diǎn):CDN、HTTP header信息 今天我就來談?wù)勎覍?duì)cdn的理解 1、CDN是什么:CDN全稱是Content Delivery Network,即內(nèi)容...
摘要:對(duì)于前端性能優(yōu)化我們不得不了解的幾個(gè)知識(shí)點(diǎn)信息今天我就來談?wù)勎覍?duì)的理解是什么全稱是即內(nèi)容分發(fā)網(wǎng)絡(luò)。將網(wǎng)站內(nèi)容發(fā)布到接近用戶的服務(wù)器上。用戶訪問網(wǎng)站時(shí),用戶訪問就近服務(wù)器,然后加載這些資源。 對(duì)于前端性能優(yōu)化我們不得不了解的幾個(gè)知識(shí)點(diǎn):CDN、HTTP header信息 今天我就來談?wù)勎覍?duì)cdn的理解 1、CDN是什么:CDN全稱是Content Delivery Network,即內(nèi)容...
閱讀 1725·2021-09-22 10:02
閱讀 1946·2021-09-02 15:40
閱讀 2848·2019-08-30 15:55
閱讀 2258·2019-08-30 15:44
閱讀 3603·2019-08-30 13:18
閱讀 3234·2019-08-30 11:00
閱讀 1959·2019-08-29 16:57
閱讀 573·2019-08-29 16:41