深入浅出mysql第三版pdf百度云,工作感悟
什么是Redis的持久化
我們知道Redis的數(shù)據(jù)都存儲(chǔ)在內(nèi)存中,如果服務(wù)器突然宕機(jī),那么內(nèi)存數(shù)據(jù)將會(huì)全部消失,為了防止這種情況出現(xiàn),利用一套機(jī)制來(lái)保證數(shù)據(jù)不會(huì)因?yàn)楣收隙鴣G失,我們將這種機(jī)制稱(chēng)之為Redis的持久化機(jī)制,該機(jī)制主要目的是將內(nèi)存數(shù)據(jù)存入到硬盤(pán)中
Redis 提供兩種持久化機(jī)制RDB(Redis DataBase)和AOF(Append-Only File)機(jī)制。
RDB-快照
快照是最簡(jiǎn)單的Redis持久化模式,也就是生成某個(gè)時(shí)間點(diǎn)的數(shù)據(jù)集,生成RDB文件,可以看到RDB文件中的數(shù)據(jù)是非常緊湊的,所以在恢復(fù)數(shù)據(jù)的時(shí)候讀取也是非常快的
觸發(fā)RDB快照的方式有兩種
手動(dòng)觸發(fā)
通過(guò)手動(dòng)執(zhí)行bgsave/save,顯示觸發(fā)生成快照
-
save命令:阻塞當(dāng)前Redis服務(wù)器,直到RDB過(guò)程完成為止,對(duì)于內(nèi)存 比較大的實(shí)例會(huì)造成長(zhǎng)時(shí)間阻塞,線(xiàn)上環(huán)境不建議使用
-
bgsave命令:Redis進(jìn)程執(zhí)行fork操作創(chuàng)建子進(jìn)程,RDB持久化過(guò)程由子 進(jìn)程負(fù)責(zé),完成后自動(dòng)結(jié)束。阻塞只發(fā)生在fork階段,一般時(shí)間很短
配置參數(shù)自動(dòng)觸發(fā)
自動(dòng)觸發(fā)有以下幾種情況:
- 使用save相關(guān)配置,命令save m n。表示m秒內(nèi)數(shù)據(jù)集存在n次修改時(shí),自動(dòng)觸發(fā)bgsave
- 從節(jié)點(diǎn)執(zhí)行全量復(fù)制操作,主節(jié)點(diǎn)自動(dòng)執(zhí)行bgsave生成RDB文件發(fā)送給從節(jié)點(diǎn)
- 執(zhí)行debug reload命令重新加載Redis時(shí),自動(dòng)觸發(fā)save命令
- 執(zhí)行shutdown命令時(shí),如果沒(méi)有開(kāi)啟AOF持久化功能自動(dòng)執(zhí)行bgsave
注意:在RDB持久化的過(guò)程中有兩個(gè)問(wèn)題需要考慮
針對(duì)上述問(wèn)題我們先看一下RDB的持久化執(zhí)行流程
根據(jù)上圖我們可以看到主線(xiàn)程主要是fork一個(gè)子線(xiàn)程來(lái)進(jìn)行持久化操作,同時(shí)父子線(xiàn)程會(huì)共享一個(gè)數(shù)據(jù)區(qū)域,而且該區(qū)域設(shè)置為read-only方式,該方式下讀的時(shí)候沒(méi)有問(wèn)題,但是寫(xiě)的時(shí)候會(huì)觸發(fā)copyonwrite機(jī)制來(lái)進(jìn)行,接下來(lái)我們看看什么是 COW(Copy On Write) 機(jī)制 。
COW(Copy On Write) 機(jī)制
COW(Copy On Write) 機(jī)制屬于操作系統(tǒng)處理多進(jìn)程下的一種機(jī)制,Redis在持久化的時(shí)候會(huì)調(diào)用glibc函數(shù)fork一個(gè)子進(jìn)程。父子進(jìn)程會(huì)共享內(nèi)存里面的代碼段和數(shù)據(jù)段。
所以持久化的時(shí)候是完全交給子進(jìn)程,而父進(jìn)程繼續(xù)處理客戶(hù)端請(qǐng)求,所以在持久化的時(shí)候操作系統(tǒng)采用COW機(jī)制進(jìn)程數(shù)據(jù)段頁(yè)面的分離。數(shù)據(jù)段是由很多操作系統(tǒng)的頁(yè)面組合而成,當(dāng)父進(jìn)程對(duì)其中一個(gè)頁(yè)面進(jìn)行數(shù)據(jù)修改的時(shí)候,先將被父子線(xiàn)程共享的這一個(gè)頁(yè)面復(fù)制并分離出來(lái),然后直接對(duì)復(fù)制的頁(yè)面進(jìn)程修改,而此時(shí)子進(jìn)程對(duì)應(yīng)的頁(yè)面是沒(méi)有修改的。
Redis采用該機(jī)制的簡(jiǎn)單流程如下。Lunix在fork之后,操作系統(tǒng)會(huì)將父進(jìn)程的所有內(nèi)存也權(quán)限設(shè)置為read-only,然后子進(jìn)程的地址空間指向父進(jìn)程。當(dāng)父進(jìn)程只讀時(shí)沒(méi)有問(wèn)題,當(dāng)有寫(xiě)內(nèi)存時(shí),CPU硬件檢測(cè)到內(nèi)存也是read-only,于是會(huì)觸發(fā)頁(yè)異常中斷(page-fault),陷入到操作系統(tǒng)的一個(gè)中斷例程。中斷例程中,操作系統(tǒng)采用cow機(jī)制會(huì)觸發(fā)異常的也復(fù)制一份,于是父子進(jìn)程各自持有獨(dú)立的一份,如果這個(gè)時(shí)候又大量寫(xiě)入操作,會(huì)產(chǎn)生大量的分頁(yè)錯(cuò)誤(頁(yè)異常中斷page-fault),從而觸發(fā)cow機(jī)制。
之所以稱(chēng)之為快照也就是說(shuō)在子進(jìn)程創(chuàng)建的那一時(shí)刻開(kāi)始。內(nèi)存的數(shù)據(jù)就固定下來(lái)了,不會(huì)發(fā)生變化。
RDB的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
缺點(diǎn)
AOF(Append Only File - 僅追加文件)
根據(jù)上文,快照在某些情況下不是可行的選擇,所以AOF很好的支持了。
AOF 原理
該方式非常簡(jiǎn)單:也就是修改內(nèi)存的操作命令都會(huì)記錄下來(lái),加入AOF日志記錄都是Redis實(shí)例創(chuàng)建以來(lái)的所有修改性指令序列,所以恢復(fù)也就是順序執(zhí)行所有執(zhí)行。
Redis使用單線(xiàn)程相應(yīng)命令,如果每次寫(xiě)AOF文件命令都追加到硬盤(pán),會(huì)極大地影響處理性能,所以Redis會(huì)先寫(xiě)入到aof緩沖區(qū),根據(jù)用戶(hù)配置的同步硬盤(pán)策略寫(xiě)入到aof文件中,這個(gè)策略可以通過(guò)appendfsync參數(shù)配置,
- always:每一次寫(xiě)操作都會(huì)調(diào)用一次fsync,這時(shí)數(shù)據(jù)是最安全的,當(dāng)然,由于每次都會(huì)執(zhí)行fsync,所以其性能也會(huì)受到影響
- no:Redis不會(huì)主動(dòng)調(diào)用fsync去將AOF日志內(nèi)容同步到磁盤(pán),所以這一切就完全依賴(lài)于操作系統(tǒng)的調(diào)試了。對(duì)大多數(shù)Linux操作系統(tǒng),是每30秒進(jìn)行一次fsync,將緩沖區(qū)中的數(shù)據(jù)寫(xiě)到磁盤(pán)上。
- everysec:Redis會(huì)默認(rèn)每隔一秒進(jìn)行一次fsync調(diào)用,將緩沖區(qū)中的數(shù)據(jù)寫(xiě)到磁盤(pán)。但是當(dāng)這一次的fsync調(diào)用時(shí)長(zhǎng)超過(guò)1秒時(shí)。Redis會(huì)采取延遲fsync的策略,再等一秒鐘。也就是在兩秒后再進(jìn)行fsync,這一次的fsync就不管會(huì)執(zhí)行多長(zhǎng)時(shí)間都會(huì)進(jìn)行。這時(shí)候由于在fsync時(shí)文件描述符會(huì)被阻塞,所以當(dāng)前的寫(xiě)操作就會(huì)阻塞。
注意,這也是影響Redis性能的參數(shù)之一,建議采用 appendfsync everysec(缺省方式)
AOF重寫(xiě)
所謂重寫(xiě),Redis在長(zhǎng)期運(yùn)行過(guò)程中日志會(huì)越來(lái)越大,在恢復(fù)的時(shí)候會(huì)非常好使,所以我們的目的就是對(duì)日志做瘦身
會(huì)從以下幾點(diǎn)做瘦身:
Redis使用bgrewriteaof指令做瘦身,主要也是開(kāi)辟一個(gè)子進(jìn)程對(duì)內(nèi)存遍歷轉(zhuǎn)化為一系列指令,并序列化到新的文件中,接下來(lái)再將操作期間的增量AOF日志追加到新的日志文件中,最終替換了舊的。
AOF重寫(xiě)機(jī)制兩種方式觸發(fā)
-
auto-aof-rewrite-min-size:表示運(yùn)行AOF重寫(xiě)時(shí)文件最小體積,默認(rèn)為64MB。
-
auto-aof-rewrite-percentage:代表當(dāng)前AOF文件空間 (aof_current_size)和上一次重寫(xiě)后AOF文件空間(aof_base_size)的比值。
如上代表AOF文件的大小小于64mb(默認(rèn)值),且當(dāng)前AOF文件大小比基準(zhǔn)大小增長(zhǎng)了100%時(shí)會(huì)觸發(fā)。
AOF優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
數(shù)據(jù)安全,aof持久化配置appendfsync屬性,有always,每執(zhí)行一次命令操作就記錄到aof文件一次
缺點(diǎn)
數(shù)據(jù)集大的時(shí)候,比如RDB啟動(dòng)效率低
混合持久化(Redis 4.0版本)
我們根據(jù)上文知道,RDB恢復(fù)會(huì)存在大量數(shù)據(jù),AOF恢復(fù)性能又較慢,所以在Redis4.0中,采用混合持久化,將RDB文件內(nèi)存和增量的AOF日志文件放在一起,這里的AOF日志不再是全量日志。而是自持久化開(kāi)始到持久化結(jié)束的這段時(shí)間的增量日志,通常較小,重啟效率因此大幅得到提升
加載的時(shí)候,首先會(huì)識(shí)別AOF文件是否以REDIS字符串開(kāi)頭,如果是就按照RDB格式加載,加載完成后繼續(xù)按AOF加載剩余的部分
總結(jié)
總體來(lái)說(shuō),如果你想轉(zhuǎn)行從事程序員的工作,Java開(kāi)發(fā)一定可以作為你的第一選擇。但是不管你選擇什么編程語(yǔ)言,提升自己的硬件實(shí)力才是拿高薪的唯一手段。
如果你以這份學(xué)習(xí)路線(xiàn)來(lái)學(xué)習(xí),你會(huì)有一個(gè)比較系統(tǒng)化的知識(shí)網(wǎng)絡(luò),也不至于把知識(shí)學(xué)習(xí)得很零散。我個(gè)人是完全不建議剛開(kāi)始就看《Java編程思想》、《Java核心技術(shù)》這些書(shū)籍,看完你肯定會(huì)放棄學(xué)習(xí)。建議可以看一些視頻來(lái)學(xué)習(xí),當(dāng)自己能上手再買(mǎi)這些書(shū)看又是非常有收獲的事了。
這些視頻如果需要的話(huà),可以無(wú)償分享給大家,點(diǎn)擊這里即可免費(fèi)領(lǐng)取
Java核心技術(shù)》這些書(shū)籍,看完你肯定會(huì)放棄學(xué)習(xí)。建議可以看一些視頻來(lái)學(xué)習(xí),當(dāng)自己能上手再買(mǎi)這些書(shū)看又是非常有收獲的事了。
這些視頻如果需要的話(huà),可以無(wú)償分享給大家,點(diǎn)擊這里即可免費(fèi)領(lǐng)取
總結(jié)
以上是生活随笔為你收集整理的深入浅出mysql第三版pdf百度云,工作感悟的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电大计算机本科离散数学考试题,国开(中央
- 下一篇: cocos2d-lua ARPG手机游戏