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

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

青灯夜游
發布: 2022-01-18 09:51:45
轉載
2025 人瀏覽過

這篇文章帶大家深入了解Redis中的資料結構,看看這些資料結構的應用場景,希望對大家有幫助!

深入解析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)

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

string字串型別

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

#常用指令

##getget key取值getsetgetset key value取值並賦值msetMSET key1 value1 key2 value2 .. keyN valueN設定多個  的值為各自對應的value。 mgetMGET KEY1 KEY2 .. KEYN傳回所有(一個或多個)給定key 的值#EXPIREEXPIRE   key  seconds設定一個鍵的過期時間(秒)append append key value向尾部追加值strlenstrlen key 取得字串長度#setnxset key value NX PX 3000 原子操作,px 設定毫秒數incrincr key#遞增數字incrbyincrby key increment增加指定的整數decrdecr key遞減數字##decrby
指令名稱 指令格式 指令描述
#set set key value 賦值
key

setnx key value 當value不存在時採用賦值
decrby 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億)

#常用指令

##rpoprpop key從清單右側取出lpushxlpushx key 值將值插入到清單頭部blpopblpop key timeout#從清單左側取出,當清單為空時阻塞,可以設定最大阻塞時間,單位為秒llenllen key在清單中取得元素個數lrangelrange key start end傳回清單中指定區間的元素,區間透過start和end指定lsetlset key index value將清單index位置的元素設定成value的值rpoplpushrpoplpush key1 key2從key1清單右側彈出並插入到key2列表左側rpushxrpushx key將值插入到列表尾部valuebrpopblpop key從清單右側取出,當清單為空時阻塞,可以設定最大阻塞時timeout 間,單位為秒 lindexlindex key value取得清單中下標為index的元素index從0開始index##ltrimbrpoplpush#linsert
指令名稱 指令格式 指令描述
#lpush lpush key v1 v2 v3 . .. 從左側插入清單
lpop #lpop key 從清單左側取出
#rpush rpush key v1 v2 v3 ... #從右側插入清單
ltrim key start end 對清單進行修剪,只保留start到end區間end
brpoplpush 從key1清單右側彈出並插入到key2清單左側,會阻塞key1 key2
linsert 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 ....srem key value1 value2 ....smembers keyspop key count#srandmember key countscard key#sismember key membersinter key1 key2 key3 #sdiff key1 key2 key3sunion key1 key2 key3
指令描述
#往集合key存入元素,元素存在則忽略,若key不存在則新建 #srem
#從集合key中刪除元素 smembers
獲得集合中所有元素 spop
從集合key中選出count個元素,元素從key中刪除 srandmember
從集合key中選出count個元素,元素不​​會從key中刪除 scard
取得集合key的元素個數 sismember
判斷member元素是否存在於集合key中 sinter
求多集合的交集 sdiff
求多集合的差集 #sunion
#求多集合的並集 #

應用場景

  • 微信抽獎小程式

  • #微博按讚、收藏、標籤

  • 微博微信關注模型

  • 電商商品篩選

zset有序集合類型

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

常用指令

##指令名稱指令格式指令描述zaddzadd key score1 member1 score2 member2 ...在有序集合key中加入帶分數元素zremzrem key mem1 mem2 ....zcardzcountzincrbyzscorezrankzrangezrevrankzrevrange
##從有序集合key中刪除元素
zcard key 取得有序集合中的元素數量
zcount key min max 傳回集合中score值在[min,max]區間的元素數量
zincrby key increment member 為有序集合key中元素member的分數值加上increment
#zscore key member 傳回有序集合key中元素member的分數
zrank key member 取得集合中member的排名(按分數從小到大)
zrange key start end 正序取得有序集合key從start下標到stop下標的元素
zrevrank key member 取得集合中member的排名(按分數從大到小)
 zrevrange key start end 倒序取得有序集合key從start下標到stop下標的元素
#應用程式場景

點擊排行榜、銷售排行榜、追蹤排行榜
  • hash類型

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

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

    優點
    • #1、同類資料歸類整合儲存,方便資料管理
    • 2、比起string操作消耗記憶體與cpu更小
    • #3、比起string儲存更節省空間
  • 缺點
    • 1、過期函數不能使用在field上,只能用在key上
    • 2.Redis叢集架構下不適合大規模使用
#常用指令

#指令名稱##hdelhdel key field1 field2...刪除指定欄位#hincrbyhincrby key field increment#指定欄位自增incrementhlen
指令格式 指令描述
#hset hset key field value 儲存一個哈希表key的鍵值
hmset hmset key field1 value1 field2 value2 #在一個哈希表key中儲存多個鍵值對
hget hget key field 查看某個field是否存在
hmget hmget key field1 field2 ... 取得一個欄位值
hsetnx hsetnx key field value 儲存一個不存在的雜湊表key的鍵值
#hexists hexists key filed #判斷filed是否存在
hgetall hgetall key #取得多個欄位值

hlen 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值的索引值
常用指令
指令描述
###bitop#######bitop 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...傳回成員經緯度geodist geodist key 成員1 成員2 單位#計算成員間距離georadiusbymembergeoradiusbymember key 成員值單位count 數asc [desc]根據成員找出附近的成員
指令名稱 指令格式 指令描述



geohash

geohash key 成員名稱1 成員名稱2...

傳回標準的geohash字串

應用場景

1、記錄地理位置 
  • #2、計算距離
  • 3、查找"附近的人"
  • stream資料流類型
  • stream是Redis5.0後新增的資料結構,用於可持久化的訊息佇列。
  • 幾乎滿足了訊息佇列具備的全部內容,包括:
  • 訊息ID的序列化產生

訊息遍歷

訊息的阻塞和非阻塞讀取訊息的分組消費

未完成訊息的處理

訊息佇列監控

每個Stream都有唯一的名稱,它就是Redis的key,首次使用xadd 指令追加訊息時自動建立##########應用程式場景#########訊息佇列的使用######更多程式設計相關知識,請造訪:###程式設計入門###! ! ###

以上是深入解析Redis中的資料結構,聊聊應用場景的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:juejin.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板