欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫(kù) 緩存 Redis進(jìn)階篇

柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫(kù) 緩存 Redis進(jìn)階篇

http://yzkb.51969.com/

Redis線程模型

redis是基于內(nèi)存運(yùn)行的高性能k-v數(shù)據(jù)庫(kù),6.x之前是單線程, 對(duì)外提供的鍵值存儲(chǔ)服務(wù)的主要流程 是單線程,也就是網(wǎng)絡(luò) IO 和數(shù)據(jù)讀寫(xiě)是由單個(gè)線程來(lái)完成,6.x之后引入多線程而鍵值對(duì)讀寫(xiě)命 令仍然是單線程處理的,所以 Redis 依然是并發(fā)安全的

Redis為什么快

完全基于內(nèi)存操作,避免了傳統(tǒng)的磁盤(pán)io讀取內(nèi)存這部分的消耗 數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單,基于哈希表結(jié)構(gòu),可以在 O(1)的時(shí)間內(nèi)計(jì)算出 hash 值并且找到對(duì)應(yīng)的 entry位置,entry 里面是一個(gè)一個(gè) key 指針和 value 指針這也是 redis 之所以性能高的原因之一 采用單線程,避免線程切換的事件,不存在競(jìng)爭(zhēng)條件,也不會(huì)出現(xiàn)死鎖而造成性能消耗

Redis多線程

1、Redis6.0 之前為什么一直不使用多線程?

Redis使用單線程的可維護(hù)性高。多線程模型雖然在某些方面表現(xiàn)優(yōu)異,但是它卻引入了程序執(zhí)行順序的不確定性,帶來(lái)了并發(fā)讀寫(xiě)的一系列問(wèn)題,增加了系統(tǒng)復(fù)雜度、同時(shí)可能存在線程切換、甚至加鎖解鎖、死鎖造成的性能損耗。

2、Redis6.0 為什么要引入多線程呢?

因?yàn)镽edis的瓶頸不在內(nèi)存,而是在網(wǎng)絡(luò)I/O模塊帶來(lái)CPU的耗時(shí),所以Redis6.0的多線程是用來(lái)處理網(wǎng)絡(luò)I/O這部分,充分利用CPU資源,減少網(wǎng)絡(luò)I/O阻塞帶來(lái)的性能損耗。

3、Redis6.0 如何開(kāi)啟多線程?

默認(rèn)情況下Redis是關(guān)閉多線程的,可以在conf文件進(jìn)行配置開(kāi)啟 4、多線程模式下,是否存在線程并發(fā)安全問(wèn)題?

如圖,一次redis請(qǐng)求,要建立連接,然后獲取操作的命令,然后執(zhí)行命令,最后將響應(yīng)的結(jié)果寫(xiě)到socket上。

在redis的多線程模式下,獲取、解析命令,以及輸出結(jié)果著兩個(gè)過(guò)程,可以配置成多線程執(zhí)行的,因?yàn)樗吘故俏覀兌ㄎ坏降闹饕臅r(shí)點(diǎn),但是命令的執(zhí)行,也就是內(nèi)存操作,依然是單線程運(yùn)行的。所以,Redis 的多線程部分只是用來(lái)處理網(wǎng)絡(luò)數(shù)據(jù)的讀寫(xiě)和協(xié)議解析,執(zhí)行命令仍然是單線程順序執(zhí)行,也就不存在并發(fā)安全問(wèn)題。

Redis持久化

Redis 是一個(gè)內(nèi)存數(shù)據(jù)庫(kù),數(shù)據(jù)保存在內(nèi)存中,但是我們都知道內(nèi)存的數(shù)據(jù)變化是很快的,也容易發(fā)生丟失。Redis 還為我們提供了持久化的機(jī)制,分別是RDB(Redis DataBase)和 AOF(Append Only File)

RDB方式

RDB 持久化是指在指定的時(shí)間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫(xiě)入磁盤(pán)。也是默認(rèn)的持久化方式,這種方式是就是將內(nèi)存中數(shù)據(jù)以快照的方式寫(xiě)入到二進(jìn)制文件中,默認(rèn)的文件名為 dump.rdb。 在我們安裝了 redis 之后,所有的配置都是在 redis.conf 文件中,里面保存了 RDB 和 AOF 兩種持久化機(jī)制的各種配置。當(dāng)符合一定條件時(shí) Redis 會(huì)自動(dòng)將內(nèi)存中的數(shù)據(jù)進(jìn)行快照并持久化到硬盤(pán)。

觸發(fā)時(shí)機(jī)

(1)save命令觸發(fā):

該命令會(huì)阻塞當(dāng)前Redis服務(wù)器,執(zhí)行save命令期間,Redis不能處理其他命令,直到RDB完成為止,如果數(shù)據(jù)量大的話會(huì)造成長(zhǎng)時(shí)間的阻塞,所以線上環(huán)境一般禁止使用。

(2)bgsave命令觸發(fā):

執(zhí)行該命令時(shí),Redis會(huì)在后臺(tái)異步進(jìn)行快照操作,快照同時(shí)還可以響應(yīng)客戶端請(qǐng)求。具體流程如下:

執(zhí)行bgsave命令時(shí),Redis主進(jìn)程會(huì)fork一個(gè)子進(jìn)程來(lái)完成RDB的過(guò)程,會(huì)先將數(shù)據(jù)寫(xiě)入到一個(gè)臨時(shí)二進(jìn)制文件中,待持久化過(guò)程都結(jié)束了,再用這個(gè)臨時(shí)文件替換上次持久化好的文件(可以理解為Copy On Write機(jī)制)。Redis主進(jìn)程阻塞時(shí)間只有fork階段的那一下。相對(duì)于save,阻塞時(shí)間很短?;旧?Redis 內(nèi)部所有的RDB操作都是采用 bgsave 命令。

fork的作用是復(fù)制一個(gè)與當(dāng)前進(jìn)程一樣的進(jìn)程。新進(jìn)程的所有數(shù)據(jù)(變量、環(huán)境變量、程序計(jì)數(shù)器等)數(shù)值都和原進(jìn)程一致,但是是一個(gè)全新的進(jìn)程,并作為原進(jìn)程的子進(jìn)程。

(3)自動(dòng)觸發(fā):

自動(dòng)觸發(fā)是可以在redis.conf配置文件中修改,默認(rèn)達(dá)到以下三種條件,就會(huì)自動(dòng)觸發(fā)持久化,觸發(fā)后,底層調(diào)用的其實(shí)還有bgsave命令

AOF方式

以日志的形式來(lái)記錄每個(gè)寫(xiě)操作,將 Redis 執(zhí)行過(guò)的所有指令記錄下來(lái)(讀操作不記錄),只許追文件但不可以改寫(xiě)文件,redis 啟動(dòng)之初會(huì)讀取該文件重新構(gòu)建數(shù)據(jù),換言之,redis 重啟的話就根據(jù)日志文件的內(nèi)容將寫(xiě)指令從前到后執(zhí)行一次以完成數(shù)據(jù)的恢復(fù)工作

Redis雙寫(xiě)一致性

延時(shí)雙刪

(1)先淘汰緩存 (2)再寫(xiě)數(shù)據(jù)庫(kù) (3)休眠1秒,再次淘汰緩存

異步隊(duì)列

增加消息隊(duì)列,將redis更新操作交給kafka,由消息隊(duì)列保證可靠性,再搭建一個(gè)消費(fèi)服務(wù),來(lái)異步更新redis

訂閱binlog

通過(guò)訂閱binlog來(lái)更新redis,把搭建的消費(fèi)服務(wù)作為mysql的一個(gè)slave,訂閱binlog,解析出更新內(nèi)容,再更新到redis

Redis事務(wù)

Redis 事務(wù)本質(zhì)是一組命令的集合,一個(gè)事務(wù)中的所有命令都會(huì)被序列化,在事務(wù)執(zhí)行過(guò)程的中,會(huì)按照順序執(zhí)行. 所有的命令在事務(wù)中,并沒(méi)有直接被執(zhí)行. 只有發(fā)起執(zhí)行 exec 命令的時(shí)候才會(huì)執(zhí)行. 事務(wù)在執(zhí)行的過(guò)程中,不會(huì)被其他客戶端發(fā)送來(lái)的命令請(qǐng)求所打斷。但是事務(wù)不保證同一事物中多條命令執(zhí)行的原子性,即使命令有錯(cuò)誤也會(huì)添加到隊(duì)列中,執(zhí)行報(bào)錯(cuò)也不影響其他命令執(zhí)行

、MULTI:

用于標(biāo)記事務(wù)塊的開(kāi)啟。MULTI執(zhí)行之后,Redis會(huì)將后續(xù)的命令逐個(gè)放到一個(gè)緩存隊(duì)列中,當(dāng)EXEC命令被調(diào)用時(shí),所有隊(duì)列中的命令才會(huì)被原子化執(zhí)行。

2、EXEC:

在一個(gè)事務(wù)中執(zhí)行所有先前放入隊(duì)列的命令,然后恢復(fù)正常的連接狀態(tài)。當(dāng)使用WATCH命令時(shí),只有當(dāng)受監(jiān)控的鍵沒(méi)有被修改時(shí),EXEC命令才會(huì)執(zhí)行事務(wù)中的命令。

3、DISCARD:

放棄事務(wù),清除事務(wù)隊(duì)列中的命令,然后恢復(fù)正常的連接狀態(tài)。如果使用了UNWATCH命令,那么DISCARD命令就會(huì)取消當(dāng)前連接監(jiān)控的所有鍵。

主從復(fù)制

主從復(fù)制,是指將一臺(tái) Redis 服務(wù)器的數(shù)據(jù),復(fù)制到其他的 Redis 服務(wù)器。前者稱為主節(jié)點(diǎn)(master),后者稱為從節(jié)點(diǎn)(slave),數(shù)據(jù)的復(fù)制是單向的,只能由主節(jié)點(diǎn)到從節(jié)點(diǎn)

1、Redis為什么需要主從復(fù)制? 使用Redis主從復(fù)制的原因主要是單臺(tái)Redis節(jié)點(diǎn)存在以下的局限性:

(1)Redis雖然讀寫(xiě)的速度都很快,單節(jié)點(diǎn)的Redis能夠支撐QPS大概在5w左右,如果上千萬(wàn)的用戶訪問(wèn),Redis就承載不了,成為了高并發(fā)的瓶頸。

(2)單節(jié)點(diǎn)的Redis不能保證高可用,當(dāng)Redis因?yàn)槟承┰蛞馔忮礄C(jī)時(shí),會(huì)導(dǎo)致緩存不可用

(3)CPU的利用率上,單臺(tái)Redis實(shí)例只能利用單個(gè)核心,這單個(gè)核心在面臨海量數(shù)據(jù)的存取和管理工作時(shí)壓力會(huì)非常大。

2主從復(fù)制的好處: (1)數(shù)據(jù)冗余:主從復(fù)制實(shí)現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。

(2)故障恢復(fù):如果master宕掉了,使用哨兵模式,可以提升一個(gè) slave 作為新的 master,進(jìn)而實(shí)現(xiàn)故障轉(zhuǎn)移,實(shí)現(xiàn)高可用

(3)負(fù)載均衡:可以輕易地實(shí)現(xiàn)橫向擴(kuò)展,實(shí)現(xiàn)讀寫(xiě)分離,一個(gè) master 用于寫(xiě),多個(gè) slave 用于分?jǐn)傋x的壓力,從而實(shí)現(xiàn)高并發(fā);

3、主從復(fù)制的缺點(diǎn): 由于所有的寫(xiě)操作都是先在Master上操作,然后同步更新到Slave上,所以從Master同步到Slave服務(wù)器有一定的延遲,當(dāng)系統(tǒng)很繁忙的時(shí)候,延遲問(wèn)題會(huì)更加嚴(yán)重,Slave機(jī)器數(shù)量的增加也會(huì)使這個(gè)問(wèn)題更加嚴(yán)重

哨兵機(jī)制

哨兵模式是一種特殊的模式,首先 Redis 提供了哨兵的命令,哨兵是一個(gè)獨(dú)立的進(jìn)程,作為進(jìn)程,它會(huì)獨(dú)立運(yùn)行。其原理是哨兵通過(guò)發(fā)送命令,等待 Redis 服務(wù)器響應(yīng),從而監(jiān)控運(yùn)行的多個(gè) Redis 實(shí)例。

key過(guò)期策略

惰性刪除:惰性刪除是指,某個(gè)鍵值過(guò)期后,此鍵值不會(huì)馬上被刪除,而是等 到下次被使用的時(shí)候,才會(huì)被檢查到過(guò)期,此時(shí)才能得到刪除。所以惰性刪除的 缺點(diǎn)很明顯:浪費(fèi)內(nèi)存,還需要維護(hù)一個(gè)字典記錄 key 是否過(guò)期。 定期刪除:每隔一定的時(shí)間,會(huì)掃描一定數(shù)量的數(shù)據(jù)庫(kù)字典中一定數(shù)量的 key, 并清除其中已過(guò)期的 key。通過(guò)調(diào)整定時(shí)掃描的時(shí)間間隔和每次掃描的限定耗 時(shí),可以在不同情況下使得 CPU 和內(nèi)存資源達(dá)到最優(yōu)的平衡效果。

Redis 中同時(shí)使用了惰性過(guò)期和定期過(guò)期兩種過(guò)期策略

緩存穿透

key對(duì)應(yīng)的數(shù)據(jù)不存在,例如id=-1 DB和Redis都沒(méi)有數(shù)據(jù)

解決:

參數(shù)校驗(yàn) 對(duì)空值進(jìn)行緩存,返回value=null 布隆過(guò)濾器,使用bitmap先將可以訪問(wèn)到的資源通過(guò)映射關(guān)系放入過(guò)濾器,當(dāng)請(qǐng)求到達(dá)時(shí),先走過(guò)濾器

緩存擊穿

某個(gè)key再數(shù)據(jù)庫(kù)存在,但在redis中key過(guò)期

解決:

提前對(duì)key做過(guò)期時(shí)間設(shè)置 監(jiān)控?cái)?shù)據(jù) 使用鎖,只有一個(gè)請(qǐng)求獲得互斥鎖,然后db中將數(shù)據(jù)查詢并返回到redis中,之后所有請(qǐng)求從redis中查詢

緩存雪崩

redis中大量key集體過(guò)期

解決:

將失效時(shí)間分散,生成隨機(jī)數(shù)key 多級(jí)架構(gòu),nginx緩存+redis緩存 記錄緩存標(biāo)記,如果過(guò)期會(huì)通知另一個(gè)線程更新 查不到加排他鎖

緩存預(yù)熱

1、什么是緩存預(yù)熱:

緩存預(yù)熱是指系統(tǒng)上線后,提前將相關(guān)的緩存數(shù)據(jù)加載到緩存系統(tǒng)。避免在用戶請(qǐng)求的時(shí)候,先查詢數(shù)據(jù)庫(kù),然后再將數(shù)據(jù)緩存的問(wèn)題,用戶直接查詢事先被預(yù)熱的緩存數(shù)據(jù)。

如果不進(jìn)行預(yù)熱,那么Redis初始狀態(tài)數(shù)據(jù)為空,系統(tǒng)上線初期,對(duì)于高并發(fā)的流量,都會(huì)訪問(wèn)到數(shù)據(jù)庫(kù)中, 對(duì)數(shù)據(jù)庫(kù)造成流量的壓力。

2、緩存預(yù)熱解決方案:

(1)數(shù)據(jù)量不大的時(shí)候,工程啟動(dòng)的時(shí)候進(jìn)行加載緩存動(dòng)作;

(2)數(shù)據(jù)量大的時(shí)候,設(shè)置一個(gè)定時(shí)任務(wù)腳本,進(jìn)行緩存的刷新;

(3)數(shù)據(jù)量太大的時(shí)候,優(yōu)先保證熱點(diǎn)數(shù)據(jù)進(jìn)行提前加載到緩存

緩存降級(jí)

緩存降級(jí)是指緩存失效或緩存服務(wù)器掛掉的情況下,不去訪問(wèn)數(shù)據(jù)庫(kù),直接返回默認(rèn)數(shù)據(jù)或訪問(wèn)服務(wù)的內(nèi)存數(shù)據(jù)。降級(jí)一般是有損的操作,所以盡量減少降級(jí)對(duì)于業(yè)務(wù)的影響程度。

在項(xiàng)目實(shí)戰(zhàn)中通常會(huì)將部分熱點(diǎn)數(shù)據(jù)緩存到服務(wù)的內(nèi)存中,這樣一旦緩存出現(xiàn)異常,可以直接使用服務(wù)的內(nèi)存數(shù)據(jù),從而避免數(shù)據(jù)庫(kù)遭受巨大壓力。

柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫(kù) 緩存 Redis進(jìn)階篇

http://yzkb.51969.com/

精彩鏈接

評(píng)論可見(jiàn),查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/19021927.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問(wèn)

文章目錄