玩轉Redis學習總結及面試題匯總
面試題:
(1)簡單介紹一下Redis
Redis 就是一個使用 C 語言開發的數據庫,不過與傳統數據庫不同的是 Redis 的數據是存在內存中的 ,也就是說它是內存數據庫,所以讀寫速度非常快,因此 Redis 被廣泛應用于緩存方向。
另外,Redis 除了做緩存之外,也經常用來做分布式鎖,消息隊列。
Redis 提供了五種數據類型和三大特殊數據類型來支持不同的業務場景。Redis 還支持事務 、持久化、Lua 腳本、多種集群方案。
(2)Redis有哪些優缺點?
優點:
性能極高
支持數據的持久化,對數據的更新采用Copy-on-write技術(寫拷貝),可以異步的保存在磁盤上
具有豐富的數據類型
原子性:多個操作通過MULTI和EXEC指令支持事務
具有豐富的特性:key過期
支持數據的備份,快速的主從復制
可用于節點集群
缺點:
數據庫容量受到物理內存的限制,不能用作海量數據的高性能讀寫
適合的場景主要局限在較小數據量的高性能操作和運算上
(3)Redis使用單線程模型為什么性能依然很好?
因為避免了線程切換的資源消耗,并且單線程不存在資源共享與競爭,不用考慮鎖的問題。同時是基于內存的,內存的讀寫速度非常快,使用非阻塞的IO多路復用機制,數據存儲進行了壓縮優化
使用了高性能數據結構,如hash、跳表等
(4)Redis除了做緩存,還能做什么?
分布式鎖 : 通過 Redis 來做分布式鎖是一種比較常見的方式。通常情況下,我們都是基于 Redisson 來實現分布式鎖。
限流 :一般是通過 Redis + Lua 腳本的方式來實現限流。
消息隊列 :Redis 自帶的 list 數據結構可以作為一個簡單的隊列使用。Redis5.0 中增加的 Stream 類型的數據結構更加適合用來做消息隊列。它比較類似于 Kafka,有主題和消費組的概念,支持消息持久化以及 ACK 機制。
復雜業務場景 :通過 Redis 以及 Redis 擴展(比如 Redisson)提供的數據結構,我們可以很方便地完成很多復雜的業務場景比如通過 bitmap 統計活躍用戶、通過 sorted set 維護排行榜。
(5)Redis常見數據結構的使用場景?
string類型:一般常用在需要計數的場景,比如用戶的訪問次數、熱點文章的轉發數量等等。
list類型:發布與訂閱或者說消息隊列、慢查詢。
hash類型:系統中對象數據的存儲。
set類型:需要存放的數據不能重復以及需要獲取多個數據源交集和并集等場景
zSet類型:需要對數據根據某個權重進行排序的場景。比如在直播系統中,實時排行信息包含直播間在線用戶列表,各種禮物排行榜,彈幕消息等信息。
(6)Redis在6.0之前為什么沒有多線程
單線程編程容易并且更容易維護;
Redis 的性能瓶頸不在 CPU ,主要在內存和網絡;
多線程就會存在死鎖、線程上下文切換等問題,甚至會影響性能。
(7)Redis如何判斷數據是否過期?
Redis 通過一個叫做過期字典(可以看作是 hash 表)來保存數據過期的時間。過期字典的鍵指向 Redis 數據庫中的某個 key(鍵),過期字典的值是一個 long long 類型的整數,這個整數保存了 key 所指向的數據庫鍵的過期時間(毫秒精度的 UNIX 時間戳)。
(8)Redis中數據的六大淘汰策略?
noeviction:當內存達到閾值的時候,所有引起申請內存的命令都會報錯。
allkeys-lru:在主鍵空間中,優先刪除最近未使用的key(推薦)。
volatile-lru:在設置過期時間的鍵空間中,優先刪除最近未使用的key。
allkeys-random:在主鍵空間中,隨機刪除key。
volatile-random:在設置了過期時間的鍵空間中,隨機刪除某個key。
volatile-ttl:在設置了過期時間的鍵空間中,優先刪除更早過期時間的key。
(9)Redis的事務機制及CAS
watch指令在redis事物中提供了CAS的行為。為了檢測被watch的keys在是否有多個clients同時改變引起沖突,這些keys將會被監控。如果至少有一個被監控的key在執行exec命令前被修改,整個事物將會回滾,不執行任何動作,從而保證原子性操作,并且執行exec會得到null的回復。
(10)Redis持久化機制有哪些?各有什么優缺點?
1、RDB:數據集快照的方式半持久化模式,記錄數據庫的所有鍵值對,在某個時間點將數據寫入臨時文件,持久化結束后,用這個臨時文件替換上次持久化的文件,可恢復數據。
優點:
恢復操作簡單,容災性好
性能高,fork子進程進行寫操作,主進程繼續處理命令
大數據集比AOF的恢復率高
缺點:
數據安全性低,RDB是間隔一段時間進行持久化,若期間redis發生故障,可能發生數據丟失。
2、AOF:指所有的命令記錄以redis命令請求協議的格式完全持久化存儲,保存為aof文件
優點:
數據安全
缺點:
AOF的持久化文件比RDB大,恢復速度慢
(11)什么是主從復制?
主從復制,是指將一臺Redis服務器的數據,復制到其他的Redis服務器。前者稱為主節點(master/leader),后者稱為從節點(slave/follower);數據的復制是單向的,只能由主節點到從節點。Master以寫為主,Slave以讀為主。
默認情況下,每臺Redis服務器都是主節點;且一個主節點可以有多個從節點(或沒有從節點),但一個從節點只能有一個主節點。
(12)使用Redis常遇到的問題?
緩存和數據庫雙寫一致性問題
緩存雪崩問題
緩存擊穿問題
緩存的并發競爭問題
(13)什么是緩存雪崩?
緩存雪崩,是指在某一個時間段,緩存集中過期失效。Redis宕機!
(14)什么是緩存穿透?
緩存穿透的概念很簡單,用戶想要查詢一個數據,發現redis內存數據庫沒有,也就是緩存沒有命中,于是向持久層數據庫查詢。發現也沒有,于是本次查詢失敗。當用戶很多的時候,緩存都沒有命中,于是都去請求了持久層數據庫。這會給持久層數據庫造成很大的壓力,這時候就相當于出現了緩存穿透。
(15)什么是緩存擊穿?
這里需要注意和緩存穿透的區別,緩存擊穿,是指一個key非常熱點,在不停的扛著大并發,大并發集中對這一個點進行訪問,當這個key在失效的瞬間,持續的大并發就穿破緩存,直接請求數據庫,就像在一個屏障上鑿開了一個洞。
當某個key在過期的瞬間,有大量的請求并發訪問,這類數據一般是熱點數據,由于緩存過期,會同時訪問數據庫來查詢最新數據,并且回寫緩存,會導使數據庫瞬間壓力過大。
Redis
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。