面試題百日百刷-Redis篇(三)
鎖屏面試題百日百刷,每個工作日堅持更新面試題。鎖屏面試題app、小程式現已上線,官網地址:https://www.demosoftware.cc/#/introductionPage。已收錄了每日更新的面試題的所有內容,還包含特色的解鎖螢幕複習面試題、每日程式設計題目郵件推送等功能。讓你在面試中先人一步,吊打面試官!接下來的是今日的面試題:
====Redis中Pipeline有什麼好處,為什麼要用pipeline?
可以將多次 IO 往返的時間縮減為一次,前提是 pipeline 執行的指令之間沒有因果相關性。使用redis-benchmark 進行壓測的時候可以發現影響 redis 的 QPS
====是否使用過 Redis 叢集,叢集的原理是什麼?
1. 、Redis Sentinal 著眼於高可用, 在 master 宕機時會自動將 slave 提升為master, 繼續提供服務。
2. 、Redis Cluster 著眼於擴充套件性, 在單個 redis 記憶體不足時, 使用 Cluster 進行分片儲存。
====Redis 叢集方案什麼情況下會導致整個叢集不可用?
有 A,B,C 三個節點的叢集,在沒有複製模型的情況下,如果節點 B 失敗了,那麼整個叢集就會以為缺少 5501-11000 這個範圍的槽而不可用。
====Redis 支援的Java 客戶端都有哪些?官方推薦用哪個?
Redisson、Jedis、lettuce 等等, 官方推薦使用 Redisson。
====Jedis 與 Redisson 對比有什麼優缺點?
Jedis 是 Redis 的 Java 實現的客戶端, 其 API 提供了比較全面的 Redis 命令的支援;Redisson 實現了分散式和可擴充套件的 Java 資料結構,和 Jedis 相比,功能較為簡單, 不支援字串操作, 不支援排序、事務、管道、分割槽等 Redis 特性。Redisson 的宗旨是促進使用者對 Redis 的關注分離,從而讓使用者能夠將精力更集中地放在處理業務邏輯上。
====Redis 如何設定密碼及驗證密碼?
設定密碼: config set requirepass 123456 授權密碼:auth 123456
====說說 Redis 雜湊槽的概念?
Redis 叢集沒有使用一致性 hash,而是引入了雜湊槽的概念, Redis 叢集有2的14次方(16384)個雜湊槽,每個key 通過 CRC16 校驗後對 16384 取模來決定放置哪個槽, 叢集的每個節點負責一部分 hash 槽。
====Redis用了雜湊槽的概念,而沒有用一致性雜湊演算法,這樣做的原因是為什麼呢?
Redis Cluster是自己做的crc16的簡單hash演算法,沒有用一致性hash。Redis的作者認為它的crc16(key) mod 16384的效果已經不錯了,雖然沒有一致性hash靈活,但實現很簡單,節點增刪時處理起來也很方便。
====Redis 叢集的主從複製模型是怎樣的?
為了使在部分節點失敗或者大部分節點無法通訊的情況下叢集仍然可用,所以叢集使用了主從複製模型,每個節點都會有 N-1 個複製品。
====Redis 叢集會有寫操作丟失嗎?為什麼?
Redis 並不能保證資料的強一致性,這意味這在實際中叢集在特定的條件下可能會丟失寫操作。
====Redis 叢集之間是如何複製的?
非同步複製
====Redis 叢集最大節點個數是多少?
2的14次方(16384)
====Redis 叢集如何選擇資料庫?
Redis 叢集目前無法做資料庫選擇, 預設在 0 資料庫。
====說一說Redis中的事務?
1、Redis 事務可以一次執行多個命令, 並且帶有以下三個重要的保證:
1)批量操作在傳送 EXEC 命令前被放入佇列快取。
2)收到 EXEC 命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然被執行。
3)在事務執行過程,其他客戶端提交的命令請求不會插入到事務執行命令序列中。
2、一個事務從開始到執行會經歷以下三個階段:
開始事務。
命令入隊。
執行事務。
3、redis中相關的指令有:
DISCARD
取消事務,放棄執行事務塊內的所有命令。
EXEC
執行所有事務塊內的命令。
MULTI
標記一個事務塊的開始。
UNWATCH
取消 WATCH 命令對所有 key 的監視。
WATCH key [key ...]
監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷。
4、單個 Redis 命令的執行是原子性的,但 Redis 沒有在事務上增加任何維持原子性的機制,所以 Redis 事務的執行並不是原子性的。
事務可以理解為一個打包的批量執行指令碼,但批量指令並非原子化的操作,中間某條指令的失敗不會導致前面已做指令的回滾,也不會造成後續的指令不做。
redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) OK
3) OK
====Redis key 的過期時間和永久有效分別怎麼設定?
使用EXPIRE 和 PERSIST 命令。
====Redis 如何做記憶體優化?
儘可能使用散列表( hashes), 散列表( 是說散列表裡面儲存的數少) 使用的記憶體非常小, 所以你應該儘可能的將你的資料模型抽象到一個散列表裡面。比如你的 web 系統中有一個使用者物件, 不要為這個使用者的名稱, 姓氏, 郵箱, 密碼設定單獨的 key,而是應該把這個使用者的所有資訊儲存到一張散列表裡面.
更多面試題可關注"demo鎖屏面試題"公眾號通過小程式或App獲取面試題和學習資源