后退返回命令数量_Redis | Redis 有序集合相关命令
? ? ? ? Redis 支持多種數據結構,比如 字符串、列表、集合、有序集合 和 哈希 等數據結構。本次我整理了關于 有序集合?相關的命令,也就是關于 Sorted Sets 相關的命令,如下圖。
? ? ? ? 上圖中用紅色圈中的部分,就是關于 有序集合?相關的命令。如果想要在 Redis 中查看相關的命令可以使用?help?命令來進行查看,命令如下。
127.0.0.1:6379> help @sorted_set? ? ? ? 在按下回車后,可以看到 Sorted Sets 相關命令的說明,如下圖。
? ? ? ? 圖中就是部分關于 Sorted Sets 相關的部分命令。對于 Sorted Sets 有另外一個名稱 —— zsets 或 zset。
常用 Sorted Sets 相關命令
? ? ? ? Sorted?Sets 數據類型是 Key 對應的 Value 的類型,在 Redis 中所有的 Key 都是字符串類型,所謂的數據類型表示的是 Value 的類型。在 Sorted Sets 中的 Value 是一個有序集合,集合是有序的(上篇文章的 Sets 是無序的),且是不可以重復的,有序集合包含兩部分,分別是成員(member)和分數(score)兩部分。
? ? ? ? 為了大家能夠直接復制命令進行測試,下面我就不截圖了。
1、zadd
? ? ? ??該命令的作用是:添加一個或者多個帶分數的成員到集合里,命令格式如下:
zadd key [NX|XX] [CH] [INCR] score member [score member ...]? ? ? ? 例子如下:
127.0.0.1:6379> zadd language 100 java 200 c++ 50 python 150 ruby(integer) 4? ? ? ? 在命令中,language 是 key,其中 java、c++、 python 和 ruby 是 member,也就是成員;它們前面的數值是 score,也就是分數。從返回值可以看出,zadd 命令增加了 4 個元素。
? ? ? ? 我們來查看一下用 zadd 添加的元素:
127.0.0.1:6379> zrange language 0 -1 withscores1) "python"2) "50"3) "java"4) "100"5) "ruby"6) "150"7) "c++"8) "200"? ? ? ? 參數 NX 和 XX 的說明
nx:只添加新成員
127.0.0.1:6379> zadd language nx 200 java 130 php 180 c++(integer) 1127.0.0.1:6379> zrange language 0 -1 withscores 1) "python" 2) "50" 3) "java" 4) "100" 5) "php" 6) "130" 7) "ruby" 8) "150" 9) "c++"10) "200"? ? ? ? 可以看到 java 和 c++ 的分數都沒有改變,php 加入了 zset。
xx:更新已經存在的成員
127.0.0.1:6379> zadd language xx 200 java 180 c++ 30 shell(integer) 0127.0.0.1:6379> zrange language 0 -1 withscores 1) "python" 2) "50" 3) "php" 4) "130" 5) "ruby" 6) "150" 7) "c++" 8) "180" 9) "java"10) "200"? ? ? ? 可以看到 java 和 c++ 的分數發(fā)生了改變,而 shell 并沒有加入 zset 當中。
ch:返回值為發(fā)生變化的成員總數
? ? ? ? 前面我們看到 zadd 的返回值是添加成員的個數,使用 ch 參數后,zadd 的返回值為發(fā)生變化的成員的個數
127.0.0.1:6379> zadd language ch 210 java(integer) 1127.0.0.1:6379> zadd language 220 java(integer) 0? ? ? ? 對比上面兩條命令的返回值,使用了 ch 參數后,返回值為 1,說明有一個成員發(fā)生了變化;沒有使用 ch 參數,返回值為 0,表示添加了 0 個成員。
incr:zadd 指令不再是設置,而是增加
? ? ? ? 前面 python 的值為 50,我們使用 incr 參數對 python 的分數進行增加,命令如下:
127.0.0.1:6379> zadd language incr 50 python"100"127.0.0.1:6379> zrange language 0 -1 withscores 1) "python" 2) "100" 3) "php" 4) "130" 5) "ruby" 6) "150" 7) "c++" 8) "180" 9) "java"10) "220"? ? ? ? 可以看到,python 的分數為 100,不增加 incr 參數的情況:
127.0.0.1:6379> zadd language 50 python(integer) 0127.0.0.1:6379> zrange language 0 -1 withscores 1) "python" 2) "50" 3) "php" 4) "130" 5) "ruby" 6) "150" 7) "c++" 8) "180" 9) "java"10) "220"? ? ? ? 可以看到,沒有 incr 參數時,zadd 還具有設置分數的作用。
2、zcard
? ? ? ? 該命令的作用是:獲取指定 key 中的成員數量。
127.0.0.1:6379> zcard language(integer) 5127.0.0.1:6379> zrange language 0 -11) "python"2) "php"3) "ruby"4) "c++"5) "java"3、zcount
? ? ? ? 該命令的作用是:獲取指定 key 下分數范圍內的成員的數量
127.0.0.1:6379> zcount language 150 180(integer) 2127.0.0.1:6379> zrange language 0 -1 withscores 1) "python" 2) "50" 3) "php" 4) "130" 5) "ruby" 6) "150" 7) "c++" 8) "180" 9) "java"10) "220"? ? ? ? 從上面的命令可以看出,分數在 150 到 180 之間的成員有兩個。
4、zincrby
? ? ? ? 該命令的作用是:給 key 中的成員增加分數
127.0.0.1:6379> zincrby language 10 python"60"127.0.0.1:6379> zrange language 0 -1 withscores 1) "python" 2) "60" 3) "php" 4) "130" 5) "ruby" 6) "150" 7) "c++" 8) "180" 9) "java"10) "220"5、zpopmax
? ? ? ? 該命令的作用是:返回指定 key 的分數最大的 N 個成員,并將返回的成員從 key 中刪除
127.0.0.1:6379> zpopmax language 11) "java"2) "220"? ? ? ? 在上面的命令中,language 后跟隨的數值就是要獲取的分數最大的 N 個成員
127.0.0.1:6379> zrange language 0 -11) "python"2) "php"3) "ruby"4) "c++"6、zpopmin
? ? ? ? 該命令的作用是:返回指定 key 的分數最小的 N 個成員,并將成員從 key 中刪除
127.0.0.1:6379> zpopmin language 11) "python"2) "60"127.0.0.1:6379> zrange language 0 -1 withscores1) "php"2) "130"3) "ruby"4) "150"5) "c++"6) "180"7、zrange
? ? ? ? 該命令的作用是:返回指定 key 中索引范圍內的成員,命令格式如下
zrange key start stop [WITHSCORES]? ? ? ? 這個命令是我們使用最多的命令,在上面的例子中已經反復使用過了。這里具體介紹一下。
127.0.0.1:6379> zrange language 0 -11) "php"2) "ruby"3) "c++"? ? ? ? 命令格式中的,0 和 -1 表示查看 zset 中從開始位置到結束位置的所有成員,zset 的索引從 0 開始,-1 表示最后一個索引的位置,同理,第二個元素的索引值為 1,倒數第二個索引可以使用 -2 表示。
127.0.0.1:6379> zrange language -2 -11) "ruby"2) "c++"127.0.0.1:6379> zrange language 0 -21) "php"2) "ruby"? ? ? ? 命令格式中的 withscores 表示查看各個成員對應的分數,例子如下:
127.0.0.1:6379> zrange language 0 -1 withscores1) "php"2) "130"3) "ruby"4) "150"5) "c++"6) "180"8、zrevrange
? ? ? ??該命令的作用是:返回指定 key 中索引范圍內的成員,順序由高到底,命令格式如下:
zrevrange key start stop [WITHSCORES]? ? ? ? 該命令與 zrange 類似,zrange 是按照分數由低到高的排序,而 zrevrange 則是由高到低進行排序,例子如下:
127.0.0.1:6379> zrevrange language 0 -1 withscores1) "c++"2) "180"3) "ruby"4) "150"5) "php"6) "130"9、zrangebylex
? ? ? ??該命令的作用是:按照字典順序進行排序后獲取指定區(qū)間的成員,且可以進行分頁。
127.0.0.1:6379> zadd score 0 aa 0 bb 0 cc 0 dd 0 ee 0 ff(integer) 6? ? ? ? 注意:使用 zrangebylex 要求所有成員的分數相同,因此上面的命令我們先添加一些要進行測試的成員和分數。
? ? ? ? 其命令格式如下:
ZRANGEBYLEX key min max [LIMIT offset count]? ? ? ? 先來查看一下按照字典序進行排序的成員,命令如下:
127.0.0.1:6379> zrangebylex score - +1) "aa"2) "bb"3) "cc"4) "dd"5) "ee"6) "ff"? ? ? ??其中 - 號表示最小值,+ 號表示最大值
127.0.0.1:6379> zrangebylex score [a [d1) "aa"2) "bb"3) "cc"? ? ? ? 可以看到,我們查看了左側為以字母 a 開頭的閉區(qū)間,和右側為以字母 d 開頭的開區(qū)間的成員列表。在 min 和 max 進行匹配時,需要以 [ 或 ( 開頭。網上資料中描述,[ 表示閉區(qū)間,( 開區(qū)間,但是經我測試發(fā)現,無論使用 [ 還是 ( ,最后的結果范圍都是 左閉右開。(如果我測試的有誤,也請大家指出,以便我進行改正,在此表示感謝!)
127.0.0.1:6379> zrangebylex score - (c1) "aa"2) "bb"127.0.0.1:6379> zrangebylex score (a (c1) "aa"2) "bb"? ? ? ? 從上面可以看出,使用 ( 同樣時 左閉右開。
? ? ? ? 接著再看看 limit 的用法,limit 后面根兩個參數,分別時 offset 和 count,也就是起始的偏移和數量,這兩個參數類似 MySQL 的 limit 的用法。
127.0.0.1:6379> zrangebylex score - + limit 0 31) "aa"2) "bb"3) "cc"127.0.0.1:6379> zrangebylex score - + limit 3 31) "dd"2) "ee"3) "ff"10、zrevrangebylex
? ? ? ? 該命令的作用是:用法和 zrangebylex 類似,只是順序是反的,命令格式如下:
zrevrangebylex key max min [LIMIT offset count]? ? ? ? zrevrangebylex 命令在 key 的后面先給出 max,再給出 min,這個順序正好與 zrangebylex 的順序相反,這里就不再演示了。
11、zlexcount
? ? ? ? 該命令的作用是:返回成員之間的數量,命令格式如下:
zlexcount key min max? ? ? ? 該命令的格式與 zrangebylex 的格式類似,只是不返回具體的成員區(qū)間,而是成員區(qū)間的個數,例子如下:
127.0.0.1:6379> zlexcount score - +(integer) 6127.0.0.1:6379> zlexcount score (a (c(integer) 212、zrangebyscore
? ? ? ? 該命令的作用是:按照分數進行排序并獲取成員,命令格式如下:
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]? ? ? ??查看所有的成員
127.0.0.1:6379> zrangebyscore language -inf +inf1) "php"2) "ruby"3) "c++"? ? ? ? 其中,-inf 和 +inf 分別代表負無窮大和正無窮大 。
127.0.0.1:6379> zrangebyscore language 100 150 withscores1) "php"2) "130"3) "ruby"4) "150"? ? ? ??查看帶分數的分數區(qū)間再 100 到 150 之間的成員
127.0.0.1:6379> zrangebyscore language (130 (160 withscores1) "ruby"2) "150"? ? ? ??查看分數在 130 到 160 之間的開區(qū)間的成員,zrangebyscore 不能使用 [ 開頭
13、zrevrangebyscore
? ? ? ??該命令的作用是:該命令的排序與 zrangebyscore 的順序相反,該命令的格式如下:
zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]? ? ? ??該命令就不進行演示
14、zrank
? ? ? ? 該命令的作用是:按照分數由低到高的順序查看成員的排名
127.0.0.1:6379> zrank language php(integer) 0127.0.0.1:6379> zrank language c++(integer) 2127.0.0.1:6379> zrank language ruby(integer) 115、zrevrank
? ? ? ? 該命令的作用是:按照分數由高到低的順序查看成員的排名
127.0.0.1:6379> zrevrank language php(integer) 2127.0.0.1:6379> zrevrank language ruby(integer) 1127.0.0.1:6379> zrevrank language c++(integer) 016、zrem
? ? ? ? 該命令的作用是:刪除 zset 中的一個或多個成員,當成員為空時,刪除該 key
127.0.0.1:6379> zrem language c++ php ruby(integer) 3127.0.0.1:6379> zrange language 0 -1(empty list or set)127.0.0.1:6379> keys *1) "score"2) "key"3) "lang"17、zremrangebyrank
? ? ? ? 該命令的作用是:按照排名進行刪除成員,命令格式如下:
ZREMRANGEBYRANK key start stop? ? ? ? 刪除排名 0 和 1 的兩個成員
127.0.0.1:6379> zadd language 50 c++ 100 java 150 asm 200 php 251 ruby 300 python(integer) 6127.0.0.1:6379> zremrangebyrank language 0 1(integer) 2127.0.0.1:6379> zrange language 0 -11) "asm"2) "php"3) "ruby"4) "python"18、zremrangebyscore
? ? ? ??該命令的作用是:按照分數進行刪除成員,命令格式如下:
ZREMRANGEBYSCORE key min max? ? ? ? 刪除分數再 201 到 260 之間的成員
127.0.0.1:6379> zremrangebyscore language 201 260(integer) 1127.0.0.1:6379> zrange language 0 -11) "asm"2) "php"3) "python"? ? ? ? ruby 成員被刪除了
19、zremrangebylex
? ? ? ? 該命令的作用是:按照字典順序進行刪除成員,命令格式如下:
ZREMRANGEBYLEX key min max? ? ? ? 刪除字母 o 到 q 區(qū)間的成員
127.0.0.1:6379> zremrangebylex language [o [q(integer) 2127.0.0.1:6379> zrange language 0 -11) "asm"? ? ? ? 可以看到,php 和 python 被刪除了
20、zscore
? ? ? ??該命令的作用是:獲取指定成員的分數
127.0.0.1:6379> zscore language php"130"127.0.0.1:6379> zscore language c++"180"127.0.0.1:6379> zscore language c(nil)127.0.0.1:6379> zscore language ruby"150"21、zinterstore
? ? ? ? 該命令的作用是:將兩個或多個 zset 求交集,命令格式如下:
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]? ? ? ? 求 k1 和 k2 的交集 k3,觀察 k3 中成員的分數
127.0.0.1:6379> zadd k1 100 aa 200 bb 300 cc(integer) 3127.0.0.1:6379> zadd k2 100 aa 200 cc 300 dd(integer) 3127.0.0.1:6379> zinterstore k3 2 k1 k2 (integer) 2127.0.0.1:6379> zrange k3 0 -11) "aa"2) "cc"127.0.0.1:6379> zrange k3 0 -1 withscores1) "aa"2) "200"3) "cc"4) "500"? ? ? ? 求 k1 和 k2 的交集 k4,觀察 k4 中成員的分數,這次使用參數 weights,該參數表示對應集合的權重
127.0.0.1:6379> zinterstore k4 2 k1 k2 weights 2 3(integer) 2127.0.0.1:6379> zrange k4 0 -11) "aa"2) "cc"127.0.0.1:6379> zrange k4 0 -1 withscores1) "aa"2) "500"3) "cc"4) "1200"? ? ? ? weights 后面跟著 2 和 3,表示 k1 的分數權重是 2 倍,k2 的分數的權重是 3 倍。
k4(aa) = k1(aa) * 2 + k2(aa) * 3 = 100 * 2 + 100 * 3 = 500? ? ? ? 最后一個參數 aggregate 表示交集的聚合方式:
相加的聚合方式:sum
127.0.0.1:6379> zinterstore k5 2 k1 k2 aggregate sum(integer) 2127.0.0.1:6379> zrange k5 0 -1 withscores1) "aa"2) "200"3) "cc"4) "500"? ? ? ? 默認就是 k1 和 k2 相同成員的分數相加的形式
最小分數的聚合方式:min
127.0.0.1:6379> zinterstore k6 2 k1 k2 aggregate min(integer) 2127.0.0.1:6379> zrange k6 0 -1 withscores1) "aa"2) "100"3) "cc"4) "200"? ? ? ? k1 和 k2 的 aa 是相等的,因此 k6 的 aa 仍然是 100,而 k1 和 k2 的 cc 是不相等的,取了它們中較小的那個
最大分數的聚合方式:max
127.0.0.1:6379> zinterstore k7 2 k1 k2 aggregate max(integer) 2127.0.0.1:6379> zrange k7 0 -1 withscores1) "aa"2) "100"3) "cc"4) "300"? ? ? ? k1 和 k2 的 aa 是相等的,因此 k7 的 aa 仍然是 100,而 k1 和 k2 的 cc 是不相等的,取了它們中較大的那個
22、zunionstore
? ? ? ? 該命令的作用是:將兩個或多個 zset 求并集,命令格式如下:
zunionstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]? ? ? ? 該命令的使用方式與 zinterstore 的方式相同,只是最后計算的是并集不是交集,這里不再進行演示。
總結
? ? ? ? Redis 的有序集合類型提供的命令還是比較多的,它不但可以當作一個集合來用,它還具備 排名、排序、分頁、求交集 和 求并集 的功能,當然, 還可以在一些特定的應用場景中輕松的完成功能的開發(fā)。
? ? ? ? 待 Redis 常用的幾種基本數據類型總結完成后,我會再逐步的整理 Redis 這幾種基本數據類型的各種應用場景,希望大家可以喜歡。
? ? ? ? 這部分整理花了兩個晚上完成的,其實累計也就 2 個小時左右,由于時間比較倉促,可能有些命令描述的不是特別清楚或者準確,但是命令都是我逐個敲出來的,按照命令來進行學習,基本應該是沒有問題的。當然了,有問題也可以指出來,我進行改正。
看都看完了,還不點這里試試
總結
以上是生活随笔為你收集整理的后退返回命令数量_Redis | Redis 有序集合相关命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为高阶自动驾驶全栈解决方案2.0来了!
- 下一篇: linux cmake编译源码,linu