網際網路公司面試必問的Redis題目
Redis 官網:
持久化就是把記憶體的資料寫到磁碟中去,防止服務宕機了記憶體資料丟失。 Redis 提供了兩種持久化方式:RDB(預設) 和AOF RDB:


內容是redis通訊協議(RESP )格式的命令文字儲存。 比較:
- aof檔案比rdb更新頻率高,優先使用aof還原資料。
- aof比rdb更安全也更大
- rdb效能比aof好
- 如果兩個都配了優先載入AOF
剛剛上面你有提到redis通訊協議(RESP ),能解釋下什麼是RESP?有什麼特點?
(可以看到很多面試其實都是連環炮,面試官其實在等著你回答到這個點,如果你答上了對你的評價就又加了一分)

RESP 是redis客戶端和服務端之前使用的一種通訊協議; RESP 的特點: 實現簡單、快速解析、可讀性好
- For Simple Strings the first byte of the reply is "+" 回覆
- For Errors the first byte of the reply is "-" 錯誤
- For Integers the first byte of the reply is ":" 整數
- For Bulk Strings the first byte of the reply is "$" 字串
- For Arrays the first byte of the reply is "*" 陣列
Redis 有哪些架構模式?講講各自的特點
單機版

特點:簡單 問題: 1、記憶體容量有限 2、處理能力有限 3、無法高可用。
主從複製

Redis 的複製(replication)功能允許使用者根據一個 Redis 伺服器來建立任意多個該伺服器的複製品,其中被複制的伺服器為主伺服器(master),而通過複製創建出來的伺服器複製品則為從伺服器(slave)。 只要主從伺服器之間的網路連線正常,主從伺服器兩者會具有相同的資料,主伺服器就會一直將發生在自己身上的資料更新同步 給從伺服器,從而一直保證主從伺服器的資料相同。 特點:
- master/slave 角色
- master/slave 資料相同
- 降低 master 讀壓力在轉交從庫
問題:
- 無法保證高可用
- 沒有解決 master 寫的壓力
哨兵

Redis sentinel 是一個分散式系統中監控 redis 主從伺服器,並在主伺服器下線時自動進行故障轉移。其中三個特性:
監控(Monitoring): Sentinel 會不斷地檢查你的主伺服器和從伺服器是否運作正常。
提醒(Notification): 當被監控的某個 Redis 伺服器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程式傳送通知。
自動故障遷移(Automatic failover): 當一個主伺服器不能正常工作時, Sentinel 會開始一次自動故障遷移操作。
特點:
- 保證高可用
- 監控各個節點
- 自動故障遷移
缺點:主從模式,切換需要時間丟資料
沒有解決 master 寫的壓力
叢集(proxy 型):

Twemproxy 是一個 Twitter 開源的一個 redis 和 memcache 快速/輕量級代理伺服器; Twemproxy 是一個快速的單執行緒代理程式,支援 Memcached ASCII 協議和 redis 協議。
特點:
- 多種 hash 演算法:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins
- 支援失敗節點自動刪除
- 後端 Sharding 分片邏輯對業務透明,業務方的讀寫方式和操作單個 Redis 一致
缺點:
- 增加了新的 proxy,需要維護其高可用。
- failover 邏輯需要自己實現,其本身不能支援故障的自動轉移可擴充套件性差,進行擴縮容都需要手動干預
叢集(直連型):

從redis 3.0之後版本支援redis-cluster叢集,Redis-Cluster採用無中心結構,每個節點儲存資料和整個叢集狀態,每個節點都和其他所有節點連線。
特點:
- 無中心架構(不存在哪個節點影響效能瓶頸),少了 proxy 層。
- 資料按照 slot 儲存分佈在多個節點,節點間資料共享,可動態調整資料分佈。
- 可擴充套件性,可線性擴充套件到 1000 個節點,節點可動態新增或刪除。
- 高可用性,部分節點不可用時,叢集仍可用。通過增加 Slave 做備份資料副本
- 實現故障自動 failover,節點之間通過 gossip 協議交換狀態資訊,用投票機制完成 Slave到 Master的角色提升。
缺點:
- 資源隔離性較差,容易出現相互影響的情況。
- 資料通過非同步複製,不保證資料的強一致性
什麼是一致性雜湊演算法?什麼是雜湊槽?
這兩個問題篇幅過長 網上找了兩個解鎖的不錯的文章
ofollow,noindex">www.cnblogs.com/lpfuture/p/…
Redis是基於CAP理論的,什麼是CAP理論?
可以參考我的上一篇文章。
Redis常用命令?
- Keys pattern 表示區配所有 以bit開頭的 檢視Exists key是否存在
- Set 設定 key 對應的值為 string 型別的 value。
- setnx 設定 key 對應的值為 string 型別的 value。如果 key 已經存在,返回 0,nx 是 not exist 的意思。 刪除某個key 第一次返回1 刪除了 第二次返回0
- Expire 設定過期時間(單位秒)
- TTL 檢視剩下多少時間
- Setex 設定 key 對應的值為 string 型別的 value,並指定此鍵值對應的有效期。
- Mset 一次設定多個 key 的值,成功返回 ok 表示所有的值都設定了,失敗返回 0 表示沒有任何值被設定。
- Getset 設定 key 的值,並返回 key 的舊值。
- Mget 一次獲取多個 key 的值,如果對應 key 不存在,則對應返回 nil。
- Incr 對 key 的值做加加操作,並返回新的值。注意 incr 一個不是 int 的 value 會返回錯誤,incr 一個不存在的 key,則設定 key 為 1
- incrby 同 incr 類似,加指定值 ,key 不存在時候會設定 key,並認為原來的 value 是 0
- Decr 對 key 的值做的是減減操作,decr 一個不存在 key,則設定 key 為-1
- Decrby 同 decr,減指定值。
- Append 給指定 key 的字串值追加 value,返回新字串值的長度。
- Strlen 取指定 key 的 value 值的長度。
- persist 取消過期時間
- Select 選擇資料庫
- Randomkey 隨機返回一個key
- Rename 重新命名
- Type 返回資料型別
使用過Redis分散式鎖麼,它是怎麼實現的?
先拿setnx來爭搶鎖,搶到之後,再用expire給鎖加一個過期時間防止鎖忘記了釋放。 如果在setnx之後執行expire之前程序意外crash或者要重啟維護了,那會怎麼樣? set指令有非常複雜的引數,這個應該是可以同時把setnx和expire合成一條指令來用的!
使用過Redis做非同步佇列麼,你是怎麼用的?有什麼缺點?
一般使用list結構作為佇列,rpush生產訊息,lpop消費訊息。當lpop沒有訊息的時候,要適當sleep一會再重試。 缺點: 在消費者下線的情況下,生產的訊息會丟失,得使用專業的訊息佇列如rabbitmq等。 能不能生產一次消費多次呢? 使用pub/sub主題訂閱者模式,可以實現1:N的訊息佇列。
什麼是快取穿透?如何避免?什麼是快取雪崩?何如避免?
快取穿透一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢(比如DB)。一些惡意的請求會故意查詢不存在的key,請求量很大,就會對後端系統造成很大的壓力。這就叫做快取穿透。 如何避免? 1:對查詢結果為空的情況也進行快取,快取時間設定短一點,或者該key對應的資料insert了之後清理快取。 2:對一定不存在的key進行過濾。可以把所有的可能存在的key放到一個大的Bitmap中,查詢時通過該bitmap過濾。 快取雪崩 當快取伺服器重啟或者大量快取集中在某一個時間段失效,這樣在失效的時候,會給後端系統帶來很大壓力。導致系統崩潰。 如何避免?
1:在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許一個執行緒查詢資料和寫快取,其他執行緒等待。 2:做二級快取,A1為原始快取,A2為拷貝快取,A1失效時,可以訪問A2,A1快取失效時間設定為短期,A2設定為長期 3:不同的key,設定不同的過期時間,讓快取失效的時間點儘量均勻
內容比較多整理一個腦圖,方便大家記憶。

好了,祝大家面試順利!