rdb是redis對數據進行持久化而保存到硬盤的數據文件。redis
默認狀況下相關配置以下:緩存
save 900 1 save 300 10 save 60 10000
其意義爲:安全
當1個key更新值時每900秒保存一次數據到硬盤服務器
當10個key更新值時每300秒保存一次到硬盤app
當10000個key更新值時每60秒保存一次到硬盤異步
換句話說,當你重啓服務器時數據是可能會丟失的,若是數據量小的時候,你會丟失5分鐘之內的數據;若是數據量大的時候,你會丟失一分鐘之內的數據。操作系統
因此set name 1
後重啓服務器,get name
時的結果會是nil
,若是你想避免這種狀況發生,那麼能夠save
後重啓服務器。日誌
然而大多數狀況下咱們須要防止的是服務器突發狀況下的重啓,這時候可能沒有機會save,因此仍是會形成數據的丟失。因此你能夠設置save ""
,這樣的話會每次寫操做到保存到硬盤,可是redis做爲緩存卻須要每次到保存到硬盤已喪失了其做爲緩存的意義。所以這種方法是不可取的。code
還有一種方式,在每次寫操做時使用bgsave
命令,能夠直接返回操做結果並異步將其保存到硬盤。get
rdb方式的優勢是保存的數據存儲量小(只有數據),重啓速度很快;缺點是可能會形成數據的丟失。
aof本質是redis操做(寫操做)日誌文件。aof默認是未開啓的,須要在配置文件中進行設置,在配置文件中將這一行改成appendonly yes
就能夠了。
那麼會在何時append到文件末尾呢?有三種方式:
appendfsync always appendfsync everysec appendfsync no
appendfsync always
每次有新命令追加到 AOF 文件時就執行一次 fsync :很是慢,也很是安全
appendfsync everysec
每秒 fsync 一次:足夠快(和使用 RDB 持久化差很少),而且在故障時只會丟失 1 秒鐘的數據。
appendfsync no
從不 fsync :將數據交給操做系統來處理。更快,也更不安全的選擇。推薦(而且也是默認)的措施爲每秒 fsync 一次, 這種 fsync 策略能夠兼顧速度和安全性。
aof可以保證數據的安全,可是在重啓時比較耗時,並且aof文件的體積比rdb文件大。
在同時開啓rdb和aof模式時,會採用aof模式來讀取數據。在正常的使用中,若是不是十分在意短期內的數據丟失的時候,使用rdb方式會使服務器的效率更高,更節省cpu和硬盤;若是擔憂數據丟失的話,aof方式無疑會是更好的選擇。