ホームページ  >  記事  >  データベース  >  Redis の GEO 地理的位置モジュールについて話しましょう

Redis の GEO 地理的位置モジュールについて話しましょう

青灯夜游
青灯夜游転載
2021-12-28 10:10:242576ブラウズ

GEO は、バージョン 3.2 以降の Redis に追加された新しい地理的位置モジュールです。この記事では、GEO 地理的位置モジュールについて説明します。お役に立てば幸いです。

Redis の GEO 地理的位置モジュールについて話しましょう

GEO は、バージョン 3.2 以降の Redis に追加された新しい地理的位置モジュールです。つまり、Redis を使用して近くの位置情報機能を実装できます。 [関連する推奨事項: Redis ビデオ チュートリアル ]

データベース計算を使用する

Redis の GEO 地理的位置モジュールについて話しましょう

一般的な方法は次のとおりです。要素の数を制限するために長方形の領域が使用され、領域内の要素に対して完全な距離の計算が実行されてから並べ替えられます。これにより、計算量を大幅に削減できます。

select id from positions where x0-r < x < x0+r and y0-r < y < y0+r

パフォーマンスを向上させるために、上記の SQL は緯度と経度の座標に双方向複合インデックスを追加する必要があります。 ただし、データベース クエリのパフォーマンスには結局のところ制限があるため、同時実行性が高い状況で使用する場合、これは良い解決策ではない可能性があります。

GEO アルゴリズム

  • 業界で最も一般的な地理的距離の並べ替えアルゴリズムは GeoHash アルゴリズムであり、Redis も GeoHash を使用します アルゴリズム。
  • GeoHash アルゴリズムは 2 次元の経度および緯度データを 1 次元の整数 にマッピングするため、すべての要素が互いに近接して直線上にマウントされます。 2 次元座標を 1 次元にマッピングした後の点間の距離も非常に近くなります。 「近くにいる人」を計算したい場合、まず対象位置をこの直線にマッピングし、次にこの 1 次元直線上の近くの点を取得します。
  • アルゴリズムの実装では、地球全体を 2 次元平面 として扱い、それを碁盤のように一連の正方形のグリッドに分割します。すべてのマップ要素の座標は一意の正方形に配置されます。正方形が小さいほど、座標はより正確になります。次に、これらの正方形に対して整数コーディングを実行します。正方形が近ければ近いほど、コーディングはより厳密になります。
  • エンコード後、各マップ要素の座標は整数になります。この整数を通じて要素の座標を復元できます。整数が長いほど、復元された座標値の損失は小さくなります。
  • GeoHash アルゴリズムはこの整数を 1 回実行し続けますbase32 エンコーディング(0-9,a-z の 4 文字 a,i,l,o を削除します) ) は文字列になります。
  • Redis では、緯度と経度は 52 ビット整数を使用してエンコードされ、zset に格納されます。zsetvaluekeyscore は、GeoHash の 52 ビット整数値です。
  • 地理クエリに Redis を使用する場合、その内部構造は実際には単なる zset(skiplist) であることを常に覚えておく必要があります。 zsetscore をソートすると、その座標に近い他の要素を取得できます (実際の状況はさらに複雑ですが、理解するには十分です)。 score# を復元すると、 ## to 座標値を使用して、要素の元の座標を取得できます。
#Redis GEO コマンド

Redis の GEO 地理的位置モジュールについて話しましょう

##1. geoadd

を追加します。 #

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 エンコードです。

http://geohash.org/wx4g0gfwqk0

# を通じて緯度と経度を直接見つけることができます。 #5 . 近くの場所 georadiusbymember

1. クエリ ireader 範囲 20

3# 内の要素の最大数## キロメートルは距離によって並べ替えられます。それ自体は除外されません (反転を使用する場合は desc を使用します) <pre class="brush:js;toolbar:false;">127.0.0.1:6379&gt; georadiusbymember company ireader 20 km count 3 asc 1) &quot;ireader&quot; 2) &quot;juejin&quot; 3) &quot;meituan&quot;</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&gt; georadius beijing 116.383882 39.922061 5 km withcoord withdist withhash count 3 asc 1) 1) &quot;gugong&quot; 2) &quot;1.7180&quot; 3) (integer) 4069885568932443 4) 1) &quot;116.4038559794426&quot; 2) &quot;39.92404192186725&quot; 2) 1) &quot;meishuguan&quot; 2) &quot;2.8693&quot; 3) (integer) 4069885710390435 4) 1) &quot;116.41532510519028&quot; 2) &quot;39.93123039107514&quot; 3) 1) &quot;dongwuyuan&quot; 2) &quot;4.4588&quot; 3) (integer) 4069879836419688 4) 1) &quot;116.34361892938614&quot; 2) &quot;39.94763257169722&quot;</pre>注意事項

実際のアプリケーションでは、何百万ものデータが存在する可能性がありますが、Redis

Geo

がそれらすべてを zset コレクションに入れることがわかっています。 Redis クラスター環境では、コレクションをあるノードから別のノードに移行することがあります。単一の

key

のデータが大きすぎる場合、クラスターの移行作業に大きな影響を与えます。クラスター環境、単一の key 対応するデータ量が 1M を超えてはなりません。そうしないと、クラスターの移行に遅れが生じ、オンライン サービスの通常の動作に影響します。 <p>したがって、<code>Geo データは、クラスター環境ではなく別の Redis インスタンスを使用してデプロイすることをお勧めします。

データ量が 1 億以上の場合は、Geo データを分割する必要があり、たとえ人口の多い都市であっても、国、地方、都市ごとに分割する必要があります。ゾーン。これにより、単一の zset セットのサイズを大幅に削減できます。

プログラミング関連の知識について詳しくは、プログラミング ビデオをご覧ください。 !

以上がRedis の GEO 地理的位置モジュールについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。