Redis持久化

NoSQL Redis 技術 十號火星人 2017-06-12

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

相關推薦

推薦中...