離譜!面試為啥都問Redis?趕緊補一下

ITPUB社群發表於2023-03-06

大家好,我是哪吒。

一、同樣是快取,用map不行嗎?

(1)Redis可以儲存幾十個G的資料,Map行嗎?

(2)Redis的快取可以進行本地持久化,Map行嗎?

(3)Redis可以作為分散式快取,Map只能在同一個JVM中進行快取;

(4)Redis支援每秒百萬級的併發,Map行嗎?

(5)Redis有過期機制,Map有嗎?

(6)Redis有豐富的API,支援非常多的應用場景,Map行嗎?

二、Redis為什麼是單執行緒的?

(1)程式碼更清晰,處理邏輯更簡單;

(2)不用考慮各種鎖的問題,不存在加鎖和釋放鎖的操作,沒有因為可能出現死鎖而導致的效能問題;

(3)不存在多執行緒切換而消耗CPU;

(4)無法發揮多核CPU的優勢,但可以採用多開幾個Redis例項來完善;

三、Redis真的是單執行緒的嗎?

(1)Redis6.0之前是單執行緒的,Redis6.0之後開始支援多執行緒;

(2)Redis內部使用了基於epoll的多路複用,也可以多部署幾個Redis伺服器解決單執行緒的問題;

(3)Redis主要的效能瓶頸是記憶體和網路

(4)記憶體好說,加記憶體條就行了,而網路才是大麻煩,所以Redis6記憶體好說,加記憶體條就行了;

(5)而網路才是大麻煩,所以Redis6.0引入了多執行緒的概念;

(6)Redis6.0在網路IO處理方面引入了多執行緒,如網路資料的讀寫和協議解析等,需要注意的是,執行命令的核心模組還是單執行緒的;

四、Redis優缺點

1、優點

(1)Redis是KV資料庫,MySQL是關係型資料庫,Redis速度更快;

(2)Redis資料操作主要在記憶體中,MySQL主要將資料儲存在硬碟,Redis速度更快;

(3)Redis同樣支援持久化(RDB+AOF),Redis支援將資料非同步將記憶體的資料持久化到硬碟上,避免Redis當機出現資料丟失的問題;

(4)Redis效能極高,讀的速度是110000次/秒,寫的速度是81000次/秒;

(5)Redis資料型別豐富,不僅支援KV鍵值對,還支援list、set、zset、hash等資料結構的儲存;

(6)Redis支援資料的備份,即master-slave模式的資料備份;

(7)Redis支援簡單的事務,操作滿足原子性;

(8)Redis支援讀寫分離,分擔讀的壓力;

(9)Redis支援哨兵模式,實現故障的自動轉移;

(10)單執行緒操作,避免了頻繁的上下文切換

(11)採用了非阻塞I/O多路複用機制,效能卓越;

2、缺點

(1)資料儲存在記憶體,容易造成資料丟失;

(2)儲存容量受記憶體的限制,只能儲存少量的常用資料;

(3)快取和資料庫雙寫一致性問題;

(4)用於快取時,容易出現記憶體穿透、快取擊穿、快取雪崩的問題;

(5)修改配置檔案後,需要進行重啟,將硬碟中的資料同步到記憶體中,消耗的時間較長,而且資料同步的時間裡Redis不能提供服務;

五、Redis常見業務場景

(1)Redis是基於記憶體的nosql資料庫,可以透過新建執行緒的形式進行持久化,不影響Redis單執行緒的讀寫操作

(2)透過list取最新的N條資料

(3)模擬類似於token這種需要設定過期時間的場景

(4)釋出訂閱訊息系統

(5)定時器、計數器

(6)快取加速、分散式會話、排行榜、分散式計數器、分散式鎖;

(7)Redis支援事務、持久化、LUA指令碼、釋出/訂閱、快取淘汰、流技術等特性;

六、Redis常見資料型別

離譜!面試為啥都問Redis?趕緊補一下

1、String

(1)String簡介

String 是最基本的 key-value 結構,key 是唯一標識,value 是具體的值,value其實不僅是字串, 也可以是數字(整數或浮點數),value 最多可以容納的資料長度是 512M。

(2)應用場景

① 作為快取資料庫

在Java管理系統體系中,大多數都是用MySQL儲存資料,redis作為快取,因為Redis具有支撐高併發的特性,通常能起到加速讀寫和降低資料庫伺服器壓力的作用,大多數請求都會先請求Redis,如果Redis中沒有資料,再請求MySQL資料庫,然後再快取到Redis中,以備下次使用。

離譜!面試為啥都問Redis?趕緊補一下

② 計數器

Redis字串中有一個命令INCR key,incr命令會對值進行自增操作,比如CSDN的文章閱讀,影片的播放量,都可以透過Redis來計數,每閱讀一次就+1,同時將這些資料非同步儲存到MySQL資料庫中,降低MySQL伺服器的寫入壓力。

③ 共享session

在分散式系統中,使用者每次請求一般會訪問不同的伺服器 ,這就會導致session不同步的問題,這時,一般會使用Redis來解決這個問題,將session存入Redis,使用的時候從Redis中取出就可以了。

④ 分散式鎖

  1. setnx key value,加鎖
  2. del key,釋放鎖

(3)key操作命令

離譜!面試為啥都問Redis?趕緊補一下

(4)set key value

SET key value [NX | XX] [GET] [EX seconds | PX milliseconds |  EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]

  1. EX seconds,設定過期時間,單位秒
  2. PX milliseconds,設定過期時間,單位毫秒
  3. EXAT timestamp-seconds,設定過期時間,以秒為單位的UNIX時間戳
  4. PXAT timestamp-milliseconds,設定過期時間,以毫秒為單位的UNIX時間戳
  5. NX,鍵不存在的時候設定鍵值
  6. XX,鍵存在的時候設定鍵值
  7. KEEPTTL,保留設定前指定鍵的生存時間
  8. GET,返回指定鍵原本的值,若鍵不存在返回nil

備註:

命令不區分大小寫,而key是區分大小寫的。

help @型別:檢視當前型別相關的操作命令。

Since the SET command options can replace SETNX, SETEX, PSETEX, GETSET, it is possible that in future versions of Redis these commands will be deprecated and finally removed。

(5)同時設定多個鍵值

(6)獲取指定區間範圍內的值

getrange、setrange。

(7)數值增減

  1. INCR key,遞增數字
  2. INCRBY key increment,增加指定的數值遞增
  3. DECR key,遞減數值
  4. DECRBY key decrement,指定指定的數值遞減

(8)獲取字串的長度,內容追加

  1. STRLEN key,獲取值的長度
  2. APPEND key value,內容追加

2、List

(1)List 列表簡介

List 列表是簡單的字串列表,按照插入順序排序,可以從頭部或尾部向 List 列表新增元素。

列表的最大長度為 2^32 - 1,也即每個列表支援超過 40 億個元素。

主要功能有push/pop,一般用在棧、佇列、訊息佇列等場景。

  1. left、right都可以插入新增;
  2. 如果鍵不存在,建立新的連結串列;
  3. 如果鍵存在,新增內容;
  4. 如果值全部移除,對應的鍵也會消失;

它的底層是雙向連結串列,對兩端的操作效能很高,透過索引下標操作中間的節點,效能會較差。

(2)應用場景

① 訊息佇列

使用 lpush + rpop或者 rpush + lpop實現訊息佇列,Redis還支援阻塞操作,在彈出元素的時候使用阻塞命令來實現阻塞佇列。

離譜!面試為啥都問Redis?趕緊補一下

② 作為棧使用

使用 lpush+lpop或者 rpush+rpop實現棧。

離譜!面試為啥都問Redis?趕緊補一下

③ 文章列表

(3)常用命令

離譜!面試為啥都問Redis?趕緊補一下

3、Hash

(1)hash簡介

Hash 是一個鍵值對(key - value)集合,value也是一個hash,相當於 Map<String,Map<Object,Object>>

(2)常用場景

由於特殊的資料結構,hash一般作為儲存bean使用,String+JSON的資料結構儲存特定的應用場景。

離譜!面試為啥都問Redis?趕緊補一下

(3)常用命令

離譜!面試為啥都問Redis?趕緊補一下
離譜!面試為啥都問Redis?趕緊補一下

4、Set

(1)Set型別簡介

Set 型別是一個無序並唯一的鍵值集合,它的儲存順序不會按照插入的先後順序進行儲存。

一個集合最多可以儲存 2^32-1 個元素。概念和數學中個的集合基本類似,可以交集,並集,差集等等,所以 Set 型別除了支援集合內的增刪改查,同時還支援多個集合取交集、並集、差集。

(2)應用場景

① 相同好友可見

在朋友圈場景中,對於點贊、評論的功能,透過交集實現相同還有可見的功能。

② 共同關注、共同喜好

③ 抽獎功能

(3)常用命令

離譜!面試為啥都問Redis?趕緊補一下

5、Zset

(1)Zset 型別簡介

Zset 型別(有序集合型別)相比於 Set 型別多了一個排序屬性 score(分值),對於有序集合 ZSet 來說,每個儲存元素相當於有兩個值組成的,一個是有序結合的元素值,一個是排序值。

有序集合保留了集合不能有重複成員的特性(分值可以重複),但不同的是,有序集合中的元素可以排序。

zset k1 score1 v1 score2 v2

(2)應用場景

① 排行榜

透過score來記錄點贊數,然後根據score進行排序,實現排行榜的功能。

② 延遲訊息佇列

訂單系統,下單後需要在15分鐘內進行支付操作,否則自動取消訂單。

將下單後15分鐘後的時間作為score,訂單作為value存入Redis,消費者輪詢去消費,如果消費的大於等於score,則取消該訂單。

(3)Zset常用命令

離譜!面試為啥都問Redis?趕緊補一下

6、BitMap

(1)Bitmap簡介

Bitmap,即點陣圖,是一串連續的二進位制陣列(0和1),可以透過偏移量(offset)定位元素。BitMap透過最小的單位bit來進行0|1的設定,表示某個元素的值或者狀態,時間複雜度為O(1)。

(2)應用場景

由於 bit 是計算機中最小的單位,使用它進行儲存將非常節省空間,特別適合一些資料量大且使用二值統計的場景。

① 簽到統計

② 判斷使用者是否登入

③ 統計連續學習打卡的人

(3)BitMap常用命令

離譜!面試為啥都問Redis?趕緊補一下

7、BitField

透過bitfield命令可以一次性操作多個位元位,它會執行一系列操作並返回一個響應陣列,這個陣列中的元素對引數列表中的相應操作的執行結果。

8、HyperLogLog

(1)HyperLogLog簡介

Redis HyperLogLog 是 Redis 2.8.9 版本新增的資料型別,是一種用於「統計基數」的資料集合型別,基數統計就是指統計一個集合中不重複的元素個數。但要注意,HyperLogLog 是統計規則是基於機率完成的,不是非常準確,標準誤算率是 0.81%。

所以,簡單來說 HyperLogLog 提供不精確的去重計數。

HyperLogLog 的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的記憶體空間總是固定的、並且是很小的。

在 Redis 裡面,每個 HyperLogLog 鍵只需要花費 12 KB 記憶體,就可以計算接近 2^64 個不同元素的基數,和元素越多就越耗費記憶體的 Set 和 Hash 型別相比,HyperLogLog 就非常節省空間。

(2)應用場景

百萬級網頁 UV 計數

(3)常用命令

  1. pfadd key element,新增元素
  2. pfcount key,返回指定HyperLogLog的基數的估算值;
  3. pfmerge destkey sourcekey,將多個HyperLogLog合併成一個HyperLogLog;

9、GEO

(1)GEO簡介

Redis GEO 是 Redis 3.2 版本新增的資料型別,主要用於儲存地理位置資訊,並對儲存的資訊進行操作。

在日常生活中,我們越來越依賴搜尋“附近的餐館”、在叫車軟體上叫車,這些都離不開基於位置資訊服務(Location-Based Service,LBS)的應用。LBS 應用訪問的資料是和人或物關聯的一組經緯度資訊,而且要能查詢相鄰的經緯度範圍,GEO 就非常適合應用在 LBS 服務的場景中。

(2)應用場景

高德地圖、滴滴叫車等定位軟體。

(3)常用命令

離譜!面試為啥都問Redis?趕緊補一下

10、Stream

(1)Stream簡介

Redis Stream 是 Redis 5.0 版本新增加的資料型別,Redis 專門為訊息佇列設計的資料型別。

離譜!面試為啥都問Redis?趕緊補一下

在 Redis 5.0 Stream 沒出來之前,訊息佇列的實現方式都有著各自的缺陷,例如:

  • 釋出訂閱模式,不能持久化也就無法可靠的儲存訊息,並且對於離線重連的客戶端不能讀取歷史訊息的缺陷;
  • List 實現訊息佇列的方式不能重複消費,一個訊息消費完就會被刪除,而且生產者需要自行實現全域性唯一 ID。

基於以上問題,Redis 5.0 便推出了 Stream 型別也是此版本最重要的功能,用於完美地實現訊息佇列,它支援訊息的持久化、支援自動生成全域性唯一 ID、支援 ack 確認訊息的模式、支援消費組模式等,讓訊息佇列更加的穩定和可靠。

(2)應用場景

訊息佇列

(3)常用命令

離譜!面試為啥都問Redis?趕緊補一下

七、總結

Redis是一個key-value儲存系統,支援10種資料型別,總結了為何要用Redis替代map作為程式快取、Redis為什麼是單執行緒的、Redis的優缺點、Redis的常用場景,做了一次Redis的快速入門。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2938226/,如需轉載,請註明出處,否則將追究法律責任。

相關文章