共計 3099 個字符,預計需要花費 8 分鐘才能閱讀完成。
本篇內容主要講解“Redis 的高頻面試題有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“Redis 的高頻面試題有哪些”吧!
1、說說 Redis 都有哪些應用場景?
緩存:這應該是 Redis 主要的功能了,也是大型網站必備機制,合理地使用緩存不僅可以加 快數據的訪問速度,而且能夠有效地降低后端數據源的壓力。
共享 Session:對于一些依賴 session 功能的服務來說,如果需要從單機變成集群的話,可以選擇 redis 來統一管理 session。
消息隊列系統:消息隊列系統可以說是一個大型網站的必備基礎組件,因為其具有業務 解耦、非實時業務削峰等特性。Redis 提供了發布訂閱功能和阻塞隊列的功 能,雖然和專業的消息隊列比還不夠足夠強大,但是對于一般的消息隊列功 能基本可以滿足。比如在分布式爬蟲系統中,使用 redis 來統一管理 url 隊列。
分布式鎖:在分布式服務中。可以利用 Redis 的 setnx 功能來編寫分布式的鎖,雖然這個可能不是太常用。
當然還有諸如排行榜、點贊功能都可以使用 Redis 來實現,但是 Redis 也不是什么都可以做,比如數據量特別大時,不適合 Redis,我們知道 Redis 是基于內存的,雖然內存很便宜,但是如果你每天的數據量特別大,比如幾億條的用戶行為日志數據,用 Redis 來存儲的話,成本相當的高。
2、單線程的 Redis 為什么這么快?
Redis 有多快? 官方給出的答案是讀寫速度 10 萬 / 秒,如果說這是在單線程情況下跑出來的成績,你會不會驚訝? 為什么單線程的 Redis 速度這么快? 原因有以下幾點:
純內存操作:Redis 是完全基于內存的,所以讀寫效率非常的高,當然 Redis 存在持久化操作,在持久化操作是都是 fork 子進程和利用 Linux 系統的頁緩存技術來完成,并不會影響 Redis 的性能。
單線程操作:單線程并不是壞事,單線程可以避免了頻繁的上下文切換,頻繁的上下文切換也會影響性能的。
合理高效的數據結構
采用了非阻塞 I/O 多路復用機制:多路 I / O 復用模型是利用 select、poll、epoll 可以同時監察多個流的 I/O 事件的能力,在空閑的時候,會把當前線程阻塞掉,當有一個或多個流有 I/O 事件時,就從阻塞態中喚醒,于是程序就會輪詢一遍所有的流(epoll 是只輪詢那些真正發出了事件的流),并且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作。
3、說說 Redis 的數據結構及使用場景
Redis 提供了 5 種數據結構,每一種數據結構有各種的使用場景。
1、String 字符串
字符串類型是 Redis 最基礎的數據結構,首先鍵都是字符串類型,而且 其他幾種數據結構都是在字符串類型基礎上構建的,我們常使用的 set key value 命令就是字符串。常用在緩存、計數、共享 Session、限速等。
2、Hash 哈希
在 Redis 中,哈希類型是指鍵值本身又是一個鍵值對 結構,形如 value={{field1,value1},…{fieldN,valueN}},添加命令:hset key field value。哈希可以用來存放用戶信息,比如實現購物車
3、List 列表
列表 (list) 類型是用來存儲多個有序的字符串。可以做簡單的消息隊列的功能。另外,可以利用 lrange 命令,做基于 Redis 的分頁功能,性能極佳,用戶體驗好。
4、Set 集合
集合 (set) 類型也是用來保存多個的字符串元素,但和列表類型不一 樣的是,集合中不允許有重復元素,并且集合中的元素是無序的,不能通過 索引下標獲取元素。利用 Set 的交集、并集、差集等操作,可以計算共同喜好,全部的喜好,自己獨有的喜好等功能。
5、Sorted Set 有序集合
Sorted Set 多了一個權重參數 Score,集合中的元素能夠按 Score 進行排列。可以做排行榜應用,取 TOP N 操作
4、說一說 Redis 的數據過期淘汰策略
先給大家一個結論,Redis 中數據過期策略采用定期刪除 + 惰性刪除策略。
1、定期刪除、惰性刪除策略是什么?
定期刪除策略:Redis 啟用一個定時器定時監視所有的 key,判斷 key 是否過期,過期的話就刪除。這種策略可以保證過期的 key 最終都會被刪除,但是也存在嚴重的缺點:每次都遍歷內存中所有的數據,非常消耗 CPU 資源,并且當 key 已過期,但是定時器還處于未喚起狀態,這段時間內 key 仍然可以用。
惰性刪除策略:在獲取 key 時,先判斷 key 是否過期,如果過期則刪除。這種方式存在一個缺點:如果這個 key 一直未被使用,那么它一直在內存中,其實它已經過期了,會浪費大量的空間。
2、定期刪除 + 惰性刪除策略是如何工作的?
這兩種策略天然的互補,結合起來之后,定時刪除策略就發生了一些改變,不在是每次掃描全部的 key 了,而是隨機抽取一部分 key 進行檢查,這樣就降低了對 CPU 資源的損耗,惰性刪除策略互補了為檢查到的 key,基本上滿足了所有要求。但是有時候就是那么的巧,既沒有被定時器抽取到,又沒有被使用,這些數據又如何從內存中消失? 沒關系,還有內存淘汰機制,當內存不夠用時,內存淘汰機制就會上場。Redis 內存淘汰機制有以下幾種策略:
noeviction:當內存不足以容納新寫入數據時,新寫入操作會報錯。(Redis 默認策略)
allkeys-lru:當內存不足以容納新寫入數據時,在鍵空間中,移除最近最少使用的 Key。(推薦使用)
allkeys-random:當內存不足以容納新寫入數據時,在鍵空間中,隨機移除某個 Key。
volatile-lru:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,移除最近最少使用的 Key。這種情況一般是把 Redis 既當緩存,又做持久化存儲的時候才用。
volatile-random:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,隨機移除某個 Key。
volatile-ttl:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,有更早過期時間的 Key 優先移除。
修改內存淘汰機制只需要在 redis.conf 配置文件中配置 maxmemory-policy 參數即可。
5、如何解決 Redis 緩存穿透和緩存雪崩問題
緩存雪崩:由于緩存層承載著大量請求,有效地 保護了存儲層,但是如果緩存層由于某些原因不能提供服務,比如 Redis 節點掛掉了,熱點 key 全部失效了,在這些情況下,所有的請求都會直接請求到數據庫,可能會造成數據庫宕機的情況。
預防和解決緩存雪崩問題,可以從以下三個方面進行著手:
1、使用 Redis 高可用架構:使用 Redis 集群來保證 Redis 服務不會掛掉
2、緩存時間不一致:給緩存的失效時間,加上一個隨機值,避免集體失效
3、限流降級策略:有一定的備案,比如個性推薦服務不可用了,換成熱點數據推薦服務
緩存穿透:緩存穿透是指查詢一個根本不存在的數據,這樣的數據肯定不在緩存中,這會導致請求全部落到數據庫上,有可能出現數據庫宕機的情況。
預防和解決緩存穿透問題,可以考慮以下兩種方法:
1、緩存空對象:將空值緩存起來,但是這樣就有一個問題,大量無效的空值將占用空間,非常浪費。
2、布隆過濾器攔截:將所有可能的查詢 key 先映射到布隆過濾器中,查詢時先判斷 key 是否存在布隆過濾器中,存在才繼續向下執行,如果不存在,則直接返回。布隆過濾器有一定的誤判,所以需要你的業務允許一定的容錯性。
到此,相信大家對“Redis 的高頻面試題有哪些”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!