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