redis持久化存儲


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還有很多配置選項這里就不一一列舉了,感興趣的朋友可以查看配置文件根據具體情況了解更多內容。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM