1)什么是持久化
redis所有數據保存在內存中, 對數據的更新將異步地保存到磁盤上
2)Redis持久化的實現方式
* 快照方式
Redis RDB
* 寫日志
Redis AOF
3)RDB
* 什么是RDB

* 觸發機制-主要三種方式
第一種:save同步
當客戶端連接到redis服務器,執行save命令,此時redis會被阻塞,其他客戶端的請求就會被阻塞咯,等待save命令執行完畢后
第二種:bgsave異步
當客戶端連接redis服務器,執行bgsave命令,此時redis主進程會通過系統調用fork一個子進程出來,阻塞發生在fork階段,之后父進程還可以正常接收請求,有子進程創建生成RDB文件,成功后,通知redis主進程
第三種: 自動配置
save 900 1
save 300 10
save 60 10000
通過在配置文件redis.conf中配置,滿足任意一個條件,就觸發bgsave命令,通過異步地方式創建RDB文件(二進制)

還有其他方式也會觸發生成RDB文件
比如shutdown(關閉redis),debug reload
總結:
RDB是redis內存到硬盤的快照
save通常會阻塞客戶端命令
bgsave不會阻塞客戶端命令,但是會fork新進程
編寫redis.conf文件save命令,滿足任意一個條件就會觸發執行
比如shutdown,debug reload也會觸發生成RDB
4)AOF
* RDB存在的問題
第一:耗時
如果數據量大,耗時時間更長,通過bgsave模式,需要執行fork(),消耗內存資源,磁盤I/O性能
第二:不可靠,會丟失部分數據
比如在上午9點執行了多個寫命令,在9點20分鐘滿足RDB自動創建的條件,此時生成一份RDB文件,然后9點22分鐘再次執行了很多寫命令,在9點30分鐘,redis機器故障,此時還沒有觸發條件也沒有手動save或bgsave,此時從9點20到9點30之間的keys就會被丟失
* 什么是AOF


* AOF三種策略
# appendfsync always
appendfsync everysec (每秒鐘寫一次)
# appendfsync no
第一種:awlays
redis寫命令刷新到緩沖區,然后實時每條命令fsync到硬盤
第二種:everysec
redis寫命令刷新到緩沖區,然后每秒把緩沖區的命令fsync到硬盤到
第三種: no
redis寫命令刷新到緩沖區,然后又OS系統覺得fsync到硬盤,一般不用
* AOF重寫
因為 AOF 的運作方式是不斷地將命令追加到文件的末尾, 所以隨著寫入命令的不斷增加, AOF 文件的體積也會變得越來越大,執行 BGREWRITEAOF 命令, Redis 將生成一個新的 AOF 文件, 這個文件包含重建當前數據集所需的最少命令。
AOF重寫的所用:
減少硬盤占有量和加速恢復速度
AOF重寫實現的兩種方式
第一種:通過bgrewriteaof
client連接redis執行bgrewriteaof命令,redis立即返回ok,然后redis主進程通過fork()生成子進程,由子進程完成AOF重寫
第二種:通過aof重寫配置

重寫過程:
1)redis主進程通過fork創建子進程
2)子進程根據redis內存中的數據創建數據庫重建命令序列與臨時文件中
3)父進程繼續執行client的請求,并會把這些請求中的寫操作追加到原來AOF文件,額外,這些新的寫請求,也會放到一個緩存隊列中
4)當子進程重寫完成,會通知父進程,父進程把緩沖的命令追加到臨時文件中
5) 父進程用臨時文件替換老的AOF文件
配置如下
~~~
appendonly yes
# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"
# appendfsync always
appendfsync everysec (每秒鐘寫一次)
# appendfsync no
no-appendfsync-on-rewrite no(yes)
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
dir /var/lib/redis
~~~
[root@huancun01 redis]# ll
total 8
-rw-r--r--. 1 redis redis 1599 Feb 26 16:27 appendonly.aof
-rw-r--r--. 1 redis redis 391 Feb 26 16:34 dump.rdb