redis持久化存儲

redis持久化存儲

redis多被用於緩存和消息中間件,當被用做緩存時,數據的讀寫都是在內存中進行的,而內存一旦在主機斷電或者主機重啓時裏面的數據將被清空,爲保證數據不被丟失,redis爲咱們提供兩種數據持久化存儲方式:RDB,AOF。redis

RDB持久化存儲

RDB持久化是按配置文件中指定的時間間隔,每隔一段時間將當前進程生成數據保存到硬盤名爲xx.rdb的二進制文件中。咱們也能夠手動使用save或者bgsave命令,將新生成的數據手動保存到硬盤的xx.rdb二進制文件中。數據庫

save命令:使用save命令要注意,它會阻塞當前redis服務器,直到RDB將數據所有保存到xx.rdb文件中爲止,若是是線上環境不建議使用該命令。vim

使用save命令RDB存儲過程以下:緩存

  • 一、用戶執行save命令觸發RDB存儲。
  • 二、redis主進程執行RDB存儲,程序當前處於阻塞狀態。
  • 三、拷貝xx.rdb到一個臨時文件中。
  • 四、將新增的數據寫入到xx.rdb的臨時文件中。
  • 五、將xx.rdb的臨時文件覆蓋原來的xx.rdb文件。
  • 六、RDB存儲結束,響應其它用戶請求。

bgsave命令:redis進程會建立一個子進程,RDB的存儲過程是由子進程來負責完成的,完成後自動退出子進程,阻塞只發生在建立子進程這個階段,所以時間很短,不會影響主進程。服務器

使用save命令RDB存儲過程以下:app

  • 一、用戶執行bgsave命令觸發RDB存儲。
  • 二、redis主進程先檢查當前是否有子進程,若是當前有子進程將不會執行本次操做。若是沒有子進程,建立子進程。
  • 三、子進程執行RDB存儲,主進程響應用戶請求。
  • 四、子進程拷貝xx.rdb到一個臨時文件中。
  • 五、子進程將新增的數據寫入到xx.rdb的臨時文件中。
  • 六、子進程將xx.rdb的臨時文件覆蓋原來的xx.rdb文件。
  • 七、RDB存儲結束,子進程退出。

AOF持久化存儲

AOF(append only file 僅追加模式):它是以寫日誌的方式,將每次寫命令追加到xx.aof文件中,當設備斷電或重啓時,redis server會執行xx.aof文件中記錄的命令,經過此種方式實現恢復數據的目的。async

AOF持久化存儲過程以下:性能

一、全部寫入命令會追加到aof_buf的緩衝區中。
二、AOF根據配置文件中的策略向硬盤的xx.aof文件中追加命令。spa

對比RDB和AOF操作系統

一、RDB是以二進制的方式將數據保存到文件中,AOF是以文本的形式將數據保存在文件中,所以AOF生成的文件會比RDB生成的文件要大的多。
二、RDB是redis server經過子進程來執行持久化存儲的,而且RDB是以全量的方式進行保存,所以執行RDB的時間間隔不宜太頻繁,不然會影響性能,這樣便存在一個空檔期,當在這個空檔期發生斷電或者系統重啓時會出現丟失數據的狀況。AOF當有寫入時,將寫入的命令記錄到xx.aof文件中,所以它能更好的保證數據不丟失。
三、數據恢復:RDB的方式redis server直接讀取xx.rdb文件到內存中,AOF的方式redis server讀取xx.aof文件,經過執行文件中的命令的方式來實現數據恢復,所以它的數據恢復速度相比於RDB的方式要慢。

RDB存儲實例

因爲是演示,這裏的配置文件也就進行了簡單設置,個人配置文件內容以下:

# 安裝redis
[root@zabbix-server ~]# wget -P /opt/source/ http://download.redis.io/releases/redis-5.0.4.tar.gz
[root@zabbix-server ~]# tar -zxvf /opt/source/redis-5.0.4.tar.gz -C /opt/
[root@zabbix-server ~]# cd /opt/redis-5.0.4/
[root@zabbix-server redis-5.0.4]# make && make install  //默認在/usr/local/bin因此就不用咱們設置環境變量了

# 建立工做目錄
[root@zabbix-server ~]# mkdir /opt/redis-5.0.4/redis_config/  # 存放配置文件的目錄
[root@zabbix-server ~]# mkdir /opt/redis-5.0.4/data/  # 日誌,RDB,AOF等數據的存儲目錄

# 自定義配置文件
[root@zabbix-server ~]# vim /opt/redis-5.0.4/redis_config/rdb_config.conf 
bind 192.168.10.100    # 本機地址
port 9000              # 綁定端口
daemonize yes          # 後臺運行
dir /opt/redis-5.0.4/data/  # redis數據存放的目錄
dbfilename rdb_data.rdb     # RDB文件的名字
# 格式是:save <seconds> <changes> ,含義是在 seconds 秒以後至少有 changes個keys 發生改變則保存一次
save 900 1  # 900秒後若是有一個KEY發生了變化觸發RDB
save 300 10
save 60 10000

驗證配置

運行redis服務

[root@zabbix-server ~]# redis-server /opt/redis-5.0.4/redis_config/rdb_config.conf

若是服務運行成功你會看到以下:

登陸redis數據庫,並寫入數據。

[root@zabbix-server ~]# redis-cli -h 192.168.10.100 -p 9000  # 登陸redis
192.168.10.100:9000> ping  # 檢測鏈接 
PONG
192.168.10.100:9000> set name XiaoMing  # 向數據庫中添加數據
OK
192.168.10.100:9000> set age 12
OK
192.168.10.100:9000> keys *             # 查看添加後的數據
1) "age"
2) "name"
192.168.10.100:9000> get name
"XiaoMing"
192.168.10.100:9000> get age
"12"
192.168.10.100:9000> save   # 手動觸發RDB
OK
192.168.10.100:9000> 

使用kill結束redis server

[root@zabbix-server ~]# kill -9 redis server的PID

若是執行成功你會看到以下:

驗證 一: 到/opt/redis-5.0.4/data/目錄下查看是否生成了rdb_data.rdb 文件

驗證 二:從新運行redis server服務,驗證數據是否丟失

到此RDB持久化存儲就簡單介紹到這裏,關於RDB持久化存儲須要注意的就是配置文件中的save那個選項。

[root@zabbix-server ~]# vim /opt/redis-5.0.4/redis_config/rdb_config.conf 
bind 192.168.10.100    # 本機地址
port 9000              # 綁定端口
daemonize yes          # 後臺運行
dir /opt/redis-5.0.4/data/  # redis數據存放的目錄
dbfilename rdb_data.rdb     # RDB文件的名字
# 格式是:save <seconds> <changes> ,含義是在 seconds 秒以後至少有 changes個keys 發生改變則保存一次,這個是redis默認給的值,咱們能夠根據具體實際狀況自行調整
save 900 1  # 900秒後若是有一個KEY發生了變化觸發RDB
save 300 10
save 60 10000

AOF存儲實例

個人配置文件內如以下:

[root@zabbix-server ~]# vim /opt/redis-5.0.4/redis_config/aof_config.conf
bind 192.168.10.100   # 綁定IP地址
port 9001             # 綁定端口
daemonize yes
dir /opt/redis-5.0.4/data/   # redis 的工做目錄
appendfilename aof_data.aof  # AOF文件的名字
appendonly yes               # 啓用AOF持久化存儲
appendfsync everysec         # 可選值always、everysec和no
# 設置爲always時,每次收到命令寫入時,都會調用fsync(Linux爲調用fdatasync)強制將數據寫入到硬盤的xx.aof文件中,
# 此時會出現阻塞直到數據被徹底同步到硬盤的xx.aof中,該模式下能夠很好的保證數據不被丟失,但會嚴重影響redis服務器的性能,不多用。
# 設置爲everysec時,每次收到命令寫入時,先調用系統write將數據寫入到系統緩衝區中,由單獨的線程每秒調用一次fsync(Linux爲調用fdatasync)將數據同步到xx.aof文件中,
# 若是系統在線程尚未調用fsync時會出現數據丟失,推薦使用該模式,該模式是在性能和存儲上選用折中的方式,推薦使用。
# 設置爲no時,每次收到命令寫入時,先調用系統write將數據寫入到系統緩衝區中,後由操做系統負責將緩衝區中的數據寫入到xx.aof文件中,
# 這個週期是在30秒之內,該模式是性能最好,可是不能很好的保證數據不被丟失,不推薦使用。

# AOF是向xx.aof文件追加寫命令,所以文件會愈來愈大,而且有可能會有重複的命令,所以須要對xx.aof文件進行重寫去掉重複的命令,來減少文件的體積。
auto-aof-rewrite-min-size 64mb   # AOF文件初始最小值
auto-aof-rewrite-percentage 100  # 當前AOF文件大小是上一次重寫後的AOF文件大小的2倍後,進行重寫

啓動redis 服務

[root@zabbix-server ~]# redis-server /opt/redis-5.0.4/redis_config/aof_config.conf 

登陸redis寫入數據

[root@zabbix-server ~]# redis-cli -h 192.168.10.100 -p 9001  # 登陸redis
192.168.10.100:9001> ping   # 查看連接狀態
PONG
192.168.10.100:9001> keys *  # 查看數據庫中的鍵
(empty list or set)
192.168.10.100:9001> set test HelloWorld  # 添加數據
OK
192.168.10.100:9001> set damo HaHaHa
OK
192.168.10.100:9001> keys *  # 查看添加後的數據
1) "test"
2) "damo"
192.168.10.100:9001> get test
"HelloWorld"
192.168.10.100:9001> get damo
"HaHaHa"
192.168.10.100:9001> 

結束redis服務

[root@zabbix-server ~]# kill -9  AOF的進程PID # 殺掉AOF的redis服務

執行完成後你會看到以下:

驗證 一:在/opt/redis-5.0.4/data/下查看是否存在aof_data.aof

驗證 二:登陸數據庫查看數據是否丟失

啓動redis服務

[root@zabbix-server ~]# redis-server /opt/redis-5.0.4/redis_config/aof_config.conf 

登陸數據庫查看結果

 到此redis持久化存儲就簡單介紹到這裏,關於AOF還有不少配置選項這裏就不一一列舉了,感興趣的朋友能夠查看配置文件根據具體狀況瞭解更多內容。

相關文章
相關標籤/搜索