redis zrange 與 zrangebyscore的區別

前言

想做一個在redis中獲取數據時分頁的功能,從網上查找到了zrange和zrangebyscore兩個函數,對於這兩個函數的理解,在剛剛讀完官方文檔後,還是不太懂:

zrange: “ordered from highest to lowest score ” https://redis.io/commands/zrange

zrangebyscore:"The elements are considered to be ordered from low to high scores." https://redis.io/commands/zrangebyscore

嗯?都是依據socre排序,所以啥區別?雖說是一個索引一個score,但結果都是按照score排序,所以到底有啥區別???

剛接觸的時候,光靠看定義來理解,真的很容易矇蔽。

所以做個實驗,就清楚了。

先說概念上的結論:

     兩者的區別,就是一個是“索引”,一個是“score”!【are you kidding me?!】

實驗

數據準備

在redis中依次執行下列語句:

zadd test 1 first

zadd test 10 two

zadd test 8 three

zadd test 7 four

zadd test 2 five

zadd test 1.1 onePointOne

zadd test 2 six

zadd test 8 seven

zadd test 7 sight

對比案例一

我們輸入0 2兩個參數來查詢(具體命令使用方法請自行查閱官方文檔),紅方用zrange藍方用zrangebyscore

紅方:

命令:

zrange test 1 2 withscores

結果:

127.0.0.1:6379> zrange test 1 2 withscores
1) "onePointone"
2) "1.1000000000000001"
3) "five"
4) "2"

藍方:

命令:

zrangebyscore test 1 2 withscores

結果:

127.0.0.1:6379>  zrangebyscore test 1 2 withscores
1) "first"
2) "1"
3) "onePointone"
4) "1.1000000000000001"
5) "five"
6) "2"
7) "six"
8) "2"

對比結論:
zrange是傳入的值是索引 ,因此查詢的值“1”代表是查詢第二個值,也就是說,索引的情況下,索引0是第一個元素。

而zrangebyscore傳入的值就是值本身的含義,也就是“score”

注:確實,官方文檔就說了起始值的問題,但這確實是一個容易犯錯誤的地方。

 

對比案例二

我們輸入0 7兩個參數來查詢(具體命令使用方法請自行查閱官方文檔),紅方用zrange藍方用zrangebyscore

紅方:

命令:

zrange test 0 7 withscores

結果:

127.0.0.1:6379> zrangebyscore test 0 7 withscores
 1) "first"
 2) "1"
 3) "onePointone"
 4) "1.1000000000000001"
 5) "five"
 6) "2"
 7) "six"
 8) "2"
 9) "four"
10) "7"
11) "sight"
12) "7"

藍方:

命令:

zrangebyscore test 0 7 withscores

結果:

127.0.0.1:6379> zrange test 0 7 withscores
 1) "first"
 2) "1"
 3) "onePointone"
 4) "1.1000000000000001"
 5) "five"
 6) "2"
 7) "six"
 8) "2"
 9) "four"
10) "7"
11) "sight"
12) "7"
13) "seven"
14) "8"
15) "three"
16) "8"

對比結論:
1. 同上一個測試

2. zrange查詢的結果個數,就是索引的區間長度(如【0-7】,區間長度是8,所以查出來8個數據,當然,前提是數據不少於8個),

而zrangebyscore由於是用socre來查詢,因此,在準備的數據中,有多少個符合【0,7】區間的數據,就會返回多少數據。

注:確實,官方文檔就說了起始值的問題,但這確實是一個容易犯錯誤的地方。

總結

1. zrange的第一個數據是索引爲0的數據,而zrangebyscore的第一個數據,是score值最小的那個數據

2. zrange傳入的參數是“索引”的含義,而zrangebyscore就是單純的一個數值的含義

3. zrange查詢的結果個數<= 查詢區間長度,也就是說 ,區間多長,就查詢出多少個結果出來(數據不少於區間長度,足夠多的情況下),而zrangebyscore的查詢結果個數視實際數據而定,也就是凡是符合區間的數據,全部查詢出來.

4. 所以在分頁查詢的需求下,zrange可以保證每頁的數據量,而zrangebyscore不能保證。

    如果有數據更新,zrange就會出現數據查詢重複和遺漏的情況。而zrangebyscore卻由於符合條件則全部查詢出來的特性,而不會出現重複和遺漏。

不理解“重複和遺漏”是怎麼發生的?自己仔細思考去吧,實在不行做個實驗,你就明白了,這裏我不細說。

5. 勤於動手,豐衣足食。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章