redis 是一個基於內存的高性能 key-value數據庫,支持豐富的數據類型(String,List , Set ,Sorted Set,Hash )redis中的單個value的存儲限制是1G,比 Memcached的1MB要強大太多。
問題一:
如何保證 redis 的高並發和高可用?redis 的主從復制原理能介紹一下么?redis 的哨兵原理能介紹一下么?
面試官心理分析:
其實問這個問題,主要是考考你,redis 單機能承載多高並發?如果單機扛不住如何擴容扛更多的並發?redis 會不會掛?既然 redis 會掛那怎么保證 redis 是高可用的?
其實針對的都是項目中你肯定要考慮的一些問題,如果你沒考慮過,那確實你對生產系統中的問題思考太少。
面試題剖析:
如果你用 redis 緩存技術的話,肯定要考慮如何用 redis 來加多台機器,保證 redis 是高並發的,還有就是如何讓 redis 保證自己不是掛掉以后就直接死掉了,即 redis 高可用。
由於此節內容較多,因此,會分為兩個小節進行講解。 - redis 主從架構 - redis 基於哨兵實現高可用
redis 實現高並發主要依靠主從架構,一主多從,一般來說,很多項目其實就足夠了,單主用來寫入數據,單機幾萬 QPS,多從用來查詢數據,多個從實例可以提供每秒 10w 的 QPS。
如果想要在實現高並發的同時,容納大量的數據,那么就需要 redis 集群,使用 redis 集群之后,可以提供每秒幾十萬的讀寫並發。
redis 高可用,如果是做主從架構部署,那么加上哨兵就可以了,就可以實現,任何一個實例宕機,可以進行主備切換。
問題二:
MySQL 里有 2000w 數據,redis 中只存 20w 的數據,如何保證 redis 中的數據都是熱點數據
相關知識:redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略。redis 提供 6 種數據淘汰策略:
voltile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰
volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰
allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
no-enviction(驅逐):禁止驅逐數據
最新大廠關於Redis面試真題:
- Pipeline 有什么好處,為什么要用 pipeline?
- 是否使用過 Redis 集群,集群的原理是什么?
- Redis 集群方案什么情況下會導致整個集群不可用?
- Redis 支持的 Java 客戶端都有哪些?官方推薦用哪個?
- Jedis 與 Redisson 對比有什么優缺點?
- Redis 如何設置密碼及驗證密碼?
- 說說 Redis 哈希槽的概念?
- Redis 集群的主從復制模型是怎樣的?
- Redis 集群會有寫操作丟失嗎?為什么?
- Redis 集群之間是如何復制的?
- Redis 集群最大節點個數是多少?
- Redis 集群如何選擇數據庫?
- 怎么測試 Redis 的連通性?
- 怎么理解 Redis 事務?
- Redis 事務相關的命令有哪幾個?
- Redis key 的過期時間和永久有效分別怎么設置?
- Redis 如何做內存優化?
- Redis 回收進程如何工作的?
- 都有哪些辦法可以降低 Redis 的內存使用情況呢?
- Redis 的內存用完了會發生什么?
- 一個 Redis 實例最多能存放多少的 keys?List、Set、Sorted Set他們最多能存放多少元素?
- Redis 最適合的場景?
- 假如 Redis 里面有 1 億個 key,其中有 10w 個 key 是以某個固定的已知的前綴開頭的,如果將它們全部找出來?
- 如果有大量的 key 需要設置同一時間過期,一般需要注意什么?
- 使用過 Redis 做異步隊列么,你是怎么用的?
- 使用過 Redis 分布式鎖么,它是什么回事?