redis持久化存儲
redis多被用於緩存和消息中間件,當被用作緩存時,數據的讀寫都是在內存中進行的,而內存一旦在主機斷電或者主機重啟時里面的數據將被清空,為保證數據不被丟失,redis為我們提供兩種數據持久化存儲方式:RDB,AOF。
RDB持久化存儲
RDB持久化是按配置文件中指定的時間間隔,每隔一段時間將當前進程生成數據保存到硬盤名為xx.rdb的二進制文件中。我們也可以手動使用save或者bgsave命令,將新生成的數據手動保存到硬盤的xx.rdb二進制文件中。
save命令:使用save命令要注意,它會阻塞當前redis服務器,直到RDB將數據全部保存到xx.rdb文件中為止,如果是線上環境不建議使用該命令。
使用save命令RDB存儲過程如下:
- 1、用戶執行save命令觸發RDB存儲。
- 2、redis主進程執行RDB存儲,程序當前處於阻塞狀態。
- 3、拷貝xx.rdb到一個臨時文件中。
- 4、將新增的數據寫入到xx.rdb的臨時文件中。
- 5、將xx.rdb的臨時文件覆蓋原來的xx.rdb文件。
- 6、RDB存儲結束,響應其它用戶請求。
bgsave命令:redis進程會創建一個子進程,RDB的存儲過程是由子進程來負責完成的,完成后自動退出子進程,阻塞只發生在創建子進程這個階段,因此時間很短,不會影響主進程。
使用save命令RDB存儲過程如下:
- 1、用戶執行bgsave命令觸發RDB存儲。
- 2、redis主進程先檢查當前是否有子進程,如果當前有子進程將不會執行本次操作。如果沒有子進程,創建子進程。
- 3、子進程執行RDB存儲,主進程響應用戶請求。
- 4、子進程拷貝xx.rdb到一個臨時文件中。
- 5、子進程將新增的數據寫入到xx.rdb的臨時文件中。
- 6、子進程將xx.rdb的臨時文件覆蓋原來的xx.rdb文件。
- 7、RDB存儲結束,子進程退出。
AOF持久化存儲
AOF(append only file 僅追加模式):它是以寫日志的方式,將每次寫命令追加到xx.aof文件中,當設備斷電或重啟時,redis server會執行xx.aof文件中記錄的命令,通過此種方式實現恢復數據的目的。
AOF持久化存儲過程如下:
1、所有寫入命令會追加到aof_buf的緩沖區中。
2、AOF根據配置文件中的策略向硬盤的xx.aof文件中追加命令。
對比RDB和AOF
1、RDB是以二進制的方式將數據保存到文件中,AOF是以文本的形式將數據保存在文件中,因此AOF生成的文件會比RDB生成的文件要大的多。
2、RDB是redis server通過子進程來執行持久化存儲的,並且RDB是以全量的方式進行保存,因此執行RDB的時間間隔不宜太頻繁,否則會影響性能,這樣便存在一個空檔期,當在這個空檔期發生斷電或者系統重啟時會出現丟失數據的情況。AOF當有寫入時,將寫入的命令記錄到xx.aof文件中,因此它能更好的保證數據不丟失。
3、數據恢復: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還有很多配置選項這里就不一一列舉了,感興趣的朋友可以查看配置文件根據具體情況了解更多內容。