Redis的主從同步與對(duì)象模型詳解
淘汰策略
當(dāng)內(nèi)存達(dá)到max_memory(在redis.conf中進(jìn)行配置,主機(jī)內(nèi)存96G,則設(shè)置為48G,因?yàn)槌志没枰猣ork一份當(dāng)前redis的快照)
首先明確淘汰策略并不會(huì)檢測(cè)value內(nèi)部的key,也即list的element,hash的field這些。
時(shí)限key中淘汰
| 淘汰策略 | 意義 |
|---|---|
| volatile-lru | 最長(zhǎng)時(shí)間沒(méi)有使用 |
| volatile-lfu | 最少次數(shù)使用 或 隨機(jī)采樣 |
| volatile-ttl | 最近要過(guò)期 |
| volatile-random | 隨機(jī) |
所有key中淘汰
| 淘汰策略 | 意義 |
|---|---|
| allkeys-lru | 最長(zhǎng)時(shí)間沒(méi)有使用 |
| allkeys-lfu | 最少次數(shù)使用 或 隨機(jī)采樣 |
| volatile-random | 隨機(jī) |
禁止淘汰(默認(rèn))
指令返回錯(cuò)誤
持久化
redis是一個(gè)內(nèi)存數(shù)據(jù)庫(kù),所有的數(shù)據(jù)儲(chǔ)存在內(nèi)存中,雖然訪問(wèn)速度快但是易丟失。默認(rèn)開(kāi)啟rdb持久化
fopen fwrite setbuf fflush fsync fclose
fwrite只是把buffer中的數(shù)據(jù)寫(xiě)到用戶態(tài)緩沖區(qū)中,內(nèi)核并不知情
fflush把fd對(duì)應(yīng)的用戶態(tài)緩沖區(qū)內(nèi)部數(shù)據(jù)移動(dòng)到page cache(高速緩存)
不調(diào)用fsync,數(shù)據(jù)也會(huì)到文件中,只不過(guò)不知道何時(shí),通過(guò)LRU把page cache中的數(shù)據(jù)淘汰到file中。

機(jī)器斷電,丟失1,2的數(shù)據(jù)
進(jìn)程關(guān)閉,丟失1的數(shù)據(jù)
fork寫(xiě)時(shí)復(fù)制:子進(jìn)程和父進(jìn)程映射同一塊物理內(nèi)存。
父進(jìn)程復(fù)制一塊虛擬內(nèi)存頁(yè)表給子進(jìn)程,同時(shí)二者設(shè)置為可讀,二者虛擬內(nèi)存映射到同一塊物理頁(yè)。只有其中的任意一個(gè)進(jìn)程試圖修改一個(gè)共享的只讀物理頁(yè)面時(shí)(例如,修改一個(gè)全局變量或在堆上分配新內(nèi)存),才會(huì)寫(xiě)保護(hù)中斷觸發(fā),物理頁(yè)復(fù)制,誰(shuí)修改,誰(shuí)指向新的,把只讀狀態(tài)修改為可讀可寫(xiě)狀態(tài)。

利用fork進(jìn)程 的功能給父進(jìn)程的內(nèi)存打了快照。
在維持了redis對(duì)外服務(wù)能力的基礎(chǔ)上,對(duì)redis數(shù)據(jù)做了一次保存。
aof
通過(guò)追加寫(xiě)日志到buffer的方式進(jìn)行持久化。順序磁盤(pán)io≈內(nèi)存隨機(jī)io
但是會(huì)有數(shù)據(jù)冗余的情況,多條set只有最后一條set是有效的。
aof的策略:
①always 一旦有對(duì)redis的修改就要落盤(pán)
②every_sec (bio_fsync_aof)每秒鐘進(jìn)行一次落盤(pán)
③no buffer的數(shù)據(jù)到page cache(見(jiàn)上)
aof-rewrite
fork一份子進(jìn)程,只保存redis內(nèi)存當(dāng)前的狀態(tài),根據(jù)內(nèi)存數(shù)據(jù)狀態(tài)生成aof文件,避免同一個(gè)key的歷史冗余。在重寫(xiě)aof期間,對(duì)redis所有的寫(xiě)操作記錄到重寫(xiě)緩沖區(qū),當(dāng)重寫(xiě)結(jié)束后,附加到aof文件末尾。
rdb
通過(guò)fork子進(jìn)程進(jìn)行持久化,基于內(nèi)存中的數(shù)據(jù)進(jìn)行持久化。但是缺點(diǎn)是rdb不能看到兩次rdb之間數(shù)據(jù)的修改。
rdb-aof混合持久化
在rdb持久化期間,對(duì)redis的寫(xiě)操作記錄到重寫(xiě)緩沖區(qū),rdb持久化建立后,附加到aof文件末尾
redis持久化相關(guān)配置
在redis.conf中完成配置
######### aof ######### # redis.cnf appendonly no appendfilename "appendonly.aof" # aof read write invert # appendfsync always appendfsync everysec # appendfsync no # auto-aof-rewrite-percentage 為 0 則關(guān)閉 aof 復(fù)寫(xiě) auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb # yes 如果 aof 數(shù)據(jù)不完整,盡量讀取最多的格式正確的數(shù)據(jù); # no 如果 aof 數(shù)據(jù)不完整 報(bào)錯(cuò),可以通過(guò) redis-check-aof 來(lái)修復(fù) aof 文件; aof-load-truncated yes # 開(kāi)啟混合持久化 aof-use-rdb-preamble yes ######### rdb ######### # save "" # save 3600 1 # save 300 100 # save 60 10000
aof
# 開(kāi)啟 aof appendonly yes # 關(guān)閉 aof復(fù)寫(xiě) auto-aof-rewrite-percentage 0 # 關(guān)閉 混合持久化 aof-use-rdb-preamble no # 關(guān)閉 rdb save "" # 1. 每條命令刷盤(pán) redis 事務(wù)才具備持久性 # appendfsync always # 2. 每秒刷盤(pán) appendfsync everysec # 3. 交由系統(tǒng)刷盤(pán) # appendfsync no
aof-fwrite
# 開(kāi)啟 aof appendonly yes # 開(kāi)啟 aof復(fù)寫(xiě) auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb # 關(guān)閉 混合持久化 aof-use-rdb-preamble no # 關(guān)閉 rdb save "" # 1. redis 記錄上次aof復(fù)寫(xiě)時(shí)的size,如果之后累計(jì)超過(guò)了原來(lái)的size,則會(huì)發(fā)生aof復(fù)寫(xiě); auto-aof-rewrite-percentage 100 # 2. 為了避免策略1中,小數(shù)據(jù)量時(shí)產(chǎn)生多次發(fā)生aof復(fù)寫(xiě),策略2在滿足策略1的前提下需要超過(guò) 64mb 才會(huì)發(fā)生aof復(fù)寫(xiě); auto-aof-rewrite-min-size 64mb
rdb
# 關(guān)閉 aof 同時(shí)也關(guān)閉了 aof復(fù)寫(xiě) appendonly no # 關(guān)閉 aof復(fù)寫(xiě) auto-aof-rewrite-percentage 0 # 關(guān)閉 混合持久化 aof-use-rdb-preamble no # 開(kāi)啟 rdb 也就是注釋 save "" # save "" save 3600 1 save 300 100 save 60 10000 # redis 默認(rèn)策略如下; # 注意;寫(xiě)了多個(gè) save 策略,只需要滿足一個(gè)則開(kāi)啟rdb持久化 # 3600 秒內(nèi)有以1次修改 save 3600 1 # 300 秒內(nèi)有100次修改 save 300 100 # 60 秒內(nèi)有10000次修改 save 60 10000
rdb-aof混合持久化
# 開(kāi)啟 aof appendonly yes # 開(kāi)啟 aof復(fù)寫(xiě) auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb # 開(kāi)啟 混合持久化 aof-use-rdb-preamble yes # 關(guān)閉 rdb save ""
redis持久化方案的優(yōu)缺點(diǎn)
| 特性 | AOF (Append Only File) | RDB (Redis Database Snapshot) |
|---|---|---|
| 優(yōu)點(diǎn) | 數(shù)據(jù)可靠,丟失較少 持久化過(guò)程代價(jià)較低 | RDB 文件小 數(shù)據(jù)恢復(fù)快 |
| 缺點(diǎn) | AOF 文件過(guò)大 數(shù)據(jù)恢復(fù)慢 | 數(shù)據(jù)丟失較多 持久化過(guò)程代價(jià)較高(fork子進(jìn)程實(shí)現(xiàn)) |
高可用:Redis主從復(fù)制數(shù)據(jù)備份+主從切換機(jī)制-在幾秒鐘內(nèi)得到合理答案
主要用來(lái)實(shí)現(xiàn)redis數(shù)據(jù)的可靠性;防止redis所在的磁盤(pán)損壞,造成數(shù)據(jù)永久丟失;
redis主從間采用異步復(fù)制的方式;異步復(fù)制優(yōu)點(diǎn)高效,缺點(diǎn)是只能保證最終一致?,F(xiàn)代分布式系統(tǒng)都是半數(shù)一致性。

#redis.conf replicaof 127.0.0.1 7002 info replication
主從切換
哨兵模式
只保證一個(gè)節(jié)點(diǎn)的可用性

redis-cluster集群
多個(gè)中心節(jié)點(diǎn)對(duì)外提供服務(wù)。

問(wèn)題:向其中一個(gè)主節(jié)點(diǎn)寫(xiě)入數(shù)據(jù)時(shí),怎么保證數(shù)據(jù)均衡地落到其他主節(jié)點(diǎn)
關(guān)注分布式一致性hash
配置redis-cluster集群
https://github.com/0voice
到此這篇關(guān)于redis的主從同步與對(duì)象模型的文章就介紹到這了,更多相關(guān)redis主從同步與對(duì)象模型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python利用redis限制用戶重復(fù)刷新帶來(lái)的數(shù)據(jù)問(wèn)題
在網(wǎng)站開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到需要控制用戶重復(fù)刷新頁(yè)面的情況,本文就來(lái)介紹了Python利用redis限制用戶重復(fù)刷新帶來(lái)的數(shù)據(jù)問(wèn)題,感興趣的可以了解一下2024-03-03
微服務(wù)Spring Boot 整合 Redis 實(shí)現(xiàn)好友關(guān)注功能
這篇文章主要介紹了微服務(wù)Spring Boot 整合 Redis 實(shí)現(xiàn) 好友關(guān)注,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
Redis內(nèi)存碎片率調(diào)優(yōu)處理方式
Redis集群因內(nèi)存碎片率超過(guò)1.5觸發(fā)告警,分析發(fā)現(xiàn)內(nèi)因與外因?qū)е聝?nèi)存碎片,內(nèi)因?yàn)椴僮飨到y(tǒng)內(nèi)存分配機(jī)制,外因?yàn)镽edis操作特性,使用Redis內(nèi)置內(nèi)存碎片清理機(jī)制可有效降低碎片率,但需注意可能影響性能,建議使用MEMORY命令診斷內(nèi)存使用情況,合理配置參數(shù)以優(yōu)化性能2024-09-09
Redis中key過(guò)期策略的實(shí)現(xiàn)
Key的過(guò)期機(jī)制是Redis保持高可用性的重要策略,過(guò)期策略分為惰性過(guò)期和定期過(guò)期,惰性過(guò)期在每次訪問(wèn)key時(shí)檢查是否過(guò)期,定期過(guò)期則由serverCron方法定時(shí)清理過(guò)期key,本文就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下2024-09-09
Redis遠(yuǎn)程連接Redis客戶端的實(shí)現(xiàn)步驟
本文主要介紹了Redis遠(yuǎn)程連接Redis客戶端的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

