如何保證緩存與數(shù)據(jù)庫(kù)雙寫(xiě)時(shí)的數(shù)據(jù)一致性?
本期是 Redis 第二期,至此 Redis 部分就全部更新完畢了,下一彈就是常見(jiàn)智力題與面試剖析了,估計(jì)還有兩三期,整個(gè)逆襲進(jìn)大廠系列就全部完結(jié)啦。
完結(jié)的時(shí)間,也會(huì)更新 PDF 的第四版,大家可以放心,第四版絕對(duì)值得期待!
17、假如MySQL有1000萬(wàn)數(shù)據(jù),采用Redis作為中間緩存,取其中的10萬(wàn),如何保證Redis中的數(shù)據(jù)都是熱點(diǎn)數(shù)據(jù)?
可以使用Redis的數(shù)據(jù)淘汰策略,Redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時(shí)候,就會(huì)施行這種策略。具體說(shuō)來(lái),主要有 6種內(nèi)存淘汰策略:
voltile-lru:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰
volatile-ttl:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過(guò)期的數(shù)據(jù)淘汰
volatile-random:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰
allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰
allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰
no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)
18、Redis持久化機(jī)制可以說(shuō)一說(shuō)嗎?
Redis是一個(gè)支持持久化的內(nèi)存數(shù)據(jù)庫(kù),通過(guò)持久化機(jī)制把內(nèi)存中的數(shù)據(jù)同步到硬盤文件來(lái)保證數(shù)據(jù)持久化。當(dāng)Redis重啟后通過(guò)把硬盤文件重新加載到內(nèi)存,就能達(dá)到恢復(fù)數(shù)據(jù)的目的。
很多時(shí)候我們需要持久化數(shù)據(jù)也就是將內(nèi)存中的數(shù)據(jù)寫(xiě)入到硬盤里面,大部分原因是為了之后重用數(shù)據(jù)(比如重啟機(jī) 器、機(jī)器故障之后回復(fù)數(shù)據(jù)),或者是為了防止系統(tǒng)故障而將數(shù)據(jù)備份到一個(gè)遠(yuǎn)程位置。
實(shí)現(xiàn):?jiǎn)为?dú)創(chuàng)建fork()一個(gè)子進(jìn)程,將當(dāng)前父進(jìn)程的數(shù)據(jù)庫(kù)數(shù)據(jù)復(fù)制到子進(jìn)程的內(nèi)存中,然后由子進(jìn)程寫(xiě)入到臨時(shí)文件中,持久化的過(guò)程結(jié)束了,再用這個(gè)臨時(shí)文件替換上次的快照文件,然后子進(jìn)程退出,內(nèi)存釋放。
以下有兩種持久化機(jī)制快照(snapshotting)持久化(RDB持久化)
Redis可以通過(guò)創(chuàng)建快照來(lái)獲得存儲(chǔ)在內(nèi)存里面的數(shù)據(jù)在某個(gè)時(shí)間點(diǎn)上的副本。Redis創(chuàng)建快照之后,可以對(duì)快照進(jìn)行 備份,可以將快照復(fù)制到其他服務(wù)器從而創(chuàng)建具有相同數(shù)據(jù)的服務(wù)器副本(Redis主從結(jié)構(gòu),主要用來(lái)提高Redis性 能),還可以將快照留在原地以便重啟服務(wù)器的時(shí)候使用。
快照持久化是Redis默認(rèn)采用的持久化方式,在Redis.conf配置文件中默認(rèn)有此下配置:
save 900 1 #在900秒(15分鐘)之后,如果至少有1個(gè)key發(fā)生變化,Redis就會(huì)自動(dòng)觸發(fā)BGSAVE命令
創(chuàng)建快照。
save 300 10 #在300秒(5分鐘)之后,如果至少有10個(gè)key發(fā)生變化,Redis就會(huì)自動(dòng)觸發(fā)BGSAVE命令創(chuàng)建快照。
save 60 10000 #在60秒(1分鐘)之后,如果至少有10000個(gè)key發(fā)生變化,Redis就會(huì)自動(dòng)觸發(fā)BGSAVE命令創(chuàng)建快照。
AOF(append-only file)持久化
與快照持久化相比,AOF持久化的實(shí)時(shí)性更好,因此已成為主流的持久化方案。默認(rèn)情況下Redis沒(méi)有開(kāi)啟 AOF(append only ?le)方式的持久化,可以通過(guò)appendonly參數(shù)開(kāi)啟:appendonly yes
開(kāi)啟AOF持久化后每執(zhí)行一條會(huì)更改Redis中的數(shù)據(jù)的命令,Redis就會(huì)將該命令寫(xiě)入硬盤中的AOF文件。AOF文件的 保存位置和RDB文件的位置相同,都是通過(guò)dir參數(shù)設(shè)置的,默認(rèn)的文件名是appendonly.a(chǎn)of。
在Redis的配置文件中存在三種不同的 AOF 持久化方式,它們分別是:
appendfsync always #每次有數(shù)據(jù)修改發(fā)生時(shí)都會(huì)寫(xiě)入AOF文件,這樣會(huì)嚴(yán)重降低Redis的速度
appendfsync everysec #每秒鐘同步一次,顯示地將多個(gè)寫(xiě)命令同步到硬盤
appendfsync no #讓操作系統(tǒng)決定何時(shí)進(jìn)行同步
為了兼顧數(shù)據(jù)和寫(xiě)入性能,用戶可以考慮 appendfsync everysec選項(xiàng) ,讓Redis每秒同步一次AOF文件,Redis性能 幾乎沒(méi)受到任何影響。而且這樣即使出現(xiàn)系統(tǒng)崩潰,用戶最多只會(huì)丟失一秒之內(nèi)產(chǎn)生的數(shù)據(jù)。當(dāng)硬盤忙于執(zhí)行寫(xiě)入操作的時(shí)候,Redis還會(huì)優(yōu)雅的放慢自己的速度以便適應(yīng)硬盤的最大寫(xiě)入速度。
Redis 4.0 對(duì)于持久化機(jī)制的優(yōu)化
Redis 4.0 開(kāi)始支持 RDB 和 AOF 的混合持久化(默認(rèn)關(guān)閉,可以通過(guò)配置項(xiàng) aof-use-rdb-preamble 開(kāi)啟)。
如果把混合持久化打開(kāi),AOF 重寫(xiě)的時(shí)候就直接把 RDB 的內(nèi)容寫(xiě)到 AOF 文件開(kāi)頭。這樣做的好處是可以結(jié)合 RDB 和 AOF 的優(yōu)點(diǎn), 快速加載同時(shí)避免丟失過(guò)多的數(shù)據(jù)。當(dāng)然缺點(diǎn)也是有的, AOF 里面的 RDB 部分是壓縮格式不再是 AOF 格式,可讀性較差。
19、AOF重寫(xiě)了解嗎?可以簡(jiǎn)單說(shuō)說(shuō)嗎?
AOF重寫(xiě)可以產(chǎn)生一個(gè)新的AOF文件,這個(gè)新的AOF文件和原有的AOF文件所保存的數(shù)據(jù)庫(kù)狀態(tài)一樣,但體積更小。
AOF重寫(xiě)是一個(gè)有歧義的名字,該功能是通過(guò)讀取數(shù)據(jù)庫(kù)中的鍵值對(duì)來(lái)實(shí)現(xiàn)的,程序無(wú)須對(duì)現(xiàn)有AOF文件進(jìn)行任伺讀 入、分析或者寫(xiě)入操作。
在執(zhí)行 BGREWRITEAOF 命令時(shí),Redis 服務(wù)器會(huì)維護(hù)一個(gè) AOF 重寫(xiě)緩沖區(qū),該緩沖區(qū)會(huì)在子進(jìn)程創(chuàng)建新AOF文件期間,記錄服務(wù)器執(zhí)行的所有寫(xiě)命令。當(dāng)子進(jìn)程完成創(chuàng)建新AOF文件的工作之后,服務(wù)器會(huì)將重寫(xiě)緩沖區(qū)中的所有內(nèi)容 追加到新AOF文件的末尾,使得新舊兩個(gè)AOF文件所保存的數(shù)據(jù)庫(kù)狀態(tài)一致。最后,服務(wù)器用新的AOF文件替換舊的 AOF文件,以此來(lái)完成AOF文件重寫(xiě)操作。
20、是否使用Redis集群,集群的原理是什么
Redis Sentinel(哨兵)著眼于高可用,在master宕機(jī)時(shí)會(huì)自動(dòng)將slave提升為master,繼續(xù)提供服務(wù)。
Sentinel(哨兵)可以監(jiān)聽(tīng)集群中的服務(wù)器,并在主服務(wù)器進(jìn)入下線狀態(tài)時(shí),自動(dòng)從服務(wù)器中選舉出新的主服務(wù)器。
Redis Cluster(集群)著眼于擴(kuò)展性,在單個(gè)Redis內(nèi)存不足時(shí),使用Cluster進(jìn)行分片存儲(chǔ)。
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場(chǎng)仿真助跑新能源汽車
-
11月20日火熱報(bào)名中>> 2024 智能家居出海論壇
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國(guó)智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書(shū)》
推薦專題
- 1 【一周車話】沒(méi)有方向盤和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無(wú)人駕駛車,還未迎來(lái)“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 6 馬斯克致敬“國(guó)產(chǎn)蘿卜”?
- 7 神經(jīng)網(wǎng)絡(luò),誰(shuí)是盈利最強(qiáng)企業(yè)?
- 8 比蘋(píng)果偉大100倍!真正改寫(xiě)人類歷史的智能產(chǎn)品降臨
- 9 諾獎(jiǎng)進(jìn)入“AI時(shí)代”,人類何去何從?
- 10 Open AI融資后成萬(wàn)億獨(dú)角獸,AI人才之爭(zhēng)開(kāi)啟
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市