目次
データベース計算を使用する
GEO アルゴリズム
がそれらすべてを zset コレクションに入れることがわかっています。 Redis クラスター環境では、コレクションをあるノードから別のノードに移行することがあります。単一の
ホームページ データベース Redis Redis の GEO 地理的位置モジュールについて話しましょう

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

Dec 28, 2021 am 10:10 AM
geo redis

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 を使用します) <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;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><div class="contentsignin">ログイン後にコピー</div></div>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。座標値に基づいて近くの要素をクエリします<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'> georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DES]</pre><div class="contentsignin">ログイン後にコピー</div></div><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;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><div class="contentsignin">ログイン後にコピー</div></div><code>注意事項

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

Geo

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

key

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

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

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

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

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Redisクラスターモードの構築方法 Redisクラスターモードの構築方法 Apr 10, 2025 pm 10:15 PM

Redisクラスターモードは、シャードを介してRedisインスタンスを複数のサーバーに展開し、スケーラビリティと可用性を向上させます。構造の手順は次のとおりです。異なるポートで奇妙なRedisインスタンスを作成します。 3つのセンチネルインスタンスを作成し、Redisインスタンスを監視し、フェールオーバーを監視します。 Sentinel構成ファイルを構成し、Redisインスタンス情報とフェールオーバー設定の監視を追加します。 Redisインスタンス構成ファイルを構成し、クラスターモードを有効にし、クラスター情報ファイルパスを指定します。各Redisインスタンスの情報を含むnodes.confファイルを作成します。クラスターを起動し、CREATEコマンドを実行してクラスターを作成し、レプリカの数を指定します。クラスターにログインしてクラスター情報コマンドを実行して、クラスターステータスを確認します。作る

Redisデータをクリアする方法 Redisデータをクリアする方法 Apr 10, 2025 pm 10:06 PM

Redisデータをクリアする方法:Flushallコマンドを使用して、すべての重要な値をクリアします。 FlushDBコマンドを使用して、現在選択されているデータベースのキー値をクリアします。 [選択]を使用してデータベースを切り替え、FlushDBを使用して複数のデータベースをクリアします。 DELコマンドを使用して、特定のキーを削除します。 Redis-CLIツールを使用してデータをクリアします。

Redisコマンドの使用方法 Redisコマンドの使用方法 Apr 10, 2025 pm 08:45 PM

Redis指令を使用するには、次の手順が必要です。Redisクライアントを開きます。コマンド(動詞キー値)を入力します。必要なパラメーターを提供します(指示ごとに異なります)。 Enterを押してコマンドを実行します。 Redisは、操作の結果を示す応答を返します(通常はOKまたは-ERR)。

Redisロックの使用方法 Redisロックの使用方法 Apr 10, 2025 pm 08:39 PM

Redisを使用して操作をロックするには、setnxコマンドを介してロックを取得し、有効期限を設定するために有効期限コマンドを使用する必要があります。特定の手順は次のとおりです。(1)SETNXコマンドを使用して、キー価値ペアを設定しようとします。 (2)expireコマンドを使用して、ロックの有効期限を設定します。 (3)Delコマンドを使用して、ロックが不要になったときにロックを削除します。

Redisキューの読み方 Redisキューの読み方 Apr 10, 2025 pm 10:12 PM

Redisのキューを読むには、キュー名を取得し、LPOPコマンドを使用して要素を読み、空のキューを処理する必要があります。特定の手順は次のとおりです。キュー名を取得します:「キュー:キュー」などの「キュー:」のプレフィックスで名前を付けます。 LPOPコマンドを使用します。キューのヘッドから要素を排出し、LPOP Queue:My-Queueなどの値を返します。空のキューの処理:キューが空の場合、LPOPはnilを返し、要素を読む前にキューが存在するかどうかを確認できます。

単一のスレッドレディスの使用方法 単一のスレッドレディスの使用方法 Apr 10, 2025 pm 07:12 PM

Redisは、単一のスレッドアーキテクチャを使用して、高性能、シンプルさ、一貫性を提供します。 I/Oマルチプレックス、イベントループ、ノンブロッキングI/O、共有メモリを使用して同時性を向上させますが、並行性の制限、単一の障害、および書き込み集約型のワークロードには適していません。

基礎となるRedisを実装する方法 基礎となるRedisを実装する方法 Apr 10, 2025 pm 07:21 PM

Redisはハッシュテーブルを使用してデータを保存し、文字列、リスト、ハッシュテーブル、コレクション、注文コレクションなどのデータ構造をサポートします。 Redisは、スナップショット(RDB)を介してデータを維持し、書き込み専用(AOF)メカニズムを追加します。 Redisは、マスタースレーブレプリケーションを使用して、データの可用性を向上させます。 Redisは、シングルスレッドイベントループを使用して接続とコマンドを処理して、データの原子性と一貫性を確保します。 Redisは、キーの有効期限を設定し、怠zyな削除メカニズムを使用して有効期限キーを削除します。

Redisのソースコードを読み取る方法 Redisのソースコードを読み取る方法 Apr 10, 2025 pm 08:27 PM

Redisソースコードを理解する最良の方法は、段階的に進むことです。Redisの基本に精通してください。開始点として特定のモジュールまたは機能を選択します。モジュールまたは機能のエントリポイントから始めて、行ごとにコードを表示します。関数コールチェーンを介してコードを表示します。 Redisが使用する基礎となるデータ構造に精通してください。 Redisが使用するアルゴリズムを特定します。

See all articles