Redis面试经典问题
Redis面試經典問題
基礎
1)Redis中的基本數據類型、應用場景以及它們的底層
2)高并發下緩存帶來的問題,緩存穿透,緩存擊穿、緩存雪崩
3)Redis為什么那么快
4)Redis事務
5)redis的過期策略
6)過期策略以及內存淘汰機制的區別
集群相關
7)Redis主從復制的過程
8)Redis主從、哨兵、集群各有什么不同
9)redis主從節點是長連接還是短連接?
10)怎么判斷redis某個節點是否正常工作
11)過期key如何處理
12)redis是同步復制還是異步復制
分布式鎖
13)redis除了做緩存,還可以用來做什么?
14)redis鎖如何保證任何時刻有且只有一個線程持有這個鎖?
15)如何保證分布式鎖不產生死鎖?
16)如何防止釋放別的線程鎖?
17)分布式鎖選用redis與Zookeeper的區別
18)什么是 redis 熱 key,以及解決方案
19)什么是 redis 大 key
20)在1024這個日子,愿打工人早日找到心儀的工作
基礎
1)Redis中的基本數據類型、應用場景以及它們的底層
Redis中有五種基本的數據類型分別是string、list、set、zset、hash
應用場景:string我們常用的是緩存,list可以存放集合的數據,也可以用于隊列;set可以用于數據去重;zset是有序的集合可以用于排行榜,hast可以存儲對象數據。初次還可以用于計數器、秒殺利用Redis中的原子性(INCR、DECR),分布式系統的session管理等
底層:動態字符串,ziplist,quicklist,hash 跳表
String的底層是動態字符串,類似于Java中的ArrayList,可以預分配冗余空間以及擴容,注意String的最大長度是512.
list的底層是一個雙向鏈表,頭部尾部都可以存儲數據。數據結構quickList,當列表元素較少是會分配一塊連續的內存空間ziplist,數據較多是會變成quickList。多個ziplist組成一個quickList
Set底層是一個value為null的hash表
ZSet底層hast表和跳表。hash表關聯元素value和權重score,跳表給value排序。
hash底層的數據結構是ziplist和hashtabel
2)高并發下緩存帶來的問題,緩存穿透,緩存擊穿、緩存雪崩
緩存穿透:數據既不在緩存也不在數據庫。
解決:可以對空值進行緩存;采用布隆過濾器
緩存擊穿:某個熱點數據過期,雪崩的子集
解決:設置不過期,預先將熱點數據加載到緩存中,并發監控,實施調整
加互斥鎖
緩存雪崩:大量緩存同一時刻失效,服務器掛掉
解決:使用多級緩存nginx緩存,本地緩存,redis緩存
將緩存的失效時間分散開,防止集體失效
3)Redis為什么那么快
20道經典Redis面試題_CSDN磚家的博客-CSDN博客_redis面試題
1.單線程+基于內存+采用了非阻塞多路復用機制
減少線程切換的時間與鎖的競爭
CPU與內存速度差了多個數量級,天上一天地下一天
IO多路復用(epoll):多個網絡連接、復用一個線程
2.高效的數據結構(動態字符串,ziplist,quickLIst,hast,跳表)利器
4)Redis事務
Redis中的事務是一組MULTI、EXEC、WATCH等一組命令集合,也就是說將一組命令封裝成一個隊里,其他命令不可以插隊。順序性,一次性,排他性。
- 開始事務(MULTI)
- 命令入隊
- 執行事務(EXEC)、撤銷事務(DISCARD )
5)redis的過期策略
過期策略:定時刪除(單一),惰性刪除(單一)、定期刪除(部分)
redis采用的是定期刪除+惰性刪除策略。
6)過期策略以及內存淘汰機制的區別
當 Redis 的內存超過最大允許的內存之后,Redis 會觸發內存淘汰策略,這和過期策略是完全不同的兩個概念,經常有人把二者搞混,這兩者一個是在正常情況下清除過期鍵,一個是在非正常情況下為了保證 Redis 順利運行的保護策略。
volatile-lru:當內存不足以容納新寫入數據時,從設置了過期時間的key中使用LRU(最近最少使用)算法進行淘汰;
allkeys-lru:當內存不足以容納新寫入數據時,從所有key中使用LRU(最近最少使用)算法進行淘汰。
volatile-lfu:4.0版本新增,當內存不足以容納新寫入數據時,在過期的key中,使用LFU算法進行刪除key。
allkeys-lfu:4.0版本新增,當內存不足以容納新寫入數據時,從所有key中使用LFU算法進行淘汰;
volatile-random:當內存不足以容納新寫入數據時,從設置了過期時間的key中,隨機淘汰數據;。
allkeys-random:當內存不足以容納新寫入數據時,從所有key中隨機淘汰數據。
volatile-ttl:當內存不足以容納新寫入數據時,在設置了過期時間的key中,根據過期時間進行淘汰,越早過期的優先被淘汰;
noeviction:默認策略,當內存不足以容納新寫入數據時,新寫入操作會報錯。
集群相關
7)Redis主從復制的過程
1.一次全量賦值,多次增量賦值
2.一次slave主動,多次master主動
slave節點初次連接master節點,會發送psync命令并觸發全量復制。
此時master節點fork一個后臺進程,開始生成一份RDB快照,同時將那些從外面接收到的寫命令緩存到緩沖區中。
RDB文件生成完畢后,將此文件發送給slave節點,slave先寫入磁盤,再從磁盤加載到內存,
接著master會將新增加的緩沖區的寫命令發送給slave,slave執行寫命令并同步數據。
8)Redis主從、哨兵、集群各有什么不同
主從模式:需要手動進行故障轉移,耗時長,可用性比較差,基本不推薦
哨兵模式:通過哨兵自動完成故障轉移,但是存儲數據比較冗余,利用率低不高,在線擴容
難,也不是太推薦
集群模式:繼承哨兵模式的所有優點,支持在線擴容,數據分片。
通過數據分片,實現在線擴容,同時每個 master 節點支持可讀可寫,可以支持超高的并發,強烈推薦這種方案。 注意:不管使用哪種 redis 高可用方案,都不能保證數據不丟失。 因為三種方
案底層都是依賴的主從復制原理,而主從復制是采用的異步復制,而異步復制是肯定會丟數據的
9)redis主從節點是長連接還是短連接?
長連接
10)怎么判斷redis某個節點是否正常工作
一般集群判斷節點是否正常工作,常用的方法都是通過互相的ping-pong心跳檢測機制,如果有一半以上的節點去ping一個節點的時候沒pong回應,集群就會認為這個節點宕機,會斷掉這個節點的連接。
redis主節點默認每隔10s發送一次心跳-一判斷從節點是否在線。
redis從節點每隔1s發送一次心跳一給主節點發送自己的復制偏移量,從主節點獲取到最新的數據變更命令,還做一件事情就是判斷主節點是否在線。
11)過期key如何處理
主節點處理了一個key或者通過淘汰算法淘汰了一個key,這個時候主節點模擬一條del命令發送給從節點,從節點接收到命令刪除key。
12)redis是同步復制還是異步復制
redis主節點每次接收到寫命令之后,先寫到內部的緩沖區,然后異步發送給從節點。
分布式鎖
13)redis除了做緩存,還可以用來做什么?
答:時效性驗證碼,分布式鎖、防重提交、分布式限流、簡易版本的消息隊列、延遲任務、session共享(
集成spring-session-data-redis)
14)redis鎖如何保證任何時刻有且只有一個線程持有這個鎖?
答:使用命令:setnx key value
key不存在時設置成功返回值ok,key存在設置失敗,
也可以采用If(!redisUtil.get(key)set key value},不過這段代碼需要采用Iua腳本實現來保證原子性。
15)如何保證分布式鎖不產生死鎖?
答:給鎖設置一個合理的過期時間,業務執行過程中節點異常宕機,有個兜底終止跳出方案使用命令:setnx key value ex seconds設置key和對應的過期時間,到了指定的ex時間,鎖自動釋放。
16)如何防止釋放別的線程鎖?
使用UUID或者雪花算法
17)分布式鎖選用redis與Zookeeper的區別
1、redis分布式鎖(推薦)互聯網項目并發量高,對性能要求高,比較推薦。
redis常見操作,例如基本類型string、hash、Iist、set等等操作可以采用jedis或lettuce。
對于跟分布式鎖相關的操作集成redission。
2、分布式鎖百分百可靠可以選用Zookeeper作為分布式鎖。采用cap理論中的cp模型保證高可靠性。
一般的項目我們可以結合不同的場景,同時兼容兩種分布鎖的實現。
18)什么是 redis 熱 key,以及解決方案
在 Redis 中,熱 key 是指那些在極短的時間內訪問頻次非常高的 key
解決:
1、利用二級緩存
使用EhCache,是一個純Java的進程內緩存框架
2、分布式緩存、讀寫分離
讀寫分離就是將同為?Write?的請求發送到?Master?模塊內,而將?Read?的請求發送至?ReadOnly?模塊。
Redis中熱點Key是怎么產生的?如何解決?-Redis-PHP中文網
19)什么是 redis 大 key
通俗易懂的講,大 Key就是某個key對應的value很大,占用的redis空間很大,本質上是大value問題。
Redis中什么是Big Key(大key)問題?如何解決Big Key問題?_每天都要進步一點點的博客-CSDN博客_redis 大key
解決:
在業務上對大Key進行拆分
設置過期時間,及時清理大key
重點要有大Key的分析工具
20)在1024這個日子,愿打工人早日找到心儀的工作
加油打工人
今天是1024程序員節 請對身邊可愛的程序員們好一點_鳳凰科技
總結
以上是生活随笔為你收集整理的Redis面试经典问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android BLE 蓝牙开发-扫码枪
- 下一篇: 食品计算机视觉检测技术,餐食热量一“拍”