Redis GEORADIUS地理位置分頁實現

之前做了一個reids geo經緯度附近的人排序功能,今天終於找到了分頁的方法與大家一同分享

redis geo實現文章:https://blog.csdn.net/qq_24909089/article/details/96871817

正文:

函數:

GEORADIUS命令中有很多可選參數,這裏一一解釋一下: 
- withcoord:返回結果中包含經緯度 
- withdist:返回結果中包含離中心節點位置的距離 
- withhash:返回結果中包含geopath 
- COUNT count:指定返回結果的數量 
- asc|desc:返回結果根據離中心節點位置的距離進行升序或降序 
- store key:將返回結果的地理位置信息保存到指定key 
- storedist key:將返回結果離中心節點的距離保存到指定key
————————————————

假設我們現在有用戶的經緯度redis列表,如下圖,value是用戶的ID,score是用戶的經緯度座標,無奈的是georadius 方法不能直接查詢分頁。只能查count 數量,之前做的比較笨的方法是取出來用數組自己寫分頁,之前沒有發現有storedist函數的妙用。

問題剖析地址:https://github.com/antirez/redis/issues/3019

定位關鍵點:

我們可以看到做法就是 使用store函數把查詢的列表寫入另一個有序集合中,當然這樣每一個用戶都會有一個自己的排序列表,不過我發現store函數並不能把georadius 計算出的位置列表按順序寫入新的有序集合。文章裏也有說明

繼續往下看我發現了另一個函數,storedist()

storedist() 函數的意義就像是georadius 裏的withdist,他會按照withdist計算的結果作爲有序集合的分數進行新建列表,如下圖

 

這樣生成一個每一個用戶的有序集合我們就可以用普通的有序集合函數進行分頁瞭如:

geo 支持的參數

分頁實現原理:把geo經緯度篩選後的結果寫入另一個有序集合中,在這個有序集合中進行分頁操作。

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