【面試官】你說精通Redis?來講講Redis持久化
- 面試官:知道Redis持久化嗎?
- 面試官:那你說一說Redis生成RDB文件的命令是什么?
- 面試官:是你的話,你會在什么場景使用什么命令?
- 面試官:AOF文件生成呢?
- 面試官:知道AOF文件重寫嗎?
- 面試官:那照你這么說,只會保存創(chuàng)建命令,那每個鍵的創(chuàng)建只有一條命令對吧?
- 面試官:那你說說AOF重寫過程中,有新的創(chuàng)建請求進來怎么辦?
大家好,我是南哥。
一個Java學習與進階的領路人,跟著南哥我們一起Java成長。
文章目錄
- Redis持久化
- 生成RDB文件
- 兩種命令的選擇
- 生成AOF文件
- AOF重寫
- 多條命令記錄鍵值
- AOF重寫緩沖區(qū)
1. Redis持久化
面試官:知道Redis持久化嗎?
Redis本身是一個基于內存的數(shù)據(jù)庫,它提供了RDB持久化、AOF持久化兩種方式,用來將存儲在內存中的數(shù)據(jù)庫狀態(tài)保存到磁盤中。前者是保存了整個Redis數(shù)據(jù)庫狀態(tài),而后者是保存了從Redis啟動后所有執(zhí)行的寫命令。接下來我們就從這兩方面展開。
1.1 生成RDB文件
面試官:那你說一說Redis生成RDB文件的命令是什么?
觸發(fā)RDB持久化過程分為手動觸發(fā)和自動觸發(fā),手動觸發(fā)的命令有兩個,一個是SAVE
命令,一個是BGSAVE
命令,執(zhí)行命令后會在根目錄生成名為dump.rdb
的文件。
大家看下以下手動觸發(fā)的使用。
# 手動生成RDB文件指令
127.0.0.1:6379> save
OK
127.0.0.1:6379> bgsave
Background saving started
另外RDB文件是在Redis啟動時自動載入,如果把dump.rdb
文件刪除,重啟Redis后會發(fā)現(xiàn)原先的數(shù)據(jù)庫狀態(tài)都不存在了。
# 初始化
127.0.0.1:6379> set name JavaGetOffer
OK
127.0.0.1:6379> get name
"JavaGetOffer"
127.0.0.1:6379> save
OK
# 重啟Redis
127.0.0.1:6379> get name
"JavaGetOffer"
# 刪除dump.rdb,重啟Redis后name為nil
127.0.0.1:6379> get name
(nil)
1.2 兩種命令的選擇
面試官:是你的話,你會在什么場景使用什么命令?
SAVE命令會阻塞Redis服務器進程,直到RDB文件創(chuàng)建完畢為止,在服務器進程阻塞期間,服務器不能處理其他任何命令請求。
而BGSAVE命令則不進行阻塞,它會派生出一個子進程,然后由子進程負責創(chuàng)建RDB文件,服務器進程繼續(xù)處理命令請求??梢栽谏厦娴闹噶钪锌吹綀?zhí)行BGSAVE指令后,終端顯示Background saving started
。
所以如果在業(yè)務高峰期要使用進行RDB持久化,建議是使用后者,可以防止某些請求丟失了。
1.3 生成AOF文件
面試官:AOF文件生成呢?
AOF文件生成需要在Redis配置文件配置appendonly
的屬性值。
appendonly yes
重啟Redis執(zhí)行寫命令后,會生成appendonly.aof
文件。
也可以在終端手動設置appendonly
屬性值。
config set appendonly yes
2. AOF重寫
面試官:知道AOF文件重寫嗎?
AOF文件是AOF持久化的產物,AOF持久化通過保存服務器所有執(zhí)行的寫命令來記錄數(shù)據(jù)庫狀態(tài)。而AOF文件重寫主要是為了解決AOF文件體積膨脹的問題。
對于一個鍵值對,AOF舊的文件會保存數(shù)十條對該鍵值對的修改命令,這樣浪費了大量內存空間。
而AOF文件重寫可以創(chuàng)建一個新的AOF文件來替代現(xiàn)有的AOF文件,新舊兩個AOF文件所保存的數(shù)據(jù)庫狀態(tài)相同,但新AOF文件不會包含任何浪費空間的冗余命令,使得新的AOF文件體積很小。
簡單來說,就是新的AOF文件只會保存鍵值對的最終狀態(tài)的創(chuàng)建命令。
2.1 多條命令記錄鍵值
面試官:那照你這么說,只會保存創(chuàng)建命令,那每個鍵的創(chuàng)建只有一條命令對吧?
如果每個鍵的創(chuàng)建只有一條命令,在執(zhí)行命令時可能會造成客戶端輸入緩沖區(qū)溢出。
Redis重寫程序在處理列表、哈希表、集合、有序集合這四種可能會帶有多個元素的鍵時,如果元素的數(shù)量超過了redis.h/REDIS_AOF_REWRITE_ITEMS_PER_CMD
常量的值,那么重寫程序將使用多條命令來記錄鍵的值,而不單單只使用一條命令。
2.2 AOF重寫緩沖區(qū)
面試官:那你說說AOF重寫過程中,有新的創(chuàng)建請求進來怎么辦?
可以把這些新的創(chuàng)建請求寫入到一個緩沖區(qū)里。
Redis服務器會維護一個AOF重寫緩沖區(qū),該緩沖區(qū)會在子進程創(chuàng)建新AOF文件期間,記錄服務器執(zhí)行的所有寫命令。
等新的AOF文件創(chuàng)建完成,Redis服務器會將重寫緩沖區(qū)中的所有內容追加到新AOF文件的末尾,從而保證兩個新舊AOF文件狀態(tài)一致。
最后,評論區(qū)說它好孤獨的?。∷枰銈兊耐虏?。關于Java技術、牛友的迷茫、簡歷等問題來評論區(qū)和南哥、牛油們一起吐槽分析分析。
#Redis##Java##面試##大廠面試#創(chuàng)作不易,不妨點贊、收藏、關注支持一下,各位的支持就是我創(chuàng)作的最大動力????
??以面試官面試的形式,涵蓋了你怒懟大廠面試官、拿下大廠面試所需掌握的核心知識、面試重點! ??相信一定對你順利通關面試、拿到理想Offer有所幫助! ??花費大量精力去制作本專欄,創(chuàng)作不易,各位的支持就是我創(chuàng)作的最大動力!