2015-05-04 29 views
0

的有序集合十字路口,我要的位置三元組存儲在Redis的數據存儲,但想要讓他們搜索的爲好。這將使得有可能進行範圍查詢,例如'給我點1 < x 3和y> 2'。因此,我使用了有序集合的組合。Redis的:按分數

每個三元組被保存在Redis的像這樣(其中x = 1,Y = 2例如,位置A,Z = 3):

hset /locations/A x "1" 
hset /locations/A y "2" 
hset /locations/A z "3" 
hset /locations/A payload "{ ...some json payload... }" 
zadd /locations:x 1 locations/A 
zadd /locations:y 2 locations/A 
zadd /locations:z 3 locations/A 

這樣,我可以很容易地找到的所有位置(或路徑,以地點)與例如x值介於4和5之間:

zrangebyscore /locations:x 4 5 

或者所有具有例如1至3之間的Y值:

zrangebyscore /locations:x 1 3 

當我嘗試搭配4,5及1和3之間的Y值之間的x值的所有位置出現問題,因爲那時我要做兩個查詢到Redis,隨後將這些值與NodeJS中的Javascript進行比較,當定義了很多位置時這可能非常耗時。有沒有人遇到過這樣的問題?

我嘗試用zinterstore和zunionstore,但還沒有找到一個滿意的解決方案呢。我認爲zrangebyscores存儲到一個臨時組,然後做一個zinterstore,但沒有找到一個Redis的命令存儲zrangebyscore的直接輸出到Redis的(在相同的命令)。

回答

2

我想忽略的用例(位置路徑/距離)本身因爲有多個成熟的方式來應對這一挑戰,也與Redis的(搜索地理空間就尋見),而專注於技術。所以,假設你要發明和實現你自己的地理邏輯,最有效的方法(修改Redis的代碼不足)來解決評分/測距/相交/ ......這些分類集合中遇到的挑戰將在一個Lua腳本中。這就是您可能流傳的稱之爲「數據重力」的原因 - 處理器接近數據,因此訪問和操作數據的速度最快,並且不需要網絡。

例如,在這樣的腳本中,您可以將ZRANGEBYSCORE的結果存儲在局部變量中,根據需要在其中執行任何操作,並將最終結果回覆給(Node.js)客戶端。