一: 持久化
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寫磁盤有一定的沖突,這段期間的數據,允許丟失