Redis中實現尋找某個值的範圍_Redis

來源:互聯網
上載者:User

本文來自Redis在Google Group上的一個問題,有一位同學發貼求助,說要解決如下的一個問題:他有一個IP範圍對應地址的列表,現在需要給出一個IP的情況下,迅速的尋找到這個IP在哪個範圍,也就是要判斷此IP的所有地。這個問題引來了Redis作者Salvatore Sanfilippo(@antirez)的回答。解答如下:

例如有下面兩個範圍,10-20和30-40

複製代碼 代碼如下:

A_start 10, A_end 20
B_start 30, B_end 40

我們將這兩個範圍的起始位置存在Redis的Sorted Sets資料結構中,基本範圍起始值作為score,範圍名加start和end為其value值:

複製代碼 代碼如下:

redis 127.0.0.1:6379> zadd ranges 10 A_start
(integer) 1
redis 127.0.0.1:6379> zadd ranges 20 A_end
(integer) 1
redis 127.0.0.1:6379> zadd ranges 30 B_start
(integer) 1
redis 127.0.0.1:6379> zadd ranges 40 B_end
(integer) 1

這樣資料在插入Sorted Sets後,相當於是將這些起始位置按順序排列好了。

現在我需要尋找15這個值在哪一個範圍中,只需要進行如下的zrangbyscore尋找:

複製代碼 代碼如下:

redis 127.0.0.1:6379> zrangebyscore ranges (15 +inf LIMIT 0 1
1) "A_end"

這個命令的意思是在Sorted Sets中尋找大於15的第一個值。(+inf在Redis中表示正無窮大,15前面的括弧表示>15而非>=15)

尋找的結果是A_end,由於所有值是按順序排列的,所以可以判定15是在A_start到A_end區間上,也就是說15是在A這個範圍裡。至此大功告成。

當然,如果你尋找到的是一個start,比如咱們用25,執行下面的命令

複製代碼 代碼如下:

redis 127.0.0.1:6379> zrangebyscore ranges (25 +inf LIMIT 0 1
1) "B_start"

返回結果表明其下一個節點是一個start節點,也就是說25這個值不處在任何start和end之間,不屬於任何範圍。

當然,這個例子僅適用於類似上面的IP範圍尋找的案例,因為這些值範圍之間沒有重合。如果是有重合的情況,這個問題本身也就變成了一個一對多的問題。好吧,如果真的是有重合的範圍,我們又當如何解決呢?歡迎讀者同學你來挑戰。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.