總結分享20個關于Redis的經典面試題(附答案分析)

金九銀十即將到來,本篇文章給大家整理分享20道redis經典面試題,希望對大家有所幫助!

總結分享20個關于Redis的經典面試題(附答案分析)

1. 什么是redis?它主要用來什么的?

Redis,英文全稱是Remote Dictionary Server(遠程字典服務),是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。【相關推薦:redis

與MySQL數據庫不同的是,Redis的數據是存在內存中的。它的讀寫速度非常快,每秒可以處理超過10萬次讀寫操作。因此redis廣泛應用于緩存,另外,Redis也經常用來做分布式鎖。除此之外,Redis支持事務、持久化、LUA 腳本、LRU 驅動事件、多種集群方案。

2.說說Redis的基本數據結構類型

大多數小伙伴都知道,Redis有以下這五種基本類型:

  • String(字符串)
  • Hash(哈希)
  • List(列表)
  • Set(集合)
  • zset(有序集合)

它還有三種特殊的數據結構類型

  • Geospatial
  • Hyperloglog
  • Bitmap

2.1 Redis 的五種基本數據類型

總結分享20個關于Redis的經典面試題(附答案分析)

String(字符串)

  • 簡介:String是Redis最基礎的數據結構類型,它是二進制安全的,可以存儲圖片或者序列化的對象,值最大存儲為512M
  • 簡單使用舉例: set key value、get key等
  • 應用場景:共享session、分布式鎖,計數器、限流。
  • 內部編碼有3種,int(8字節長整型)/embstr(小于等于39字節字符串)/raw(大于39個字節字符串)

C語言的字符串是char[]實現的,而Redis使用SDS(simple dynamic string) 封裝,sds源碼如下:

struct?sdshdr{ ??unsigned?int?len;?//?標記buf的長度 ??unsigned?int?free;?//標記buf中未使用的元素個數 ??char?buf[];?//?存放元素的坑 }

SDS 結構圖如下:

總結分享20個關于Redis的經典面試題(附答案分析)

Redis為什么選擇SDS結構,而C語言原生的 char[]不香嗎?

舉例其中一點,SDS中,O(1)時間復雜度,就可以獲取字符串長度;而C 字符串,需要遍歷整個字符串,時間復雜度為O(n)

Hash(哈希)

  • 簡介:在Redis中,哈希類型是指v(值)本身又是一個鍵值對(k-v)結構
  • 簡單使用舉例:hset key field value 、hget key field
  • 內部編碼:ziplist(壓縮列表) 、hashtable(哈希表)
  • 應用場景:緩存用戶信息等。
  • 注意點:如果開發使用hgetall,哈希元素比較多的話,可能導致Redis阻塞,可以使用hscan。而如果只是獲取部分field,建議使用hmget。

字符串和哈希類型對比如下圖:

總結分享20個關于Redis的經典面試題(附答案分析)

List(列表)

  • 簡介:列表(list)類型是用來存儲多個有序的字符串,一個列表最多可以存儲2^32-1個元素。
  • 簡單實用舉例: lpush ?key ?value [value …] 、lrange key start end
  • 內部編碼:ziplist(壓縮列表)、linkedlist(鏈表)
  • 應用場景: 消息隊列,文章列表,

一圖看懂list類型的插入與彈出:

總結分享20個關于Redis的經典面試題(附答案分析)

list應用場景參考以下:

  • lpush+lpop=Stack(棧)
  • lpush+rpop=Queue(隊列)
  • lpsh+ltrim=Capped Collection(有限集合)
  • lpush+brpop=Message Queue(消息隊列)

Set(集合)

總結分享20個關于Redis的經典面試題(附答案分析)

  • 簡介:集合(set)類型也是用來保存多個的字符串元素,但是不允許重復元素
  • 簡單使用舉例:sadd key element [element …]、smembers key
  • 內部編碼:intset(整數集合)、hashtable(哈希表)
  • 注意點:smembers和lrange、hgetall都屬于比較重的命令,如果元素過多存在阻塞Redis的可能性,可以使用sscan來完成。
  • 應用場景: 用戶標簽,生成隨機數抽獎、社交需求。

有序集合(zset)

  • 簡介:已排序的字符串集合,同時元素不能重復
  • 簡單格式舉例:zadd key score member [score member …],zrank key member
  • 底層內部編碼:ziplist(壓縮列表)、skiplist(跳躍表)
  • 應用場景:排行榜,社交需求(如用戶點贊)。

2.2 Redis 的三種特殊數據類型

  • Geo:Redis3.2推出的,地理位置定位,用于存儲地理位置信息,并對存儲的信息進行操作。
  • HyperLogLog:用來做基數統計算法的數據結構,如統計網站的UV。
  • Bitmaps :用一個比特位來映射某個元素的狀態,在Redis中,它的底層是基于字符串類型實現的,可以把bitmaps成作一個以比特位為單位的數組

3. Redis為什么這么快?

總結分享20個關于Redis的經典面試題(附答案分析)

3.1 基于內存存儲實現

我們都知道內存讀寫是比在磁盤快很多的,Redis基于內存存儲實現的數據庫,相對于數據存在磁盤的MySQL數據庫,省去磁盤I/O的消耗。

3.2 高效的數據結構

我們知道,Mysql索引為了提高效率,選擇了B+樹的數據結構。其實合理的數據結構,就是可以讓你的應用/程序更快。先看下Redis的數據結構&內部編碼圖:

總結分享20個關于Redis的經典面試題(附答案分析)

SDS簡單動態字符串

總結分享20個關于Redis的經典面試題(附答案分析)