redis實現持久化


一: 持久化

  1. 什么是持久化

  redis的所有數據保存在內存中, 對數據的更新將異步的保存到硬盤中

  2. 實現持久化的方式

  快照: 某時某刻數據的一個完成備份

     mysql的Dump

    redis的RDB

  寫日志: 任何操作記錄到日志, 要恢復數據, 只要把日志重新走一片即可

    mysql的Binlog

    redis的AOF

二: RDB

  1.觸發機制的主要三種方式

'''
save(同步)
1 客戶端執行save命令----》redis服務端----》同步創建RDB二進制文件
2 會造成redis的阻塞(數據量非常大的時候)
3 文件策略:如果老的RDB存在,會替換老的
4 復雜度 o(n)
'''

'''
bgsave(異步,Backgroud saving started)

1 客戶端執行save命令----》redis服務端----》異步創建RDB二進制文件(fork函數生成一個子進程(fork會阻塞reids),執行createRDB,執行成功,返回給reids消息)
2 此時訪問redis,會正常響應客戶端
3 文件策略:跟save相同,如果老的RDB存在,會替換老的
4 復雜度 o(n)
'''

'''
自動(通過配置)
配置   seconds   changes
save   900        1
save   300        10
save   60         10000
如果60s中改變了1w條數據,自動生成rdb
如果300s中改變了10條數據,自動生成rdb
如果900s中改變了1條數據,自動生成rdb

以上三條符合任意一條,就自動生成rdb,內部使用bgsave
'''

#配置:
save 900 1 #配置一條
save 300 10 #配置一條
save 60 10000 #配置一條
dbfilename dump.rdb  #rdb文件的名字,默認為dump.rdb
dir ./ #rdb文件存在當前目錄

stop-writes-on-bgsave-error yes #如果bgsave出現錯誤,是否停止寫入,默認為yes
rdbcompression yes #采用壓縮格式
rdbchecksum yes #是否對rdb文件進行校驗和檢驗

#最佳配置
save 900 1 
save 300 10 
save 60 10000 
dbfilename dump-${port}.rdb  #以端口號作為文件名,可能一台機器上很多reids,不會亂
dir /bigdiskpath #保存路徑放到一個大硬盤位置目錄
stop-writes-on-bgsave-error yes #出現錯誤停止
rdbcompression yes #壓縮
rdbchecksum yes #校驗

 

  2. 觸發機制

1 全量復制 #沒有執行save和bgsave沒有添加rdb策略,還會生成rdb文件,如果開啟主從復制,主會自動生成rdb
2 debug reload #debug級別的重啟,不會將內存中的數據清空
3 shutdown save#關閉會出發rdb的生成

 

三: AOF

  1. RDB問題

  耗時, 耗性能

  不可控, 可能會丟失數據

  2. AOF介紹

  客戶端每寫入一條命令, 都會記錄一條日志, 放到日志文件中, 如果出現宕機, 可以將數據恢復

  3. AOF的三種策略

  日志不是直接寫到硬盤上, 而是先放到緩沖區, 緩沖區根據一些策略, 寫到硬盤上

  always:  redis>>寫命令刷新緩沖區>>每條命令fsync到硬盤>>AOF文件

  everysec(默認值):  redis>>寫命令刷新緩沖區>>每秒把緩沖區fsync到硬盤>>AOF文件

  no:  redis>>寫命令刷新緩沖區>>操作系統決定, 緩沖區fsync到硬盤>>AOF文件

命令 always everysec no
優點 不丟失數據 每秒一次fsync,丟失1秒數據 不用管
缺點 IO開銷大,一般的sata盤只有幾百TPS 丟1秒數據 不可控

 

 

 

  4. AOF重寫

  隨着命令的逐步寫入,並發量的變大, AOF文件會越來越大,通過AOF重寫來解決該問題

  本質就是把過期的, 無用的, 重復的, 可以優化的命令, 來優化, 這樣可以減少磁盤占用量, 加速恢復速度

原生AOF AOF重寫

set hello world

set hello java

set hello hehe

incr counter

incr counter

rpush mylist a

rpush mylist b

rpush mylist c

過期數據

set hello hehe

set counter 2

rpush mylist a b c

  4.1. 實現方式

  bgrewriteaof: 客戶端向服務端發送bgrewriteaof命令, 服務端會起一個fork進程, 完成AOF重新

 

  5. AOF配置

appendonly yes #將該選項設置為yes,打開
appendfilename "appendonly-${port}.aof" #文件保存的名字
appendfsync everysec #采用第二種策略
dir /bigdiskpath #存放的路徑
no-appendfsync-on-rewrite yes #在aof重寫的時候,是否要做aof的append操作,因為aof重寫消耗性能,磁盤消耗,正常aof寫磁盤有一定的沖突,這段期間的數據,允許丟失


免責聲明!

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



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