redis是一種可內存也可持久化的內存數據庫,所謂持久化,就是將數據放到斷電後數據不會丟失的設備中,也就是通常理解的磁盤上。
redis配置文件
whereis redis.conf
redis: /etc/redis.conf
每一個配置項的含義看鏈接:https://redis.io/topics/config
在redis啟動的前提下
config get * //可以看到部分配置項
其他配置項可以通過config get xxx 獲取
並可以使用config set key value進行配置
redis持久化策略
第一種:RDB快照
Redis支持將當前數據的快照存成一個數據文件的持久化機制。而一個持續寫入的數據庫如何生成快照呢?Redis藉助fork命令的copy on write機制。在生成快照時,將當前進程fork出一個子進程,然後在子進程中循環所有的數據,將數據寫成為RDB文件。
通過Redis的save指令來配置RDB快照生成規則,配置方式有兩種;
一是配置Redis.conf
二是通過config set 命令在Redis運行時配置,不需重啟Redis
查看save規則:
redis 127.0.0.1:6379> config get save
1) "save"
2) "3600 1 300 100 60 10000"
RDB文件寫操作是在一個新進程中進行的,子進程會先將數據寫入臨時文件,然後通過原子性rename系統調用將臨時文件重命名為RDB文件;當然,Redis的RDB文件也是Redis主從同步內部實現中的一環,使用od -c命令查看rdb文件內容,可以看到保存的實際是數據本身。
[www@xxxx]$ od -c dump.rdb
0000000 R E D I S 0 0 0 2 376 \0 \0 003 s e x
0000020 004 m a l e \0 004 n a m e 004 j a c k
0000040 377
0000041
第二種:AOF日誌
aof全稱append only file,它是一個追加寫入的日誌文件。與一般數據庫的binlog不同的是,AOF文件是可識別的純文本,它的內容就是一個個的Redis標準命令。aof記錄是的寫redis操作的命令集合,而rdb是redis寫操作的數據集合。
redis 127.0.0.1:6379> config get appendonly
1) "appendonly"
2) "no"
設置為yes
redis 127.0.0.1:6379> config set appendonly yes
那麼執行save/bgsave,就會生成appendonly.aof文件
查看aof文件內容,使用od -c appendonly.aof,可以看到內容是set命令:
*2
$6
SELECT
$1
0
*3
$3
set
$3
sex
$4
male
*3
$3
set
$4
name
$4
jack
AOF重寫
如果每條寫命令都生成一條日誌,那麼AOF文件會很大,所以Redis提供了一個功能,AOF rewrite。其功能是重新生成一份AOF文件,新的AOF文件中一條記錄的操作只會有一次,而不像一份老文件那樣,可能記錄了對同一個值的多次操作。其生成過程和RDB類似,也是fork一個進程,直接遍歷數據,寫入新的AOF臨時文件。在寫入新文件的過程中,所有的寫操作日誌還是會寫到原來老的AOF文件中,同時還會記錄在內存緩衝區中。當重完操作完成後,會將所有緩衝區中的日誌一次性寫入到臨時文件中。然後調用原子性的rename命令用新的AOF文件取代老的AOF文件。
因此,RDB和AOF操作都是順序IO操作,性能都很高。而同時在通過RDB文件或者AOF日誌進行數據庫恢復的時候,也是順序的讀取數據加載到內存中。所以也不會造成磁盤的隨機讀。
參考文檔:
https://redis.io/topics/config
https://redis.io/topics/persistence