Redis の GEO 地理的位置モジュールについて話しましょう
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 は緯度と経度の座標に双方向複合インデックスを追加する必要があります。 ただし、データベース クエリのパフォーマンスには結局のところ制限があるため、同時実行性が高い状況で使用する場合、これは良い解決策ではない可能性があります。
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
に格納されます。zset
のvalue
はkey
、score
は、GeoHash
の 52 ビット整数値です。 - 地理クエリに Redis を使用する場合、その内部構造は実際には単なる
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
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"
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"
geohash key member [member ...]
127.0.0.1:6379> geohash beijing gugong
1) "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> georadiusbymember company ireader 20 km count 3 asc
1) "ireader"
2) "juejin"
3) "meituan"</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> 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><div class="contentsignin">ログイン後にコピー</div></div><code>注意事項
実際のアプリケーションでは、何百万ものデータが存在する可能性がありますが、Redis
Geoがそれらすべてを zset コレクションに入れることがわかっています。 Redis クラスター環境では、コレクションをあるノードから別のノードに移行することがあります。単一の
key のデータが大きすぎる場合、クラスターの移行作業に大きな影響を与えます。クラスター環境、単一の key
対応するデータ量が 1M
を超えてはなりません。そうしないと、クラスターの移行に遅れが生じ、オンライン サービスの通常の動作に影響します。 <p>したがって、<code>Geo
データは、クラスター環境ではなく別の Redis インスタンスを使用してデプロイすることをお勧めします。
データ量が 1 億以上の場合は、Geo
データを分割する必要があり、たとえ人口の多い都市であっても、国、地方、都市ごとに分割する必要があります。ゾーン。これにより、単一の zset
セットのサイズを大幅に削減できます。
プログラミング関連の知識について詳しくは、プログラミング ビデオをご覧ください。 !
以上がRedis の GEO 地理的位置モジュールについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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

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