1.為什么需要Redis持久化
Redis是基于內(nèi)存的NoSQL數(shù)據(jù)庫,讀寫速度很快,但是存儲在內(nèi)存中的Redis數(shù)據(jù)會在服務(wù)器重啟后丟失。
然而在一些場景中,需要長久的保存數(shù)據(jù),所以需要把內(nèi)存中的數(shù)據(jù)持久化的保存在硬盤中。
Redis持久化提供兩種方式:
1??:AOF(Append Only File)只追加文件
2??:RDB(Redis DataBase)基于Redis數(shù)據(jù)庫
2.Redis持久化機制概述
2.1.基于AOF的持久化機制
Redis的AOF持久化是指將數(shù)據(jù)存儲到二進(jìn)制日志文件中,以便在重啟或出現(xiàn)故障時可以恢復(fù)數(shù)據(jù)。
AOF持久化會周期性地將數(shù)據(jù)寫入到日志文件中,因此可以實現(xiàn)更高的數(shù)據(jù)備份頻率。
在使用基于AOF的持久化方式時,需要注意以下幾點:
- 寫入日志文件的數(shù)據(jù)會占用一定的存儲空間,因此需要考慮磁盤空間的問題。
- 基于AOF的持久化方式需要消耗一定的系統(tǒng)資源,包括寫入日志文件的時間和空間、維護AOF文件的開銷等。因此在高并發(fā)場景下,需要根據(jù)實際情況進(jìn)行調(diào)整。
- 基于AOF的持久化方式可以通過配置日志文件的大小和頻率來調(diào)整備份數(shù)據(jù)的頻率和大小,以滿足不同場景的需求。
- 在使用基于AOF的持久化方式時,需要注意防止系統(tǒng)故障或重啟導(dǎo)致數(shù)據(jù)丟失,可以通過定期備份或使用其他持久化方式(如RDB持久化)來增強數(shù)據(jù)保護能力。
2.2.基于RDB的持久化機制
基于RDB的持久化方式會把當(dāng)前內(nèi)存中所有Redis鍵值對數(shù)據(jù)以快照(snapshot)的方式寫入硬盤文件中,如果需要恢復(fù)數(shù)據(jù),就把快照文件讀到內(nèi)存中。
RDB持久化的主要優(yōu)點是數(shù)據(jù)可以快速恢復(fù),而且不需要消耗太多的系統(tǒng)資源。
但是,RDB持久化也有一些缺點,如數(shù)據(jù)在內(nèi)存中的寫入和查詢效率可能會受到一定的影響,并且RDB持久化方式不支持快速的數(shù)據(jù)備份和恢復(fù)。
因此,在實際應(yīng)用中,需要根據(jù)具體場景選擇適合的持久化方式。
3.AOF持久化機制實戰(zhàn)
3.1.AOF方式持久化機制實戰(zhàn)
可以通過設(shè)置配置文件里的參數(shù)來啟動或停止AOF持久化機制,由于基于AOF的持久化方式具有實時存儲的特性,因此可以在讀寫關(guān)鍵數(shù)據(jù)時開啟,以防因Redis重啟或故障而導(dǎo)致的風(fēng)險。
AOF配置文件參數(shù)說明:通過redis.conf
來配置AOF
- 開啟AOF持久化,關(guān)閉注視掉即可
appendonly yes
- 設(shè)置持久化策略(always、everysec、no)
appendfsync everysec
1??:always:每次觸發(fā)寫操作都會觸發(fā)持久化操作,可能會影響redis自身及redis服務(wù)器性能
2??:everysec:會以1秒頻率觸發(fā)持久化動作,這種方式能很好平衡持久化需求和性能間關(guān)系
3??:no:由操作系統(tǒng)決定持久化頻率,這種方式對其他另外兩種而言性能最好,但可能每次持久化操作間的間隔有些長,這樣當(dāng)故障發(fā)生時可能會丟失較多的數(shù)據(jù)。
- 持久化文件所在路徑和文件名
dir ./
appendfilename "appendonly.aof"
- 平衡性能與安全性:取值為yes,那么在重寫AOF文件時能提升性能,但可能在重寫AOF文件時丟失數(shù)據(jù);如果取值為no,則不會丟失數(shù)據(jù),但較取值為yes的性能可能會降低。
no-appendfsync-on-rewrite no
- 指定重寫條件:如果當(dāng)前的AOF文件比上次執(zhí)行重寫時的文件大100%時會再次觸發(fā)重寫操作。如果該參數(shù)取值為0,則不會觸發(fā)重寫操作。
auto-aof-rewrite-percentage 100
- 指定觸發(fā)重寫時AOF文件大小
auto-aof-rewrite-min-size 64mb
注意:,由auto-aof-rewrite-percentage
和auto-aof-rewrite-min-size
兩個參數(shù)指定的重寫條件是“And”的關(guān)系,即只有當(dāng)同時滿足這兩個條件時才會觸發(fā)重寫操作,比如當(dāng)前AOF文件的大小小于auto-aof-rewrite-min-size
參數(shù)指定的值,哪怕文件增幅達(dá)到no-appendfsync-on- rewrite
參數(shù)指定的范圍,也不會觸發(fā)重寫操作。
實踐:
- 配置reids AOF持久化配置文件:
redis.conf
,配置后重啟redis
dir /data
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
注意:啟動redis時指定配置文件
redis-server /path/to/redis.conf
- 連接redis服務(wù)器,創(chuàng)建一些數(shù)據(jù)
[root@localhost ~]# redis-cli
127.0.0.1:6379> get name001
(nil)
127.0.0.1:6379> set name001 'xiaoming'
OK
127.0.0.1:6379> set age001 30
OK
如果配置成功,當(dāng)前是開啟AOF持久化的,應(yīng)該會有數(shù)據(jù)
[root@localhost redis-6.2.12]# cd /data/
[root@localhost data]# ls
appendonly.aof
[root@localhost data]# cat appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
set
$7
name001
$8
xiaoming
*3
$3
set
$6
age001
$2
30
以上數(shù)據(jù)即為持久化文件的內(nèi)容:
選擇0號數(shù)據(jù)庫,插入兩條鍵值對
3.2.重寫AOF文件的效果
- 向數(shù)據(jù)庫插入一個列表
[root@localhost ~]# redis-cli
127.0.0.1:6379> lpush namelist "yy1"
(integer) 1
127.0.0.1:6379> lpush namelist "yy2"
(integer) 2
127.0.0.1:6379> lpush namelist "yy3"
(integer) 3
127.0.0.1:6379> lpush namelist "yy4"
(integer) 4
- 查看持久化文件內(nèi)容
*3
$5
lpush
$8
namelist
$3
yy1
*3
$5
lpush
$8
namelist
$3
yy2
*3
$5
lpush
$8
namelist
$3
yy3
*3
$5
lpush
$8
namelist
$3
yy4
- 運行bgrewriteaof命令手動觸發(fā)AOF文件的重寫動作,然后打開文件查看
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started
REDIS0009ú redis-ver^F6.2.12ú
redis-bitsà@ú^Ectime?^<8b><91>dú^Hused-mem?HW^M^@ú^Laof-preambleà^At^@?^C^@^@^Fage001à^^^@^Gname001^Hxiaoming^N^Hnamelist^A^_^_^@^@^@^Y^@^@^@^D^@^@^Cyy4^E^Cyy3^E^Cyy2^E^Cyy1??^?d^_5μ<82>{^?
3.3.模擬數(shù)據(jù)恢復(fù)
- 停止該redis服務(wù)器并重新啟動一個新的服務(wù)器
[root@localhost data]# ps -ef | grep 6379
root 1943 1 0 19:03 ? 00:00:03 redis-server 127.0.0.1:6379
root 1993 1314 0 19:24 pts/0 00:00:00 grep --color=auto 6379
[root@localhost data]# kill -9 1943
redis-server /root/redis-6.2.12/redis.conf
- 連接服務(wù)器查看數(shù)據(jù)、創(chuàng)建數(shù)據(jù)、清空內(nèi)存數(shù)據(jù)
127.0.0.1:6379> get name001
"xiaoming"
127.0.0.1:6379> get age001
"30"
127.0.0.1:6379> set name002 xiaoli
OK
127.0.0.1:6379> set age002 21
OK
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> get name002
(nil)
127.0.0.1:6379> get age002
(nil)
- 查看持久化文件,包含剛才執(zhí)行的數(shù)據(jù)
*3
$3
set
$7
name002
$6
xiaoli
*3
$3
set
$6
age002
$2
21
*1
$8
FLUSHALL
- 退出客戶端,停止運行redis服務(wù)器,刪除持久化文件中的FLUSHALL,不然執(zhí)行后還會清空
- 重啟啟動redis服務(wù)器,查看數(shù)據(jù)
[root@localhost ~]# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> get name002
"xiaoli"
127.0.0.1:6379> get age002
"21"
看到此內(nèi)容證明恢復(fù)成功
3.4.修復(fù)AOF文件
報錯:
"Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>"
代表AOF文件格式不正確
解決:
redis-check-aof --fix /data/appendonly.aof
后面加你自己的aof文件路徑,即可修復(fù)成功。
文件損壞也會導(dǎo)致redis啟動失敗。
4.RDB持久化機制實踐
在基于RDB的持久化機制里會定時把Redis內(nèi)存數(shù)據(jù)以快照的方式保存到硬盤上,而在必要的時候可以通過快照文件來恢復(fù)數(shù)據(jù)。
4.1.修改基于RDB的配置文件
- 為了方便區(qū)分,先把基于AOF的配置關(guān)閉,只配置RDB相關(guān)配置
appendonly no
save 600 1
save 300 100
save 60 1000
1??:第1行代碼表示當(dāng)在600秒內(nèi)有1個或1個以上的鍵被修改時就會生成快照
2??:第2行代碼表示在300秒內(nèi)有大于或等于100個鍵被修改時就會生成快照
3??:第3行表示在60秒內(nèi)有大于或等于1000個鍵被修改時會生成快照。
注意:三者是或的關(guān)系,滿足一條即可觸發(fā)
- 設(shè)置文件名及路徑
dbfilename dump.rdb
dir /data
4.2.創(chuàng)建Redis服務(wù)器進(jìn)行測試
- 啟動redis服務(wù)器
[root@localhost redis-6.2.12]# redis-server redis.conf
- 連接服務(wù)器創(chuàng)建一條數(shù)據(jù)
[root@localhost ~]# redis-cli
127.0.0.1:6379> set id001 001
OK
127.0.0.1:6379> set id002 002
OK
- 此時已經(jīng)有rdb文件
[root@localhost redis-6.2.12]# cd /data/
[root@localhost data]# ls
appendonly.aof dump.rdb
[root@localhost data]# cat dump.rdb
REDIS0009 redis-ver6.2.12
redis-bits????eêused-mem@V
aof-preamble@r? [root@localhost data]# Xshell
- 恢復(fù)數(shù)據(jù)與AOF類似,停止服務(wù)器重啟創(chuàng)建即可自動恢復(fù)數(shù)據(jù)。
5.如何選用持久化方式
在Redis里,基于AOF和RDB的兩種持久化方式有各自的優(yōu)缺點,所以它們有各自的應(yīng)用場合。
5.1.對比兩種持久化方式
Redis有兩種持久化方式,分別是RDB(Redis DataBase)和AOF(Append-Only File)。
RDB的優(yōu)點:
- RDB使用一種緊湊的二進(jìn)制格式來存儲數(shù)據(jù),因此它的速度非???。在恢復(fù)大量數(shù)據(jù)時,它通常比AOF快得多。
- RDB對于在磁盤上的數(shù)據(jù)備份和恢復(fù)非常有用,用于災(zāi)難恢復(fù)和數(shù)據(jù)遷移。
RDB的缺點:
- RDB快照是定期執(zhí)行的,而不是實時執(zhí)行,所以如果Redis在快照之間崩潰,您將丟失最新的數(shù)據(jù)。
- RDB無法保證數(shù)據(jù)的實時性,因為您需要配置多久進(jìn)行一次快照,并在磁盤之間傳輸大量的數(shù)據(jù)。
AOF的優(yōu)點:
- AOF以追加方式記錄每個寫操作,因此能夠?qū)崟r記錄每個數(shù)據(jù)更改,更加可靠。
- AOF提供了更好的數(shù)據(jù)安全保障,因為它通過記錄每個寫操作來避免數(shù)據(jù)的丟失。
AOF的缺點:
- AOF記錄每個寫操作,因此它的速度比RDB慢,尤其在寫操作比較頻繁時更加明顯。
- AOF生成的日志文件可能比較大,因此需要定期進(jìn)行壓縮和清理。
綜上所述,RDB在執(zhí)行速度和備份恢復(fù)上優(yōu)于AOF,但無法保證數(shù)據(jù)的實時性;而AOF在數(shù)據(jù)安全方面更有保障,但會對性能產(chǎn)生影響。因此,選擇哪種持久化方式應(yīng)該根據(jù)具體業(yè)務(wù)需求和應(yīng)用場景來確定。Redis有兩種持久化方式,分別是RDB(Redis DataBase)和AOF(Append-Only File)。文章來源:http://www.zghlxwxcb.cn/news/detail-495021.html
5.2.綜合使用兩種持久化方式
因為兩種持久化方式各有優(yōu)缺點,所以可以兩種方式都開啟。文章來源地址http://www.zghlxwxcb.cn/news/detail-495021.html
到了這里,關(guān)于【2023】Redis數(shù)據(jù)持久化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!