Redis那點兒事兒

一.前言

Redis可以說是當今緩存圈裡的扛把子了,幾乎互聯網中涉及到緩存的應用都會使用Redis,所以面試緩存問題必然會遇到Redis的問題,所以今天就和大家聊一聊Redis那點兒事兒吧!

二.Redis支持的數據類型

這個是最基礎的面試問題,Redis總共支持五種數據類型

  1. String:這個是最基礎類型,支持最常規的set/get操作,value可以是String也可以是數字,一般用於做些計數功能的緩存
  2. hash:這裡value存放是結構化的對象,可以很方便的操作其中的字段,比如存放用戶登陸的信息,設置緩存過期時間模擬session效果
  3. list:可以用於時間簡單的消息隊列功能,同時可以使用lrange命令實現分頁,性能非常好
  4. set:一般用於實現去重功能,比如實現交集、並集、差集,比如可以用set實現共同好友功能
  5. sorted set:有序集合,其中多了一個score參數用於排序,可以實現排行榜的功能

三.Redis的過器策略

這個問題很重要,如果這個問題答不上來基本上說明你根本沒有真正瞭解Redis,比如說你的數據已經設置過過期時間了,並且時間也到了,但是一看內存佔比還是很高,有考慮過原因嗎

Redis採用定期刪除和惰性刪除兩種策略

  1. 定期刪除:指的是redis默認是每隔100ms就隨機抽取一些設置了過期時間的key,檢查其是否過期,如果過期就刪除。 注意,這裡可不是每隔100ms就遍歷所有的設置過期時間的key,那樣就是一場性能上的災難。實際上redis是每隔100ms隨機抽取一些key來檢查和刪除的,定期刪除可能會導致很多key到了時間卻沒有被刪除的情況
  2. 惰性刪除:就是在你操作key時候,redis會檢查一下這個key有沒有設置過期時間,如果設置了過期時間並且過期了,那麼redis此時就會刪除這個key,不會給你返回任何數據

四.內存淘汰機制

有如下場景:redis只能存10G的數據,你寫20G,那會刪除10個G的數據,怎麼刪的呢?考慮過這個問題嗎?再比如上面的過期策略還是有問題的,大量key到期了但是redis的定期刪除策略沒有刪掉,並且最近也沒有及時去查詢這些key那麼會導致大量key堆積在內存中導致內存耗盡,怎麼辦?答案當然是:內存淘汰機制了!

如果redis的內存佔用過多的時候,此時會進行內存淘汰,有如下一些策略:

noeviction:當內存不足以容納新寫入數據時,新寫入操作會報錯,這個一般沒人用吧

allkeys-lru:當內存不足以容納新寫入數據時,在鍵空間中,移除最近最少使用的key(這個是最常用的)

allkeys-random:當內存不足以容納新寫入數據時,在鍵空間中,隨機移除某個key,這個一般沒人用吧

volatile-lru:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,移除最近最少使用的key(這個一般不太合適)

volatile-random:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,隨機移除某個key

volatile-ttl:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,有更早過期時間的key優先移除

五.Redis的線程模型

Redis那點兒事兒

Redis 基於 Reactor 模式開發了自己的網絡事件處理器-文件事件處理器,文件事件處理器採用I/O多路複用程序同時監聽多個套接字,並根據套接字目前執行的任務來為套接字關聯不同的事件處理器。

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

文件事件處理器以單線程方式運行, 但通過使用 I/O 多路複用程序來監聽多個套接字, 文件事件處理器既實現了高性能的網絡通信模型, 又可以很好地與 redis 服務器中其他同樣以單線程方式運行的模塊進行對接, 這保持了 Redis 內部單線程設計的簡單性

六.為什麼單線程模型的Redis效率那麼高

  1. 純內存操作
  2. 單線程避免了多線程上下文切換的時間消耗
  3. Redis的核心是基於非阻塞的I/O多路複用

Redis相關內容就整理到這裡了,上面的內容只是關於Redis的技術的壓縮,要想真正運用的好,還是得實踐,希望上面的內容對大家有幫助吧,記得關注我【不愛八阿哥】一個熱技術的碼農,如果覺得有用也可以轉發分享給自己的朋友!


分享到:


相關文章: