redis数据持久化到mysql_Redis【数据持久化篇】
生活随笔
收集整理的這篇文章主要介紹了
redis数据持久化到mysql_Redis【数据持久化篇】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1 前言
redis是一款基于內(nèi)存的NoSQL數(shù)據(jù)庫,數(shù)據(jù)都存儲在內(nèi)存中,一旦機(jī)器出現(xiàn)宕機(jī),或者突發(fā)意外斷電等,導(dǎo)致機(jī)器無法正常工作的情況下,那么redis中的數(shù)據(jù)就丟失了,面對這種問題,redis提供了持久化機(jī)制將數(shù)據(jù)保存到本地磁盤中,以便在服務(wù)器宕機(jī)之后,可以對數(shù)據(jù)進(jìn)行恢復(fù)。2 Redis持久化
i. Redis持久化,就是將內(nèi)存中的數(shù)據(jù),永久保存到磁盤上。ii. Redis持久化有兩種方式:RDB(Redis DB)、AOF(AppendOnlyFile)。
2.1 RDB(快照模式)
在默認(rèn)情況下,Redis 將數(shù)據(jù)庫快照保存在名字為dump.rdb的二進(jìn)制文件中,可以在redis.conf配置文件中修改持久化信息。save 900 1 表示在900秒內(nèi),至少更新了1條數(shù)據(jù)。Redis就將數(shù)據(jù)持久化到硬盤save 300 10 表示在300秒內(nèi),至少更新了10條數(shù)據(jù),Redis就會觸發(fā)將數(shù)據(jù)持久化到硬盤
save 60 10000 表示60秒內(nèi),至少更新了10000條數(shù)據(jù),Redis就會觸發(fā)將數(shù)據(jù)持久化到硬盤
2.1.1 策略
(1)自動:BGSAVE
--特點(diǎn):
【1】按照配置文件中的條件滿足就執(zhí)行BGSAVE。【2】非阻塞,Redis服務(wù)正常接收處理客戶端請求。
【3】Redis會folk()一個新的子進(jìn)程來創(chuàng)建RDB文件,子進(jìn)程處理完后會向父進(jìn)程發(fā)送一個信號,通知它處理完畢,父進(jìn)程用新的dump.rdb替代舊文件。
(2)手動:SAVE
--特點(diǎn):
【1】客戶端(redis-cli)發(fā)起SAVE命令。【2】阻塞Redis服務(wù),無法響應(yīng)客戶端請求。
【3】創(chuàng)建新的dump.rdb替代舊文件。
2.1.2 優(yōu)點(diǎn)
i. 執(zhí)行效率高。ii. 恢復(fù)大數(shù)據(jù)集速度較AOF快。
2.1.3 缺點(diǎn)
i. 會丟失最近寫入、修改的而未能持久化的數(shù)據(jù)。ii. folk過程非常耗時,會造成毫秒級不能響應(yīng)客戶端請求。
2.2 AOF(追加模式、命令重演)
2.2.1 特點(diǎn)
【1】Append only file,采用追加的方式保存,默認(rèn)文件為appendonly.aof;【2】記錄所有的寫操作命令,在服務(wù)啟動的時候重演這些命令就可以還原數(shù)據(jù)庫;
【3】AOF默認(rèn)關(guān)閉,需要在配置文件中手動開啟。
2.2.2 寫入機(jī)制
說明:AOF機(jī)制,添加了一個內(nèi)存緩沖區(qū)(buffer),將內(nèi)容寫入緩沖區(qū)。當(dāng)緩沖區(qū)被填滿、或者用戶手動執(zhí)行fsync、或者系統(tǒng)根據(jù)指定的寫入磁盤策略自動調(diào)用fdatasync命令,才將緩沖區(qū)里的內(nèi)容真正寫入磁盤里。因此在緩沖區(qū)里的內(nèi)容未寫入磁盤之前,可能會丟失。
2.2.3 寫入磁盤的策略
appendfsync選項(xiàng),這個選項(xiàng)的值可以是always、everysec或者no。Always:服務(wù)器每寫入一個命令,就調(diào)用一次fdatasync,將緩沖區(qū)里面的命令寫入到硬盤。這種模式下,服務(wù)器出現(xiàn)故障,也不會丟失任何已經(jīng)成功執(zhí)行的命令數(shù)據(jù)。Everysec(默認(rèn)):服務(wù)器每一秒調(diào)用一次fdatasync,將緩沖區(qū)里面的命令寫入到硬盤。這種模式下,服務(wù)器出現(xiàn)故障,最多只丟失一秒鐘內(nèi)的執(zhí)行的命令數(shù)據(jù)。No:服務(wù)器不主動調(diào)用fdatasync,由操作系統(tǒng)決定何時將緩沖區(qū)里面的命令寫入到硬盤。這種模式下,服務(wù)器遭遇意外停機(jī)時,丟失命令的數(shù)量是不確定的。運(yùn)行速度:always的速度慢,everysec和no都很快。
2.2.4 aof重寫機(jī)制
AOF文件過大,合并重復(fù)的操作,AOF會使用盡可能少的命令來記錄。2.2.4.1 重寫過程
(1)fork一個子進(jìn)程負(fù)責(zé)重寫AOF文件。(2)子進(jìn)程會創(chuàng)建一個臨時文件寫入AOF信息。
(3)父進(jìn)程會開辟一個內(nèi)存緩沖區(qū)接收新的寫命令。
(4)子進(jìn)程重寫完成后,父進(jìn)程會獲得一個信號,將父進(jìn)程接收到的新的寫操作由子進(jìn)程寫入到臨時文件中。
(5)新文件替代舊文件。
重寫的本質(zhì):就是將操作同一個鍵的命令合并。從而減小AOF文件的體積。
2.2.4.2 aof重寫觸發(fā)機(jī)制
(1)手動:客戶端向服務(wù)器發(fā)送BGREWRITEAOF命令。(2)自動:配置文件中的選項(xiàng),自動執(zhí)行BGREWRITEAOF命令。
auto-aof-rewrite-min-size <size>
觸發(fā)AOF重寫所需的最小體積:只要在AOF文件的體積大于等于size時,才會考慮是否需要進(jìn)行AOF重寫,這個選項(xiàng)用于避免對體積過小的AOF文件進(jìn)行重寫。auto-aof-rewrite-percentage <percent>
指定觸發(fā)重寫所需的AOF文件體積百分比:當(dāng)AOF文件的體積大于auto-aof-rewrite-min-size指定的體積,并且超過上一次重寫之后的AOF文件體積的percent %時,就會觸發(fā)AOF重寫。(如果服務(wù)器剛剛啟動不久,還沒有進(jìn)行過AOF重寫,那么使用服務(wù)器啟動時載入的AOF文件的體積來作為基準(zhǔn)值)。將這個值設(shè)置為0表示關(guān)閉自動AOF重寫。
2.2.5 優(yōu)點(diǎn)
(1)寫入機(jī)制,默認(rèn)fysnc(手工同步)每秒執(zhí)行,性能很好不阻塞服務(wù),最多丟失一秒的數(shù)據(jù);(2)重寫機(jī)制,優(yōu)化AOF文件;
(3)如果誤操作了(FLUSHALL等),只要AOF未被重寫,停止服務(wù)移除AOF文件尾部FLUSHALL命令,重啟Redis,可以將數(shù)據(jù)集恢復(fù)到FLUSHALL 執(zhí)行之前的狀態(tài)。
2.2.6 缺點(diǎn)
(1)相同數(shù)據(jù)集,AOF文件體積較RDB大了很多。(2)恢復(fù)數(shù)據(jù)庫速度較RDB慢(文本,命令重演)。
總結(jié)
以上是生活随笔為你收集整理的redis数据持久化到mysql_Redis【数据持久化篇】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python爬取知乎标题_python爬
- 下一篇: linux cmake编译源码,linu