深入解析Redis中的資料結構,聊聊應用場景

2022-01-18 10:00:31
本篇文章帶大家深入瞭解一下Redis中的資料結構,看看這些資料結構的應用場景,希望對大家有所幫助!

Redis資料型別和應用場景

Redis是一個Key-Value的儲存系統,使用ANSI C語言編寫。 key的型別是字串。【相關推薦:Redis視訊教學

value的資料型別8種資料型別:

  • 常見資料型別

    • string字串型別

    • list列表型別

    • set集合型別

    • sortedset(zset)有序集合型別

    • hash型別

  • 不常見資料型別

    • bitmap點陣圖型別

    • geo地理位置型別

    • stream型別

  • 注意

    Redis中命令是忽略大小寫,(set SET),key是不忽略大小寫的 (NAME name)

1.png

string字串型別

Redis的String能表達3種值的型別:字串、整數、浮點數 100.01 是個六位的串

常用命令

命令名稱命令格式命令描述
setset key value賦值
getget key取值
getsetgetset key value取值並賦值
msetMSET key1 value1 key2 value2 .. keyN valueN設定多個 key 的值為各自對應的 value。
mgetMGET KEY1 KEY2 .. KEYN返回所有(一個或多個)給定 key 的值
EXPIREEXPIRE key seconds設定一個鍵的過期時間(秒)
appendappend key value向尾部追加值
strlenstrlen key獲取字串長度
setnxsetnx key value當value不存在時採用賦值
set key value NX PX 3000 原子操作,px 設定毫秒數
incrincr key遞增數位
incrbyincrby key increment增加指定的整數
decrdecr key遞減數位
decrbydecrby key decrement減少指定的整數

應用場景

  • 1、物件快取

  • 2、單值快取

  • 3、incr用於樂觀鎖 incr:遞增數位,可用於實現樂觀鎖 watch(事務)

  • 4、setnx用於分散式鎖 當value不存在時採用賦值,可用於實現分散式鎖

  • 5、計數器

  • 6、Web叢集session共用

常用方法舉例

dockerRedis:0>keys *
dockerRedis:0>append testName 2
"1"
dockerRedis:0>exists testName
"1"
dockerRedis:0>append testName " 1234"
"6"
dockerRedis:0>get testName
"2 1234"
dockerRedis:0>set testName1 "testName1"
"OK"
dockerRedis:0>get testName1
"testName1"
dockerRedis:0>getset testName2 "testName2"
null
dockerRedis:0>get testName2
"testName2"
dockerRedis:0>strlen testName
"6"
dockerRedis:0>set incrTest "10"
"OK"
dockerRedis:0>incr incrTest
"11"
dockerRedis:0>get incrTest
"11"
dockerRedis:0>decr incrTest
"10"
dockerRedis:0>decrby incrTest 5
"5"
dockerRedis:0>mset set01 1 set02 2 set03 3
"OK"
dockerRedis:0>mget set01 set02 set03
1) "1"
2) "2"
3) "3"

list列表型別

list列表型別可以儲存有序、可重複的元素獲取頭部或尾部附近的記錄是極快的 list的元素個數最多為2^32-1個(40億)

常用命令

命令名稱命令格式命令描述
lpushlpush key v1 v2 v3 ...從左側插入列表
lpoplpop key從列表左側取出
rpushrpush key v1 v2 v3 ...從右側插入列表
rpoprpop key從列表右側取出
lpushxlpushx key value將值插入到列表頭部
blpopblpop key timeout從列表左側取出,當列表為空時阻塞,可以設定最大阻塞時間,單位為秒
llenllen key獲得列表中元素個數
lrangelrange key start end返回列表中指定區間的元素,區間通過start和end指定
lsetlset key index value將列表index位置的元素設定成value的值
rpoplpushrpoplpush key1 key2從key1列表右側彈出並插入到key2列表左側
rpushxrpushx key將值插入到列表尾部 value
brpopblpop key從列表右側取出,當列表為空時阻塞,可以設定最大阻塞時 timeout 間,單位為秒
lindexlindex key value獲得列表中下標為index的元素 index從0開始 index
ltrimltrim key start end對列表進行修剪,只保留start到end區間 end
brpoplpushbrpoplpush從key1列表右側彈出並插入到key2列表左側,會阻塞 key1 key2
linsertlinsert key BEFORE/AFTER pivot value將value插入到列表,且位於值pivot之前或之後

應用場景

  • 1、Stack(棧)=LPUSH + LPOP

  • 2、Queue(佇列)=LPUSH + RPOP

  • 3、Blocking MQ(阻塞佇列)=LPUSH + BRPOP

  • 4、使用者列表、商品列表、評論列表

set集合型別

Set:無序、唯一元素 集合中最大的成員數為 2^32 - 1

常用命令

命令名稱命令格式命令描述
saddsadd key value1 value2 ....往集合key中存入元素,元素存在則忽略,若key不存在則新建
sremsrem key value1 value2 ....從集合key中刪除元素
smemberssmembers key獲得集合中所有元素
spopspop key count從集合key中選出count個元素,元素從key中刪除
srandmembersrandmember key count從集合key中選出count個元素,元素不從key中刪除
scardscard key獲取集合key的元素個數
sismembersismember key member判斷member元素是否存在於集合key中
sintersinter key1 key2 key3求多集合的交集
sdiffsdiff key1 key2 key3求多集合的差集
sunionsunion key1 key2 key3求多集合的並集

應用場景

  • 微信抽獎小程式

  • 微博點贊、收藏、標籤

  • 微博微信關注模型

  • 電商商品篩選

zset有序集合型別

SortedSet(ZSet) 有序集合: 元素本身是無序不重複的 每個元素關聯一個分數(score) 可按分數排序,分數可重複

常用命令

命令名稱命令格式命令描述
zaddzadd key score1 member1 score2 member2 ...往有序集合key中加入帶分值元素
zremzrem key mem1 mem2 ....從有序集合key中刪除元素
zcardzcard key獲得有序集合中的元素數量
zcountzcount key min max返回集合中score值在[min,max]區間 的元素數量
zincrbyzincrby key increment member為有序集合key中元素member的分值加上increment
zscorezscore key member返回有序集合key中元素member的分值
zrankzrank key member獲得集合中member的排名(按分值從 小到大)
zrangezrange key start end正 序獲取有序集合key從start下標到stop下標的元素
zrevrankzrevrank key member獲得集合中member的排名(按分值從 大到小)
zrevrange zrevrange key start end倒序獲取有序集合key從start下標到stop下標的元素

應用場景

  • 點選排行榜、銷量排行榜、關注排行榜

hash型別

Redis hash是一個string型別的field和value的對映表,它提供了欄位和欄位值的對映。每個 hash 可以儲存 2^32-1鍵值對(40多億)。

2.png

  • 優點

    • 1、同類資料歸類整合儲存,方便資料管理

    • 2、相比string操作消耗記憶體與cpu更小

    • 3、相比string儲存更節省空間

  • 缺點

    • 1、過期功能不能使用在field上,只能用在key上

    • 2、Redis叢集架構下不適合大規模使用

常用命令

命令名稱命令格式命令描述
hsethset key field value儲存一個雜湊表key的鍵值
hmsethmset key field1 value1 field2 value2在一個雜湊表key中儲存多個鍵值對
hgethget key field檢視某個field是否存在
hmgethmget key field1 field2 ...獲取一個欄位值
hsetnxhsetnx key field value儲存一個不存在的雜湊表key的鍵值
hexistshexists key filed判斷filed是否存在
hgetallhgetall key獲取多個欄位值
hdelhdel key field1 field2...刪除指定欄位
hincrbyhincrby key field increment指定欄位自增increment
hlenhlen key獲得欄位數量

應用場景

  • 物件快取

  • 購物車操作

bitmap點陣圖型別

bitmap是進行位元運算的 通過一個bit位來表示某個元素對應的值或者狀態,其中的key就是對應元素本身。 bitmap本身會極大的節省儲存空間。

常用命令

命令名稱命令格式命令描述
setbitsetbit key offset value設定key在offset處的bit值(只能是0或者 1)。
getbitgetbit key offset獲得key在offset處的bit值
bitcountbitcount key獲得key的bit位為1的個數
bitposbitpos key value返回第一個被設定為bit值的索引值
bitopbitop and[or/xor/not] destkey key [key ...]對多個key 進行邏輯運算後存入destkey 中

應用場景

  • 1、使用者每月簽到,使用者id為key , 日期作為偏移量 1表示簽到
  • 2、統計活躍使用者, 日期為key,使用者id為偏移量 1表示活躍
  • 3、查詢使用者線上狀態, 日期為key,使用者id為偏移量 1表示線上

geo地理位置型別

geo是Redis用來處理位置資訊的。在Redis3.2中正式使用。主要是利用了Z階曲線、Base32編碼和geohash演演算法

常用命令

命令名稱命令格式命令描述



geoaddgeoadd key 經度 緯度 成員名稱1 經度1 緯度1 成 員名稱2 經度2 緯度 2 ...新增地理座標
geoposgeopos key 成員名稱1 成員名稱2...返回成員經緯度
geodistgeodist key 成員1 成員2 單位計算成員間距離
georadiusbymembergeoradiusbymember key 成員 值單位 count 數 asc[desc]根據成員查詢附近的成員
geohashgeohash key 成員名稱1 成員名稱2...返回標準的 geohash串

應用場景

1、記錄地理位置

2、計算距離

3、查詢"附近的人"

stream資料流型別

stream是Redis5.0後新增的資料結構,用於可持久化的訊息佇列。

幾乎滿足了訊息佇列具備的全部內容,包括:

  • 訊息ID的序列化生成
  • 訊息遍歷
  • 訊息的阻塞和非阻塞讀取
  • 訊息的分組消費
  • 未完成訊息的處理
  • 訊息佇列監控

每個Stream都有唯一的名稱,它就是Redis的key,首次使用 xadd 指令追加訊息時自動建立

應用場景

訊息佇列的使用

更多程式設計相關知識,請存取:!!

以上就是深入解析Redis中的資料結構,聊聊應用場景的詳細內容,更多請關注TW511.COM其它相關文章!