一泰鸡、持久化之全量寫入:RDB
[redis@6381]$ more /usr/local/redis/conf/redis.conf
save 900 1
save 300 10
save 60 10000
dbfilename "dump.rdb" #持久化文件名稱
dir "/data/dbs/redis/6381" #持久化數(shù)據(jù)文件存放的路徑
上面是redis配置文件里默認(rèn)的RDB持久化設(shè)置滞乙,前三行都是對(duì)觸發(fā)RDB的一個(gè)條件奏纪,例如第一行的意思是每900秒鐘里redis數(shù)據(jù)庫有一條數(shù)據(jù)被修改則觸發(fā)RDB,依次類推斩启;只要有一條滿足就會(huì)調(diào)用BGSAVE進(jìn)行RDB持久化序调。第四行dbfilename指定了把內(nèi)存里的數(shù)據(jù)庫寫入本地文件的名稱,該文件是進(jìn)行壓縮后的二進(jìn)制文件兔簇,通過該文件可以把數(shù)據(jù)庫還原到生成該文件時(shí)數(shù)據(jù)庫的狀態(tài)炕置。第五行dir指定了RDB文件存放的目錄。
配置文件修改需要重啟redis服務(wù)男韧,我們還可以在命令行里進(jìn)行配置朴摊,即時(shí)生效,服務(wù)器重啟后需重新配置
[redis@iZ254r8s3m6Z redis]$ bin/redis-cli
127.0.0.1:6379> CONFIG GET save #查看redis持久化配置
1) "save"
2) "900 1 300 10 60 10000"
127.0.0.1:6379> CONFIG SET save "21600 1000" #修改redis持久化配置
OK
而RDB持久化也分兩種:SAVE和BGSAVE
SAVE是阻塞式的RDB持久化此虑,當(dāng)執(zhí)行這個(gè)命令時(shí)redis的主進(jìn)程把內(nèi)存里的數(shù)據(jù)庫狀態(tài)寫入到RDB文件(即上面的dump.rdb)中甚纲,直到該文件創(chuàng)建完畢的這段時(shí)間內(nèi)redis將不能處理任何命令請(qǐng)求。
BGSAVE屬于非阻塞式的持久化朦前,它會(huì)創(chuàng)建一個(gè)子進(jìn)程專門去把內(nèi)存中的數(shù)據(jù)庫狀態(tài)寫入RDB文件里介杆,同時(shí)主進(jìn)程還可以處理來自客戶端的命令請(qǐng)求。但子進(jìn)程基本是復(fù)制的父進(jìn)程韭寸,這等于兩個(gè)相同大小的redis進(jìn)程在系統(tǒng)上運(yùn)行春哨,會(huì)造成內(nèi)存使用率的大幅增加。
(本人在生產(chǎn)中就碰到過這問題恩伺,redis本身內(nèi)存使用率就60%赴背,總的內(nèi)存使用率在百分之七八十左右,持久化的時(shí)候立馬飆到百分之一百三十多,告警郵件是每天幾十封/(ㄒoㄒ)/~~ 最后根據(jù)需求選擇了AOF持久化)
二凰荚、持久化之增量寫入:AOF
與RDB的保存整個(gè)redis數(shù)據(jù)庫狀態(tài)不同燃观,AOF是通過保存對(duì)redis服務(wù)端的寫命令(如set、sadd便瑟、rpush)來記錄數(shù)據(jù)庫狀態(tài)的缆毁,即保存你對(duì)redis數(shù)據(jù)庫的寫操作,以下就是AOF文件的內(nèi)容
[redis@iZ]$ more appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
SET
$47
DEV_USER_LEGAL_F9683BE0E27F1A06C0CB869CEC7E3B22
$11
?
*3
$3
SET
$47
先讓我們看看如何配置AOF
[redis@iZ]$ more ~/redis/conf/redis.conf
dir "/data/dbs/redis/6381" #AOF文件存放目錄
appendonly yes #開啟AOF持久化到涂,默認(rèn)關(guān)閉
appendfilename "appendonly.aof" #AOF文件名稱(默認(rèn))
appendfsync no #AOF持久化策略
auto-aof-rewrite-percentage 100 #觸發(fā)AOF文件重寫的條件(默認(rèn))
auto-aof-rewrite-min-size 64mb #觸發(fā)AOF文件重寫的條件(默認(rèn))
appendfsync有三個(gè)選項(xiàng):always脊框、everysec和no:
1、選擇always的時(shí)候服務(wù)器會(huì)在每執(zhí)行一個(gè)事件就把AOF緩沖區(qū)的內(nèi)容強(qiáng)制性的寫入硬盤上的AOF文件里践啄,可以看成你每執(zhí)行一個(gè)redis寫入命令就往AOF文件里記錄這條命令缚陷,這保證了數(shù)據(jù)持久化的完整性,但效率是最慢的往核,卻也是最安全的箫爷;
2、配置成everysec的話服務(wù)端每執(zhí)行一次寫操作(如set聂儒、sadd虎锚、rpush)也會(huì)把該條命令追加到一個(gè)單獨(dú)的AOF緩沖區(qū)的末尾,并將AOF緩沖區(qū)寫入AOF文件衩婚,然后每隔一秒才會(huì)進(jìn)行一次文件同步把內(nèi)存緩沖區(qū)里的AOF緩存數(shù)據(jù)真正寫入AOF文件里窜护,這個(gè)模式兼顧了效率的同時(shí)也保證了數(shù)據(jù)的完整性,即使在服務(wù)器宕機(jī)也只會(huì)丟失一秒內(nèi)對(duì)redis數(shù)據(jù)庫做的修改非春;
3柱徙、將appendfsync配置成no則意味redis數(shù)據(jù)庫里的數(shù)據(jù)就算丟失你也可以接受,它也會(huì)把每條寫命令追加到AOF緩沖區(qū)的末尾奇昙,然后寫入文件护侮,但什么時(shí)候進(jìn)行文件同步真正把數(shù)據(jù)寫入AOF文件里則由系統(tǒng)自身決定,即當(dāng)內(nèi)存緩沖區(qū)的空間被填滿或者是超過了設(shè)定的時(shí)限后系統(tǒng)自動(dòng)同步储耐。這種模式下效率是最快的羊初,但對(duì)數(shù)據(jù)來說也是最不安全的,如果redis里的數(shù)據(jù)都是從后臺(tái)數(shù)據(jù)庫如mysql中取出來的什湘,屬于隨時(shí)可以找回或者不重要的數(shù)據(jù)长赞,那么可以考慮設(shè)置成這種模式。
redis如何關(guān)閉持久化
如何關(guān)閉redis持久化闽撤?我的需求是只把redis當(dāng)作緩存來用得哆,所以持久化到硬盤對(duì)我的需求來說沒有意義。
修改redis配置文件哟旗,redis.conf 第115行左右贩据。
1.注釋掉原來的持久化規(guī)則
#save 900 1
#save 300 10
#save 60 10000
2.設(shè)置為空
save ""
然后重啟redis服務(wù)即可栋操。