GEO は、バージョン 3.2 以降の Redis に追加された新しい地理的位置モジュールです。この記事では、GEO 地理的位置モジュールについて説明します。お役に立てば幸いです。
GEO は、バージョン 3.2 以降の Redis に追加された新しい地理的位置モジュールです。つまり、Redis を使用して近くの位置情報機能を実装できます。 [関連する推奨事項: Redis ビデオ チュートリアル ]
一般的な方法は次のとおりです。要素の数を制限するために長方形の領域が使用され、領域内の要素に対して完全な距離の計算が実行されてから並べ替えられます。これにより、計算量を大幅に削減できます。
select id from positions where x0-r < x < x0+r and y0-r < y < y0+r
パフォーマンスを向上させるために、上記の SQL は緯度と経度の座標に双方向複合インデックスを追加する必要があります。 ただし、データベース クエリのパフォーマンスには結局のところ制限があるため、同時実行性が高い状況で使用する場合、これは良い解決策ではない可能性があります。
GeoHash
アルゴリズムであり、Redis も GeoHash を使用します
アルゴリズム。 GeoHash
アルゴリズムは 2 次元の経度および緯度データを 1 次元の整数 にマッピングするため、すべての要素が互いに近接して直線上にマウントされます。 2 次元座標を 1 次元にマッピングした後の点間の距離も非常に近くなります。 「近くにいる人」を計算したい場合、まず対象位置をこの直線にマッピングし、次にこの 1 次元直線上の近くの点を取得します。 GeoHash
アルゴリズムはこの整数を 1 回実行し続けますbase32
エンコーディング(0-9,a-z の 4 文字 a,i,l,o を削除します) )
は文字列になります。 zset
に格納されます。zset
の value
は key
、score
は、GeoHash
の 52 ビット整数値です。 zset(skiplist)
であることを常に覚えておく必要があります。 zset
の score
をソートすると、その座標に近い他の要素を取得できます (実際の状況はさらに複雑ですが、理解するには十分です)。 score# を復元すると、 ## to 座標値を使用して、要素の元の座標を取得できます。
を追加します。 #geoadd key longitude latitude member [longitude latitude member ...]
127.0.0.1:6379> geoadd beijing 116.403856 39.924043 gugong
(integer) 1
127.0.0.1:6379> geoadd beijing 116.343620 39.947633 dongwuyuan
(integer) 1
127.0.0.1:6379> geoadd beijing 116.328643 39.900272 xizhan 116.415324 39.931231 meishuguan 116.416852 39.887607 tiantan
(integer) 3
zset
2 を使用して zrem
を削除します。 距離 geodist
geodist key member1 member2 [unit]
127.0.0.1:6379> geodist beijing gugong xizhan km
"6.9402"
127.0.0.1:6379> geodist beijing gugong dongwuyuan # 默认单位m
"5768.5737"
127.0.0.1:6379> geodist beijing xizhan xizhan
"0.0000"
距離単位 m にすることもできます、km、ml、ft はそれぞれメートル、キロメートル、マイル、フィートを表します。
3. 場所 geopos
geopos key member [member ...]
127.0.0.1:6379> geopos beijing gugong
1) 1) "116.4038559794426"
2) "39.92404192186725"
127.0.0.1:6379> geopos beijing tiantan xizhan
1) 1) "116.41685396432877"
2) "39.887607839922914"
2) 1) "116.32864147424698"
2) "39.900271306834973"
4. ハッシュ値 geohash
geohash key member [member ...]
127.0.0.1:6379> geohash beijing gugong
1) "wx4g0gfwqk0"
緯度と経度の文字列エンコードは base32 エンコードです。
# を通じて緯度と経度を直接見つけることができます。
#5 . 近くの場所 georadiusbymember
1. クエリ ireader 範囲 20
3# 内の要素の最大数## キロメートルは距離によって並べ替えられます。それ自体は除外されません (反転を使用する場合は desc
を使用します) <pre class="brush:js;toolbar:false;">127.0.0.1:6379> georadiusbymember company ireader 20 km count 3 asc
1) "ireader"
2) "juejin"
3) "meituan"</pre>
2。3 つのオプションのパラメーター withcoord withdist withhash
が使用されます追加パラメータを運ぶには、withdist
が非常に便利です。距離を表示するために使用できます
georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DES]
127.0.0.1:6379> georadiusbymember beijing gugong 5 km withcoord withdist withhash count 3 asc 1) 1) "gugong" 2) "0.0000" 3) (integer) 4069885568932443 4) 1) "116.4038559794426" 2) "39.92404192186725" 2) 1) "meishuguan" 2) "1.2634" 3) (integer) 4069885710390435 4) 1) "116.41532510519028" 2) "39.93123039107514" 3) 1) "tiantan" 2) "4.2014" 3) (integer) 4069885398502557 4) 1) "116.41685396432877" 2) "39.887607839922914"
3。座標値に基づいて近くの要素をクエリします<pre class="brush:js;toolbar:false;"> georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DES]</pre><pre class="brush:js;toolbar:false;">127.0.0.1:6379> georadius beijing 116.383882 39.922061 5 km withcoord withdist withhash count 3 asc
1) 1) "gugong"
2) "1.7180"
3) (integer) 4069885568932443
4) 1) "116.4038559794426"
2) "39.92404192186725"
2) 1) "meishuguan"
2) "2.8693"
3) (integer) 4069885710390435
4) 1) "116.41532510519028"
2) "39.93123039107514"
3) 1) "dongwuyuan"
2) "4.4588"
3) (integer) 4069879836419688
4) 1) "116.34361892938614"
2) "39.94763257169722"</pre>
注意事項
実際のアプリケーションでは、何百万ものデータが存在する可能性がありますが、Redis
Geo のデータが大きすぎる場合、クラスターの移行作業に大きな影響を与えます。クラスター環境、単一の key
対応するデータ量が 1M
を超えてはなりません。そうしないと、クラスターの移行に遅れが生じ、オンライン サービスの通常の動作に影響します。 <p>したがって、<code>Geo
データは、クラスター環境ではなく別の Redis インスタンスを使用してデプロイすることをお勧めします。
データ量が 1 億以上の場合は、Geo
データを分割する必要があり、たとえ人口の多い都市であっても、国、地方、都市ごとに分割する必要があります。ゾーン。これにより、単一の zset
セットのサイズを大幅に削減できます。
プログラミング関連の知識について詳しくは、プログラミング ビデオをご覧ください。 !
以上がRedis の GEO 地理的位置モジュールについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。