Redis的資料結構與應用場景

MXC肖某某發表於2021-02-18

一、Redis簡介

  Redis 是一個開源的使用 ANSI C 語言編寫、遵守 BSD 協議、支援網路、可基於記憶體、分散式、可選永續性的鍵值對(Key-Value)儲存資料庫,並提供多種語言的 API。

  Redis 通常被稱為資料結構伺服器,因為值(value)可以是字串(String)、雜湊(Hash)、列表(list)、集合(set)和有序集合(sorted set)等型別。

二、字串(String)

1,常用指令

#常用操作
SET key value                         //存入字串鍵值對
MSET key value [key value ...]        //批量儲存字串鍵值對
SETNX key value                       //當且僅當key不存在,存入value返回1;若key已存在,則不做操作返回0。
GET key                               //獲取一個key對應的value
MGET key [key ...]                    //批量獲取字串鍵值
DEL key [key ...]                     //刪除鍵
#原子加減操作
INCR key                              //將key中儲存的數字值(value為string報錯)加1
DECR key                              //將key中儲存的數字值(value為string報錯)減1
INCRBY key n                          //將key中儲存的數字值加n
DECRBY key n                          //將key中儲存的數字值減n

2,應用場景

a)單值快取

  • SET key value
  • GET key

b)物件快取

  • SET user:1 value(json格式資料)
  • MSET user:1:name zs user:1:age 18  user:2:name ls user:2:age 20

  採用String型別的物件快取有兩種方式:1.直接快取整個物件的json;2.採用將key進行分離為user:ID:屬性,採用MSET儲存,用MGET獲取各屬性值。

c)分散式鎖

  • set product:10001 true ex 10 nx
SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX seconds :設定失效時間,單位秒
PX milliseconds:設定失效時間,單位毫秒
NX : key不存在時設定value,成功返回OK,失敗返回nil
XX : key存在時設定value,成功返回OK,失敗返回nil

  設定key為product:ID過期時間為10s,如果當前key已經存在就會直接返回nil。

d)計數器

  • INCR aritcle:readcount:{文章id}
  • GET aritcle:readcount:{文章id}

e)分散式系統全域性序列號

  • INCRBY orderId 10

三、雜湊(Hash)

1,常用命令

#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 n                         //為雜湊表key中field鍵的值加上增量n

2,應用場景

a)物件儲存

  • HMSET user 1:name zs 1:age 20
  • HMGET user 1:name 1:age

  當需要儲存的物件不大時,可以採用固定的key,對應的field為ID:屬性,採用HMSET的方式,這樣就能將所有的物件儲存在同一個key中;

  當需要儲存的物件比較大時,可以將key進行動態分離開,例如:設定key為user:序號,序號為0~1000,每個儲存物件根據id%序號,確定當前物件分配到哪個key中。

b)購物車

  定義:使用者id為key,商品id為field,商品數量為value

  • 新增商品:hset cart:1001 1100 1
  • 新增數量:hincrby cat:1001 1100 1
  • 商品總數:hlen cart:1001
  • 刪除商品:hdel cart:1001 1100
  • 獲取購物車所有商品:hgetall cart:1001

3,hash結構優缺點

a)優點

  • 同類資料歸類整合儲存,方便資料管理
  • 相比String操作消耗記憶體與cpu更小
  • 相比String儲存更省空間

b)缺點

  • 過期功能不能使用在field上,只能用在key上
  • Redis叢集架構下不適合大規模使用(容易造成資料傾斜)

四、列表(list)

1,常用命令

#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指定,從0開始
BLPOP key [key ...] timeout                 //從key列表表頭彈出一個元素,沒有就阻塞timeout秒,如果timeout=0則一直阻塞
BRPOP key [key ...] timeout                 //從key列表表尾彈出一個元素,沒有就阻塞timeout秒,如果timeout=0則一直阻塞

2,應用場景

a)常用資料結構

  • stack(棧) = LPUSH + LPOP -> FIFO
  • queue(佇列) = LPUSH + RPOP
  • Blocking MQ(阻塞佇列) = LPUSH + BRPOP

b)微博訊息和微信公眾號訊息

  使用者A關注了公眾號B和公眾號C

  • B發微博,訊息ID為1001。LPUSH msg:AID 1001
  • C發微博,訊息ID為1002。LPUSH msg:AID 1002
  • A檢視微博前五條。LRANGE msg:AID 0 4 

五、集合(Set)

1,常用命令

#Set常用操作
SADD key member [member ...]                //往集合key中存入元素,元素存在則忽略,若key不存在則新建
SREM key member [member ...]                //從集合key中刪除元素
SMEMBERS key                                //獲取集合key中所有元素
SCARD 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 ...]                        //並集運算
SUNIONSTORE destination key [key ...]       //將並集結果存入新集合destination中
SDIFF key [key ...]                         //差集運算
SDIFFSTORE destination key [key ...]        //將差集結果存入新集合destination中

2,應用場景

a)微信微博點贊,收藏,標籤

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

b)微博微信關注模型

  • A關注的人:aSet -> {b,c,d}
  • B關注的人:bSet -> {a,c,d,e}
  • C關注的人:cSet -> {a,b,d,e,f}
  • A和B共同關注的人:SINTER aSet bSet ->{c,d}
  • A關注的人也關注C:A可能認識的人:SDIFF bSet aSet -> {a,e}
    • SISMEMBER cSet b 
    • SISMEMBER cSet d

六、有序集合(sorted set)

1,常用命令

#ZSet常用操作
ZADD key score member [[score member]...]   //往有序集合key中加入帶分值元素
ZREM key member [member...]                 //往有序集合key中刪除元素
ZSCORE key member                           //返回有序集合key中元素member的分值
ZINCREBY key increment member               //為有序集合key中元素member的分值加上increment
ZCARD key                                   //返回有序集合key中元素個數
ZRANGE key start stop [WITHSCORES]          //正序獲取有序集合key從start下標到stop下標的元素
ZREVRANGE key start stop [WITHSCORES]       //倒序獲取有序集合key從start下標到stop下標的元素
#ZSet運算操作
ZUNIONSTORE destkey numberkeys key [key...] //並集計算(相同元素分值相加),numberkeys一共多少個key,WEIGHTS每個key對應的分值乘積
ZINTERSTORE destkey numberkeys key [key...] //交集計算(相同元素分值相加),numberkeys一共多少個key,WEIGHTS每個key對應的分值乘積

2,應用場景

a)微博熱搜榜

  • 點選新聞:ZINCRBY hotNews:210218 1 春節零售餐飲消費超8000億元  (將當前新聞的分值加1)
  • 展示當日排行前十:ZRERANGE hotNews:210218 0 9 WITHSCORES 
  • 七日搜尋榜單計算:ZUNIONSTORE hotNews:210212-210218 7 hotNews:210212 hotNews:210213 ... hotNews:210218
  • 展示七日排行前七:ZREVRANGE hotNews:210212-210218 0 9 WITHSCORES

 

相關文章