redis 面試題整理

前言

前天面試了一家公司,平時看一本redis書的也使用redis,對裏面的東西也基本瞭解,結果回答的時候居然回答了只是使用了(因爲認爲是redis是運維的東西,做的東西多,所以忘了,好吧這是藉口),因爲害怕被繼續問,所以說。。。。

基礎的還是要快速回答出來的,前車之鑑啊。當然下面的面試題中會加入自己的一些見解。持續更新。。。。後面會加入代碼全部演練一遍。

正文

redis 速度快

(一)純內存操作

(二)單線程操作,避免了頻繁的上下文切換

(三)採用了非阻塞I/O多路複用機制

二 : 這裏進行一些介紹,就是說線程的切換其實是這樣子的,比如說A 線程切換到B線程,那麼其實是要保護好A的狀態,這個狀態用於後續切換到A的時候,可以進行繼續操作。

三: 非阻塞 I/0多路複用機制 https://www.cnblogs.com/hello-/articles/9599380.html

redis 持久化機制

redis 是一個支持持久化的內存數據庫,通過持久化吧內存的數據同步到硬盤來保證數據持久化。

當redis 重啓後,通過把硬盤文件重新加載到內存中,就能達到恢復數據的目的。

實現:fork一個子進程,將當前父進程的數據庫數據複製到子進程的內存中,然後子進程寫入到臨時文件中,持久化的過程結束,再用這個臨時文件替換上次的快照文件,然後子進程退出,內存釋放。

RDB是redis 默認的持久化方式。按照一定的時間週期策略把內存的數據以快照的形式保存到硬盤的二進制文件。即snapshot 快照存儲,對應產生的文件爲 dump.rdb,通過配置文件的save 參數來定義快照的週期。

AOF:redis 會將每一個收到的寫命令通過write函數追加到文件最後,類十餘mysql binlog。當redis 重啓會重新執行文件中保存的寫命令在內存中重建整個數據庫內容。

當這兩種同時開啓時,數據恢復redis 會優先選擇AOF 恢復。

如何解決rdb中的數據丟失問題,AOF和RDB同時開啓,AOF 效率低,但是隻有RDB 出現問題得時候,才啓動AOF。

redis 緩存雪崩

什麼是緩存雪崩呢?

其實是一個很常見的一個概念,比如說數據量很大,但是設置的時間都是在同一個點,那麼會產生一個問題,那就是這些數據可能在同一個時間過期,那麼這個時候所有的查詢都去查詢數據庫了。

那麼這個時候最好是時間錯開從而達到目的。

1.給緩存的失效時間,加上一個隨機值,避免集體失效。

2.使用互斥鎖,吞吐量明顯下降。

3.使用雙緩存,比如說緩存A、B。緩存A的失效時間爲5分鐘,緩存B不設置失效時間。

步驟如下:

1.A 有數據就從A 中讀取。

2.A沒有數據,直接從B讀取數據,直接返回,並且開啓一個異步線程,去更新A中的數據。

3.更新線程中同時去更新A和緩存B。

redis 緩存穿透

緩存穿透是指用戶查詢的數據,數據庫中不存在,那麼緩存中也沒有,那麼這個時候會一直查詢數據庫,所以叫做穿透。

解決方法:

1.布隆過濾器

將所有可能存在的數據哈希到一個足夠大的bitmap中,一個不存在的數據會被bitmap攔截,從而避免了對底層存儲系統的查詢壓力。

2.如果查詢到的數據爲空,依然對這個結果進行緩存,但是他的過期時間小,這樣就不會出現緩存擊穿的情況。

瞭解布隆過濾器。

個人見解:這其實有一種很老套的攻擊手法,以前的時候很多人就通過每次查詢的是一些數據庫裏面不存在的信息,那麼每次都會去查詢數據庫。

緩存預熱

緩存預熱就是系統上線後,將相關的緩存數據直接加載到緩存系統。這樣可以避免用戶在請求的時候先查詢數據庫。

解決思路:

1、直接寫個緩存刷新頁面,上線時手工操作下;

2、數據量不大,可以在項目啓動的時候自動進行加載;

3、定時刷新緩存;

緩存降級

緩存降級是指當訪問量劇增、服務出現問題(如響應時間慢或不響應)或非核心服務影響到核心流程的性能時,仍然需要保證服務還是可用的,即使是有損服務。系統可以根據一些關鍵數據進行自動降級,也可以配置開關實現人工降級。

redis 緩存失效策略

(1)定時去清理過期的緩存;

(2)當有用戶請求過來時,再判斷這個請求所用到的緩存是否過期,過期的話就去底層系統得到新數據並更新緩存。

兩者各有優劣,第一種的缺點是維護大量緩存的key是比較麻煩的,第二種的缺點就是每次用戶請求過來都要判斷緩存失效,邏輯相對比較複雜!具體用哪種方案,大家可以根據自己的應用場景來權衡。

redis 線程模型

文件事件處理器分別包括套接字、IO多路複用程序、文件事件分派器、一級事件處理器。

使用多路複用程序來同時監聽多個套接字,並根據套接字目前執行的任務來爲套接字關聯不同的時間處理器。

當被監聽的套接字準備好執行連接應答(accept)、讀取(read)、寫入(write)、關閉(close)等操作時, 與操作相對應的文件事件就會產生, 這時文件事件處理器就會調用套接字之前關聯好的事件處理器來處理這些事件。

I/O 多路複用程序負責監聽多個套接字, 並向文件事件分派器傳送那些產生了事件的套接字。

redis 五種模型

相對用戶而已:

1.string

value 可以是string 也可以是數字,一般做一些複雜的計算功能的緩存。

2.hash

value 存放的是結構化的對象,比較方便的就是操作其中的某個字段。

比如說單點登錄的時候,這種數據結構存儲用戶信息,cookieId 作爲key,設置30分鐘緩存來作爲過期時間。

3.list

可以作爲簡單的消息隊列功能,先進先出原則很好作爲隊列。還可以通過lrang,做基於redis的分頁功能,性能極佳,用戶體驗好。

4.set

set 可以作爲一個去重的集合。

同時,可以進行交集、並集、補集等操作,比如說計算共同愛好。

5.sorted set

sorted set 比set 多了一個score,可以按照score進行排序,排行榜等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章