玩轉Redis-Redis高級數據結構及核心命令-ZSet

  《玩轉Redis》系列文章主要講述Redis的基礎及中高級應用,文章基於Redis5.0.4+。本文主要講述Redis的常見高級數據結構ZSet,《玩轉Redis-Redis高級數據結構及核心命令》相關操做命令爲方便對比分析,使用腦圖展現(若手機端查看圖片不方便,可搜索zxiaofan前往PC網頁端<CSDN、 開源中國 等平臺>查看)。
  最新思惟導圖原圖可聯繫公衆號【zxiaofan】後臺獲取。git

Redis-最新思惟導圖原圖

  本文更適合用於複習總結,閱讀》實戰》閱讀 更有效果喲,主要包含如下內容:github

  • Sorted Set(有序集合);

  Redis基礎數據結構及核心命令詳見上一篇文章《玩轉Redis-Redis基礎數據結構及核心命令》,百度或訂閱號搜索zxiaofan便可:bash

  • String(字符串);
  • List(列表);
  • Set(集合);
  • Hash(散列);

文章思路:微信

  • 數據結構應用場景及注意事項;
  • 數據結構各命令對比分析;

異常統一說明:
error(out of range)導圖簡寫@EOOR;
負數偏移量表示倒數第幾,導圖簡寫@LBN(last but number);數據結構


一、ZSet應用場景及注意事項

1.一、ZSet應用場景

  ZSet主要適用於須要 排序(排行榜) 的場景,如:ui

  • 粉絲列表(按關注時間排序);
  • 學生成績排名;
  • 文章帖子排名;
  • 各種榜單(如微博總熱榜、分類熱榜);

1.二、ZSet注意事項

  • ZSet具有惟一性、有序性:相似Java的SortedSet和HashMap的結合體;
  • 底層結構:跳躍列表;
  • setvalue惟一;setvalue有score屬性,按此排序;score越小排名越靠前
  • 最後一個value被移除後,數據結構自動刪除,內存被回收;

二、ZSet各命令對比分析

概述:spa

  • ZSet命令支持如下操做類型:增長、統計、查詢、刪除/彈出;
  • 命令中的lex爲lexicographical(ordering),表示按字典規則排序;
  • ZSet參數正負無窮大表示:分數(+inf、-inf);字典排序(+、-);

2.一、ZSet增長與統計

【核心命令】

  • 增長【ZADD、ZINCRBY】;
  • 統計數量【ZCARD、ZCOUNT、ZLEXCOUNT】;
  • 集合運算【ZUNIONSTORE、ZINTERSTORE】;

注意:

  • 【ZADD】支持新增、更新數據:XX存在才更新分數;INCR增減分數;
  • 【ZINCRBY】increment避免使用浮點數,結果易出錯;
  • 【ZCARD、ZCOUNT、ZLEXCOUNT】統計集合(全部、指定分數區間、指定元素區間)元素個數;
  • 【ZUNIONSTORE、ZINTERSTORE】多個集合並集、交集運算;

【Redis-ZSet增長與統計元素操做】命令簡述:

命令 功能 參數
ZADD 添加元素及分數到有序集合 key [NX|XX] [CH] [INCR] score member [score member ...]
ZINCRBY 增長/減小分數 key increment member
ZCARD 統計有序集合的元素個數 key
ZCOUNT 統計指定【score區間】的元素個數 key min max
ZLEXCOUNT 統計指定【元素區間】的元素個數 key min max
ZINTERSTORE 計算指定有序集的【交集】並將結果存入目標集合 destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
ZUNIONSTORE 計算指定有序集的【並集】並將結果存入目標集合 destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

【Redis-ZSet增長與統計元素操做】命令詳細對比分析以下:

Redis-ZSet增長與統計元素操做

【ZINCRBY】命令示例:

# 【ZINCRBY】命令示例 @zxiaofan

127.0.0.1:6378> zincrby zset2 2 m
"2"

127.0.0.1:6378> zincrby zset2 2.2 m
"4.2000000000000002"
複製代碼

【ZUNIONSTORE】命令示例:

# 【ZUNIONSTORE】命令示例 @zxiaofan

127.0.0.1:6378> zadd zset1 1 a 2 b 2 c 3 d
(integer) 4

127.0.0.1:6378> zadd zset2 2 a 3 b
(integer) 2

127.0.0.1:6378> zunionstore outset 2 zset1 zset2 weights 1 3
(integer) 4

127.0.0.1:6378> zrange outset 0 -1 withscores
1) "c"
2) "2"
3) "d"
4) "3"
5) "a"
6) "7"
7) "b"
8) "11"

127.0.0.1:6378> zunionstore outset 2 zset1 zset2 weights 1 3.5
(integer) 4

127.0.0.1:6378> zrange outset 0 -1 withscores
1) "c"
2) "2"
3) "d"
4) "3"
5) "a"
6) "8"
7) "b"
8) "12.5"

127.0.0.1:6378> zunionstore outset 2 zset1 zset2 weights 2
(error) ERR syntax error

127.0.0.1:6378> zunionstore outset 2 zset1 zset2 weights 1 3 AGGREGATE MIN
(integer) 4

127.0.0.1:6378> zrange outset 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "2"
7) "d"
8) "3"

127.0.0.1:6378> zunionstore outset 2 zset1 zset2 weights 1 3 AGGREGATE MAX
(integer) 4

127.0.0.1:6378> zrange outset 0 -1 withscores
1) "c"
2) "2"
3) "d"
4) "3"
5) "a"
6) "6"
7) "b"
8) "9"

複製代碼

2.二、ZSe查詢

【核心命令】

  • 查詢分數【ZSCORE】;
  • 查詢排名【ZRANK、ZREVRANK】;
  • 按排名排序查詢【ZRANGE、ZREVRANGE】;
  • 按字典順序排序查詢【ZRANGEBYLEX、ZREVRANGEBYLEX】;
  • 按分數排序查詢【ZRANGEBYSCORE、ZREVRANGEBYSCORE】;
  • 分頁迭代【ZSCAN】;

注意:

  • 【ZSCORE】可用於判斷集合中是否存在某元素;.net

  • 【ZRANK、ZREVRANK】查詢排名3d

    • 排名以0爲基數計算;
    • 排序規則:按分數排序,分數相同按字典順序排序;
  • 【ZRANGE、ZREVRANGE】按排名查詢code

    • 排序規則:分數從小到大/從大到小,相同分數按照字典排序;
    • 排序序號從0開始,負數表示末偏移量:0即第一個元素,-1即最後一個元素;
    • statr、stop均是閉區間,不支持開區間;
    • 返回空列表:start>集合總數 或者 start>stop;
  • 【ZRANGEBYLEX、ZREVRANGEBYLEX】按字典順序排序查詢

    • 【前提】對元素分數相同的集合排序;
      • 分數不一樣排序結果可能不許;
      • 實測:先按分數排序,分數相同按字典排序;
    • 排序大小寫敏感;
    • 若分數相同,ZRANGEBYLEX myzset - +將返回整個集合的元素;
    • LIMIT:相似於SQL的SELECT LIMIT offset, count。
      • count爲負,則返offset後的全部元素;
      • offset從0開始計算;
      • 若offset很大,則命令需遍歷整個集合定位offset,複雜度將增長到O(N);
    • 示例場景
      • 獲取指定電話號段,如181開頭的電話;
      • 獲取指定姓氏的人名,如李XX;
    • ZREVRANGEBYLEX:參數max在前min在後;
  • 【ZRANGEBYSCORE、ZREVRANGEBYSCORE】按分數排序查詢

    • 排序大小寫敏感;
    • 分數相同:按字典順序排序;
    • LIMIT:含義和ZRANGEBYLEX相同;
    • ZREVRANGEBYSCORE的結果:和ZRANGEBYSCORE排序結果徹底相反;

【Redis-ZSe查詢】命令簡述:

命令 功能 參數
ZSCORE 查詢指定元素的score key member
ZRANK 查詢指定元素的【正序】排名 key member
ZREVRANK 查詢指定元素的【逆序】排名 key member
ZRANGE 查詢指定【排名區間】的元素(和分數) key start stop [WITHSCORES]
ZREVRANGE 【逆序】查詢指定【排名區間】的元素(和分數) 同【ZRANGE】
ZRANGEBYSCORE 查詢指定【分數區間】的元素 key min max [WITHSCORES] [LIMIT offset count]
ZREVRANGEBYSCORE 【逆序】查詢指定【分數區間】的元素 key max min [WITHSCORES] [LIMIT offset count]
ZSCAN 分頁遍歷有序集合 key cursor [MATCH pattern] [COUNT count]

【Redis-ZSe查詢】命令詳細對比分析以下:

Redis-ZSe查詢1
Redis-ZSe查詢2

【ZRANGEBYLEX】命令示例:

# 【ZRANGEBYLEX】命令示例 @zxiaofan

127.0.0.1:6378> zadd zset1 1 a 2 b 2 c 3 d 3 D 2 A 2 C 2 ba 2 bc 2 bA
(integer) 0

127.0.0.1:6378> zrangebylex zset1 [A [t
 1) "a"
 2) "A"
 3) "C"
 4) "b"
 5) "bA"
 6) "ba"
 7) "bc"
 8) "c"
 9) "D"
10) "d"

127.0.0.1:6378> zrangebylex zset1 [a [t LIMIT 2 1
1) "C"

127.0.0.1:6378> zrangebylex zset1 [a [t LIMIT 2 -1
1) "C"
2) "b"
3) "bA"
4) "ba"
5) "bc"
6) "c"
7) "D"
8) "d"

複製代碼

【ZREVRANGEBYLEX】命令示例:

# 【ZREVRANGEBYLEX】命令示例 @zxiaofan

127.0.0.1:6378> zadd zset1 1 a 2 b 2 c 3 d 3 D 2 A 2 C 2 ba 2 bc 2 bA
(integer) 0

127.0.0.1:6378> zrevrangebylex zset1 [t [A
 1) "d"
 2) "D"
 3) "c"
 4) "bc"
 5) "ba"
 6) "bA"
 7) "b"
 8) "C"
 9) "A"
10) "a"

複製代碼

【ZREVRANGEBYSCORE】命令示例:

# 【ZREVRANGEBYSCORE】命令示例 @zxiaofan

127.0.0.1:6378> zadd zset2 1 a 2 b 3 c 3 A 3 Aa 4 B
(integer) 0

127.0.0.1:6378> zrangebyscore zset2 1 6
1) "a"
2) "F"
3) "b"
4) "g"
5) "A"
6) "Aa"
7) "c"
8) "B"

127.0.0.1:6378> zrevrangebyscore zset2 6 1
1) "B"
2) "c"
3) "Aa"
4) "A"
5) "g"
6) "b"
7) "F"
8) "a"
複製代碼

2.三、ZSe刪除

【核心命令】

  • 刪除元素【ZREM、ZREMRANGEBYLEX、ZREMRANGEBYLEXBYRANK、ZREMRANGEBYSCORE】;
  • 彈出元素【ZPOPMAX、ZPOPMIN、BZPOPMAX、BZPOPMIN】;

注意:

  • 刪除元素支持刪除指定key,還支持按照字典順序、排名、分數刪除;
  • 【ZREMRANGEBYLEX】ZSet的全部元素Score必須相同,不然結果不許確;
  • 【ZREMRANGEBYRANK】按排名刪除元素。即便分數相同,排名確定不一樣;
  • 【ZPOPMAX】移除並彈出分數最大的元素,若是分數相同,按字典順序降序排序;
  • 【BZPOPMAX】和【ZPOPMAX】的區別不單單在於阻塞彈出,還在於BZPOPMAX支持操做多個key;

【Redis-ZSe刪除】命令簡述:

命令 功能 參數
ZREM 刪除指定元素 key member [member ...]
ZREMRANGEBYLEX 刪除score徹底相同集合中指定區間的元素 key min max
ZREMRANGEBYRANK 刪除指定排名區間的元素 key start stop
ZREMRANGEBYSCORE 移除指定score的元素 key min max
ZPOPMAX 【移除】並彈出count個分數最大的元素 key [count]
ZPOPMIN 【移除】並彈出count個分數最小的元素 key [count]
BZPOPMAX 【阻塞移除】並彈出count個分數最大的元素 key [key ...] timeout
BZPOPMIN 【阻塞移除】並彈出count個分數最小的元素 key [key ...] timeout

【Redis-ZSe刪除】命令詳細對比分析以下:

Redis-ZSe刪除

【ZREMRANGEBYRANK】命令示例:

#### 【ZREMRANGEBYRANK】命令示例 @zxiaofan 

127.0.0.1:6378> zadd zset 1 a 2 b 2 c 3 d
(integer) 1

127.0.0.1:6378> zremrangebyrank zset 1 -3
(integer) 1

127.0.0.1:6378> zadd zset 1 a 2 b 2 c 3 d
(integer) 1

127.0.0.1:6378> zremrangebyrank zset -3 1
(integer) 1


複製代碼

【ZREMRANGEBYRANK】命令示例:

#### 【ZREMRANGEBYRANK】命令示例 @zxiaofan 

127.0.0.1:6378> del zset2
(integer) 1

127.0.0.1:6378> zadd zset2 3 a 3 b 3 B 3 c 3 A 3 Aa
(integer) 6

127.0.0.1:6378> zpopmin zset2 3
1) "A"
2) "3"
3) "Aa"
4) "3"
5) "B"
6) "3"

127.0.0.1:6378> zadd zset2 3 a 3 b 3 B 3 c 3 A 3 Aa
(integer) 3

127.0.0.1:6378> zpopmax zset2 3
1) "c"
2) "3"
3) "b"
4) "3"
5) "a"
6) "3"

127.0.0.1:6378> zpopmax zset5 3
(empty list or set)
複製代碼

三、後記

  《玩轉Redis-Redis高級數據結構及核心命令-ZSet》至此結束,後續將繼續分享Redis其餘數據結構及核心命令,歡迎訂閱@zxiaofan即時查看後續文章。


祝君好運!
Life is all about choices!
未來的你必定會感激如今拼命的本身!
CSDN】【GitHub】【OSCHINA】【掘金】【微信公衆號
歡迎訂閱zxiaofan的微信公衆號,掃碼或直接搜索zxiaofan

相關文章
相關標籤/搜索