2012-05-24 203 views
2

我剛遇到問題。我使用redis來存儲地理信息。爲 例如:Redis存儲地理信息,

hset 10001 la 41.000333 
hset 10001 lo 121.999999 

zadd la 41.xxxxx pk-value 
zadd lo 121.xxxxx pk-value 

約40000鍵值 關鍵是用於終端ID和值被設置,存儲了吡嗪酰胺 GPS信息。 我有要求計算周圍的終端。 例如,我的位置是41.000123,121.999988,我想給 最快的計算在我的位置的終端,我有想法 如何計算兩個位置的距離。 我只想要一種快速迭代所有數據的方法。在Redis 2.6中有lua的支持。它可以幫助解決我的問題嗎?

+0

'KEYS'對你來說太慢了嗎? –

+0

你應該〜從不在生產中使用KEYS。從[文檔](http://redis.io/commands/keys):「警告:考慮將KEYS作爲一種命令,只能在生產環境中謹慎使用。當它針對大型數據庫執行時可能會導致性能下降。此命令用於調試和特殊操作,例如更改您的鍵盤空間佈局。請勿在您的常規應用程序代碼中使用KEYS。「 –

回答

1

當我明白你的問題,你想找到接近一些座標的所有值?一種方法是使用Lua腳本,另一種方法是爲每個近似的緯度/經度存儲一個有序集(如果事先知道您需要的粒度)。例如:

zadd la.41 41.000333 pk-value 
zadd lo.121 121.999999 pk-value 

然後,當你需要找到一些接近一些COORDS(比方說(42.01, 122.03)),你會做這樣的事情:

lat = 42.01 
lon = 122.03 
lat_min, lat_mid, lat_max = round(lat - 1), round(lat), round(lat + 1) 
lon_min, lon_mid, lon_max = round(lon - 1), round(lon), round(lon + 1) 

這樣,你就看在有序集合la.41la.42la.43lo.121lo.122lo.123

zinterstore close.${lat},${lon} 6 la.${lat_min}, la.${lat_mid}, la.${lat_max}, lo.${lon_min}, lo.${lon_mid}, lo.${lon_max} 

現在,close.${lat},${lon}應該包含接近提供的座標的每個終端的ID。

顯然,您可以存儲每個座標更大的粒度,如la.41.0,lo.121.0,並只查看關閉的終端。或者,您可以在客戶端代碼中進一步篩選結果。

+0

謝謝你ansower.but我無法繞過它。 – Simon

+0

謝謝,但它不起作用。 我的數據是這樣的: ------------------------------------------ --- | id | la | lo |名稱|別人| --------------------------------------------- | 1 | 39.1111 | 116.1111 | xxx | ---------------------------------------------- | 2 | 39.2211 | 116。2233 | yyy | 或我使用soered集到Stroe的地理 zadd la.39.00 39.0000 1 zadd la.39.00 39.0001 2 zadd la.39.00 39.0003 3 ... zadd la.39.01 39.0100 4 ... zadd lo.116.00 116.0000 1 zadd lo.116.00 116.0001 2 ... zinterstore a 6 la.39.00 la.39.01 la.39.02 lo.116.00 lo.116.01 lo.116.02 – Simon

2

你可能想使用geohashes,那麼你將能夠存儲(通過搜索)經度/緯度與任何你想要的精確度,也很比較容易得到這是在給定的邊界框點。

對於Redis的實現,看看geodis