【Redis】數據結構及應用

一. 說明

二. 數據結構

1. String

  1. 二進制安全(能保存任意格式的數據)

2. List

  1. 鏈表結構
  2. 快速的列頭、列尾操作,時間複雜度O(1)
  3. 列表查詢時間複雜度O(N),考慮用Sorted List替代

應用:朋友圈點贊列表

lpush id
lrange 0 -1
ltrim

3. Hash

  1. 文檔
  2. 特點
  • 鍵值對,時間複雜度O(1)

應用:用戶標籤

  1. Hash存儲用戶標籤ID和名稱鍵值對
# 設置
hmset usertag tagID1 tagName1 tagID2 tagName2 tagID3 tagName3 tagID4 tagName4 tagID5 tagName5

# 獲取
hget usertag tagID3

# 獲取所有
hgetall usertag

# 獲取多個
hmget usertag tagID1 tagID2


4. Set

1. 說明

  1. 文檔
  2. 特點
    • 無序
    • 去重
    • 隨機讀取
    • 集合操作(交集、並集、差集)

2. 應用(撲克牌)

  1. 命令
# 初始化
sadd poker T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 TJ TQ TK X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 XJ XQ XK M1 M2 M3 M4 M5 M6 M7 M8 M9 M10 MJ MQ MK F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 FJ FQ FK XW DW

# 數量
scard poker

# 複用撲克牌
sunionstore pokernew poker

# 成員
smembers poker

# 是否包含
sismember poker T1

# 隨機讀取
spop poker

3. 集合操作

# 設置
sadd user1tag tagID1 tagID2 tagID3
sadd user2tag tagID2 tagID3
sadd user3tag tagID2 tagID4 tagID5

# 獲取
smembers user3tag

# 獲取共同擁有的tag(交集)
sinter user1tag user2tag user3tag

# 獲取擁有的所有tag(並集)
sunion user1tag user2tag user3tag

# 獲取兩個之間的區別(差集)
sdiff user2tag user3tag


5. Sorted Set

1. 說明

  1. 文檔

  2. 特點

    • 有序(根據浮點類型分數)
    • 自動去重(zadd命令多次執行會自動更新值及排序)
    • 範圍查詢
    • 數據結構:跳錶(範圍查詢) + Hash(根據value查分數zscore)
    • 時間複雜度(不同命令,時間複雜度不同,以zadd爲例)
  3. 不足

    • 只能存單值,比如ID,不能保存整個用戶信息,可根據ID到數據中獲取,關聯數據也放在緩存中
    • 原子操作:獲取分數-->修改分數
      • 利用lua腳本
      • zincrby命令
      • 分數存儲到另外的地方(比如單獨的緩存),每次重新設置

2. 應用(排行版)

  1. 命令
# rank:key 100: 分數 u1: ID
# 初始化 時間複雜度: O(log(N))
zadd rank 100 u1
zadd rank 200 u2
zadd rank 300 u3
zadd rank 400 u4
zadd rank 500 u5

# 數量
zcard rank

# 內容(正序、倒序)時間複雜度: O(log(N)+M)
zrange rank 0 -1
zrange rank 0 -1 withscores

zrevrange rank 0 -1 withscores
zrevrange rank 0 -2 withscores
zrevrange rank 0 -1

# 獲取用戶分數(不存在返回空) 時間複雜度: O(1)
zscore rank u1

# 修改分數
zadd rank 800 u3

# 修改分數(累加:新增或減少,返回修改後的分數)
zincrby rank 100 u3
zincrby rank -100 u3

# 查詢分數範圍內容(正序、倒序)
zrangebyscore rank (200 800 withscores
zrevrangebyscore rank (200 800 withscores

# 移除元素
zrem rank u3
  1. RedisTemplate

redisTemplate.opsForZSet().add

redisTemplate.opsForZSet().remove

redisTemplate.opsForZSet().score

redisTemplate.opsForZSet().incrementScore

# 排序後的ID集合(分數從高到低排序)
Set<Integer> zsets = redisTemplate.opsForZSet().reverseRange(key, 0, 10)

# 排序後的ID集合(分數從低到高排序)
Set<Integer> zsets = redisTemplate.opsForZSet().range(key, 0, 10)

redisTemplate.opsForZSet().size

# 返回ID的索引位置
redisTemplate.opsForZSet().rank(key,id)

6. Bitmap

1. 說明

  1. 文檔
  2. 原理(按位設置值)
Bitmaps are not an actual data type, but a set of bit-oriented operations defined on the String type. Since strings are binary safe blobs and their maximum length is 512 MB, they are suitable to set up to 2 32 different bits

2. 應用(打卡/簽到)

  1. 命令
# usersign:key 0 位數(按月/年) 0/1(簽到標識)

# 設置位數狀態(按月、按年)
setbit usersign 0 1
setbit usersign 1 1
setbit usersign 2 0
setbit usersign 5 1
setbit usersign 6 1

# 返回設置爲1的數量
bitcount usersign

# 返回第一個設置爲1的位置
bitpos usersign 1

# 返回指定位置的值(值爲0或未設置返回0)
getbit usersign 1

7. Stream

在這裏插入圖片描述

  • 消息隊列實現方案
  1. 對比
參數 List Stream
消息寫入 lpush xadd
消息讀取 rpop brpop xread xdel xreadgroup
有序 業務方處理 自動生成全局唯一遞增ID(時間戳+時間戳內自增)
冪等 業務方處理 業務方處理
消息可靠 xpending xack
消費者組 xgroup
  1. List
# 寫入消息隊列
lpush mqlist m1
lpush mqlist m2
lpush mqlist m3

# 隊列長度
llen mqlist

# 隊列內容
lrange mqlist 0 -1

# 隊列取數據
rpop mqlist

# 隊列取數據(阻塞)
brpop mqlist 
brpop mqlist 3(timeout sec)

# 消息備份(消費者程序從一個 List 中讀取消息,再把這個消息插入到另一個 List)
brpoplpush mqlist

  1. Stream
# 隊列長度
xlen mqstream

# 隊列內容
xrange mqstream - +

# 隊列取數據(不會刪除元素)
xread count 1 streams mqstream 0

# 隊列取數據(阻塞)
xread count 1 block 3000(timeout millisec) streams mqstream 0

# 刪除元素
xdel mqstream ID

# 消費者組(多個消費者消費同一個隊列消息)
# 最後一個參數 0:表示從隊頭開始消費 $:表示從隊尾(即新元素)開始消費 ID:從指定ID位置開始消費
xgroup create mqstream group1 0
 
xreadgroup group group1 consumer1 streams mqstream >
xreadgroup group group1 consumer2 streams mqstream >


# 確認消息(正常讀不用調用此命令)
# 爲了保證消費者在發生故障或宕機再次重啓後,仍然可以讀取未處理完的消息,Streams 會自動使用內部隊列
#(也稱爲 PENDING List)留存消費組裏每個消費者讀取的消息,直到消費者使用 XACK 命令通知 Streams "消息已經處理完成"
xpending mqstream group1 
xack mqstream group1 ID
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章