首頁 > 軟體

阿里面試常問的redis資料結構,建議收藏

2021-01-25 13:00:07

關於Redis

redis是一個開源的使用C語言編寫的一個kv儲存系統,是一個速度非常快的非關係遠端記憶體資料庫。它支援包括String、List、Set、Zset、hash五種資料結構。除此之外,通過複製、持久化和使用者端分片等特性,使用者可以很方便地將redis擴充套件成一個能夠包含數百GB資料和每秒處理上百萬次的請求的系統。目前支援多種語言的api,方便使用者使用。

redis同時也內建了事務、LUA指令碼、複製等功能,提供兩種持久化選項,一種是每隔一段時間將資料匯入到磁碟(快照模式),另一種是追加命令到紀錄檔中(AOF模式)。如果只是作為高效的記憶體資料庫使用也可以關閉持久化功能。通過哨兵(sentinel)和自動分割區(Cuuster)的方式可以提高redis伺服器的高可用性。

與關係型資料庫相比,redis的命令請求不需要經過查詢分析器或查詢優化器進行處理,也避免了更新資料時引起的隨機讀寫,這些慢操作。它直接讀寫記憶體中的資料,並且資料是按照一定的資料結構儲存的。所以它的速度非常快。

Redis五種資料結構如下:

  • 字串(string)
  • 雜湊(hash)
  • 列表(list)
  • 集合(set)
  • 有序集合(zset)

對redis來說,所有的key(鍵)都是字串。

字串string

string基本操作

字串string是redis的基本操作型別,一個key對應一個value。並且字串string型別是二進位制安全,也就是說string可以包含任何資料型別,比如圖片,數位,字串等。

  • 字串常用操作
SET  key  value   //存入字串鍵值對
MSET  key  value [key value ...]   //批次儲存字串鍵值對
SETNX  key  value   //存入一個不存在的字串鍵值對
GET  key   //獲取一個字串鍵值
MGET  key  [key ...]    //批次獲取字串鍵值
DEL  key  [key ...]   //刪除一個鍵
EXPIRE  key  seconds   //設定一個鍵的過期時間(秒)
  • 原子加減
INCR  key   //將key中儲存的數位值加1
DECR  key   //將key中儲存的數位值減1
INCRBY  key  increment   //將key所儲存的值加上increment
DECRBY  key  decrement   //將key所儲存的值減去decrement

string使用場景

  • 統計功能(統計網站的存取人數)
  • web叢集session共用
  • 單值快取
set key value
get key
  • 單個物件快取
set user:1 value(json資料)
  • 批次物件快取
mset user:1:name memo user:1:age 1
mget user:1:name user:1:age
  • 分散式鎖
setnx product:10001 true // 返回1代表獲取鎖成功
setnx product:10001 false // 返回0代表獲取鎖失敗
// do...
del product:10001 // 執行完業務刪除鎖
set product:10001 true ex 10 nx //防止程式意外終止導致死鎖(獲取鎖命令+鎖過期命令合二為一)

雜湊hash

hash常用操作

Hash常用操作

HSET key field value                    //儲存一個雜湊表key的鍵值
HSETNX key field value                  //儲存一個不存在的雜湊表key的鍵值 
HMSET key field value [field value ...] //在一個雜湊表key中儲存多個鍵值對 HGET key field                          //獲取雜湊表key對應的field鍵值 HMGET key field [field ...]             //批次獲取雜湊表key中多個field鍵值 HDEL key field [field ...]              //刪除雜湊表key中的field鍵值 
HLEN key                                //返回雜湊表key中field的數量 HGETALL  key                            //返回雜湊表key中所有的鍵值 HINCRBY key field increment    //為雜湊表key中field鍵的值加上增量increment

hash使用場景

電商購物車實現原理

  • 電商購物車
    • 以使用者id為key
    • 商品id為field
    • 商品數量為value
  • 購物車操作
    • 新增商品
hset cart:1001 1008 1 --> hset 使用者id 商品id  商品數量    
  • 增加數量
hincrby cart:1001 1008 1  --> hincrby 使用者id 商品id 增加基數
  • 商品總數
hlen cart:1001 --> hlen 使用者id
  • 刪除商品
hdel cart:1001 1008 --> hdel 使用者id 商品id
  • 獲取購物車所有商品
hgetall cart:1001 --> hgetall 使用者id

hash優缺點

  • 優點
    • 同類資料歸類整合儲存,方便資料管理
    • 相比string操作消耗記憶體與cpu更小
    • 相比string儲存更節省空間
  • 缺點
    • 過期功能不能使用在field上,只能用在key上
    • redis叢集架構下不適合大規模使用

列表list

list常用操作

LPUSH  key  value [value ...]   //將一個或多個值value插入到key列表的表頭(最左邊)
RPUSH  key  value [value ...]    //將一個或多個值value插入到key列表的表尾(最右邊)
LPOP  key  //移除並返回key列表的頭元素
RPOP  key  //移除並返回key列表的尾元素
LRANGE  key  start  stop  //返回列表key中指定區間內的元素,區間以偏移量start和stop指定
BLPOP  key  [key ...]  timeout  //從key列表表頭彈出一個元素,若列表中沒有元素,阻塞等待  timeout秒,如果timeout=0,一直阻塞等待
BRPOP  key  [key ...]  timeout   //從key列表表尾彈出一個元素,若列表中沒有元素,阻塞等待  timeout秒,如果timeout=0,一直阻塞等待

使用list構造資料結構

  • Stack(棧)= lpush+lpop -> FIFO(先進後出,後進先出)
  • Queue(佇列)=lpush+rpop
  • Blocking MQ(阻塞佇列)=LPUSH+BRPOP

List應用場景

  • 微信公眾號訊息

memocoding關注了MacTalk,備胎說車等大V

  • MacTalk發微博,訊息ID為10018
LPUSH msg:{memocoding-ID} 10018
  • 備胎說車發微博 訊息ID 為10086
LPUSH msg:{memocoding-ID} 10086
  • 檢視最新微博訊息
LRANGE msg:{memocoding-ID} 0 5

集合set

常用操作

  • Set常用操作
SADD key member [member ...] // 往集合key中存入元素 元素存在則忽略 若key不存在則新建

SREM key member [member ...] // 從集合key中刪除元素
SMEMBERS key                 // 獲取集合key中所有元素
SISMEMBER key member         // 判斷member元素是否存在於集合key中
SRANDMEMBER key [count]      // 從集合key中選出count個元素 元素不從key中刪除
SPOP key [count]             // 從集合key中選出count個元素 元素從key中刪除
  • Set運算操作
SINTER key [key ...]         // 交集運算
SINTERSTORE destination key [key ...] // 將交集結果存入新集合destination中
SUNION key [key ...]                  // 並集運算
SUNION destination key [key ...]      // 將並集結果存入新集合destination中
SDIFF key [key ...]                   // 差集運算
SDIFFSTORE destination key [key ...]  // 將差集結果存入新集合destination中

set應用場景

微信小程式抽獎活動

  • 點選參與抽獎加入集合
SADD key {userID}
  • 檢視參與抽獎所有使用者
SMEMBERS key
  • 抽取count名中獎者
SRANDMEMBER key [count] // 從集合key中選取count元素,元素不從key中刪除
SPOP key [count] //從集合key中選取count元素 元素從key中刪除 

微信微博點贊 收藏 標籤

  • 點贊
SADD like:{訊息ID} {使用者ID}
  • 取消點贊
SREM like:{訊息ID} {使用者ID}
  • 檢查使用者是否點贊
SISMEMBER like:{訊息ID} {使用者ID}
  • 獲取點讚的使用者列表
SMEMBERS like:{訊息ID}
  • 獲取點贊使用者數
SCARD like:{訊息ID}

有序集合zset

資料結構

  • ZSet 常用操作
ZADD key score member [[score member] ...] // 往有序集合key中加入帶分值元素
ZREM key member [member ...] // 從有序集合key中刪除元素
ZScore key member            // 返回有序集合key中元素member的分值
ZINCRBY key increment member // 為有序集合key中元素member的分值加上increment
ZCARD key                    // 返回有序集合key中元素個數
ZRANGE key start stop [WITHSCORES] // 正序獲取有序集合key從start下標到stop下標的元素
ZREVRANGE start stop [WITHSCORES]  // 倒序獲取有序集合key從start下標到stop下標的元素
  • ZSet集合操作
ZUNIONSTORE destkey numkeys key [key ...] // 並集計算  destkey: 新生成集合   numkeys:後面所有key的集合數量
ZINTERSTORE destkey numkeys key [key ...] // 交集計算

zset應用場景

  • ZSet集合操作實現排行榜

  • 點選新聞

ZINCRBY hostNews:20190819 1 守護香港
  • 展示當日排行前十
ZREVRANGE hostNews:20190819 0 9 WITHSCORES
  • 七日搜尋榜單計算
ZUNIONSTORE hostNews:20190813-20190819 7
hostNews:20190813 hostNews:20190814 ... hostNews:20190819
  • 展示七日排行前十
ZREVRANGE hostNews:20190813-20190819 0 9 WITHSCORES

文章也會持續更新,可以微信搜尋「 邁莫coding 」第一時間閱讀。


IT145.com E-mail:sddin#qq.com