{eval=Array;=+count(Array);}
(1)在 Redis 實現持久化有兩種方式:AOF 日志 和 RDB 快照;
(2)AOF 日志
◆ 命令執行成功后,才記錄日志;
◆ 命令執行后進行日志記錄,不會堵塞當前的寫操作。
◆ 命令執行完,日志記錄前宕機,數據會丟失;
◆ AOF 日志在主線程中執行,有 IO 瓶頸時會對后面的操作有堵塞風險;
◆ 數據量比較大的時候,恢復很慢。
◆ 配置項(appendfsync)
◆ Always,同步寫回磁盤:每個寫命令執行完,立即同步將日志寫回磁盤;
◆ Everysec,每秒寫回磁盤:每個寫命令執行完,只是先把日志寫到 AOF 文件的內存緩沖區,每隔一秒把緩沖區中的內容寫入磁盤;
◆ No,操作系統控制的寫回磁盤:每個寫命令執行完,只是先把日志寫到 AOF 文件的內存緩沖區,由操作系統決定何時將緩沖區內容寫回磁盤。
(3)RDB 快照
◆ 和 AOF 相比較,RDB 快照記錄的是某一個時刻的數據,數據恢復是直接將 RDB 文件讀入內存,速度很快;
◆ 生成 RDB 文件的兩種方式:
◆ save:在主線程中執行,會導致阻塞;
◆ bgsave:創建一個子進程,專門用于寫入 RDB 文件,避免了主線程的阻塞,這也是 Redis RDB 文件生成的默認配置。子進程是由主線程 fork 生成的,可以共享主線程的所有內存數據。
◆ RDB 快照的間隔時間不宜設置過短,因為頻繁進行 Redis 的全量快照,會帶來性能問題:
◆ 前一個快照還沒做完,后面一個開始了,會給磁盤帶來壓力;
◆ bgsave 的子進程雖然不會阻塞主線程,但創建的過程會阻塞,頻繁創建也會帶來性能問題。
◆ 解決上面問題的一種辦法就是使用增量快照;
◆ 在 Redis 4.0 中提出了一種混合 AOF 日志和 RDB 快照的方式:
◆ RDB 快照的間隔時間可以設置比較大,就不會影響到主線程的操作;
◆ 在快照的間隔期間可以使用 AOF 日志記錄所有的操作,當下一次做全量 RDB 快照的時候,清空 AOF 日志;
◆ 通過 aof-use-rdb-preamble yes 來進行設置。
1
回答1
回答1
回答0
回答0
回答0
回答5
回答0
回答0
回答0
回答