redis3.2新機能--GEO地理コマンド紹介

6922 ワード

概要


redis3.2 rcバージョンがリリースされてからしばらく経ちましたが、RedisConf 2016頃、3.2バージョンでreleaseがリリースされる見込みです.3.2バージョンで追加された最大の機能は、GEO(地理的位置)のサポートです.RedisのGEO特性といえば、最大の貢献はやはり私たち中国人です.redisの著者は3.2に新しい特性を導入したブログでGEOをサポートする理由を紹介した.GEO hashingのapiはArdbで実現され、Ardbはgithubユーザyinqiwenが実現したredisプロトコルに基づくnosqlシステムであり、ArdbはredisのほかにLevelDB、RocksDB、LMDBなどのkvエンジンをサポートしている.ここでArdbはGEO hashing機能を実現している.Ardbの作者のユーザー名と標識の位置から深センでArdbの作者が私たちの中国人であるべきであることを見ることができます.Ardbはc++で書かれています.redisのもう一人の開発者Matt StancliffはArdbからGEOライブラリを抽出し、C言語で書き換え、redisの独自のブランチに統合し、redisの著者に受け入れられ、3.2バージョンに統合された.GEOは現在、以下の6つのコマンドを提供しています.
1、geoadd:地理的位置の座標を増やします.
2、geopos:地理的位置の座標を取得します.
3、geodist:2つの地理的位置の距離を取得します.
4、georadius:指定された地理的位置座標に基づいて指定された範囲内の地理的位置の集合を取得します.
5、georadiusbymember:指定された地理的位置に基づいて指定された範囲内の地理的位置の集合を取得します.
6、geohash:ある地理的位置のgeohash値を取得する.
地理的位置の座標はWGS 84を基準とし、WGS 84、全称World Geometic System 1984は、GPSグローバル測位システムの使用のために構築された座標システムである.

GEOコマンド


具体的な各コマンドの使い方を見てみましょう.

geoadd


geoaddは地理的位置の座標を増加させるために使用され、地理的位置を一括的に追加することができ、コマンドのフォーマットは:
GEOADD key longitude latitude member [longitude latitude member ...]

keyは地理的位置の集合を識別します.longitude latitude memberは、地理的位置の座標を識別する.longitudeは地理的位置の経度であり、latitudeは地理的位置の緯度である.memberはこの地理的位置の名前です.GEOADDは、集合に地理的位置を一括して追加することができる.

geopos


geoposは地理的位置の座標を取得することができ、複数の地理的位置の座標を一括して取得することができ、コマンドフォーマットは:
GEOPOS key member [member ...]

geodist


geodistは、2つの地理的位置の距離を取得するために使用されます.コマンドのフォーマットは次のとおりです.
GEODIST key member1 member2 [m|km|ft|mi]

単位は、次の4つのタイプに指定できます.
m:メートル、距離の単位はデフォルトでメートルで、このパラメータを渡さない単位はメートルです.
km:キロ.
mi:マイルです.
ft:フィート.

georadius


georadiusは、指定された地理的位置座標に基づいて、指定された範囲内の地理的位置の集合を取得することができる.コマンドの形式は次のとおりです.
GEORADIUS key longitude latitude radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]
longitude latitudeは地理的位置の座標を識別し、radiusは範囲距離を表し、距離単位はm|km|ft|miであり、いくつかのオプションパラメータがある.
WITHCOORD:WITHCOORDパラメータを入力すると、結果に一致する位置の緯度が付きます.
WITHDIST:WITHDISTパラメータを入力すると、結果に一致する位置と所定の地理的位置との距離が付きます.
ASC|DESC:デフォルトの結果はソートされていません.入力ASCは近位から遠位までソートされ、入力DESCは遠位から近位までソートされます.
WITHHASH:WITHHASHパラメータを入力すると、結果に一致する位置のhash値が付きます.
COUNT count:COUNTパラメータを入力し、指定した数の結果を返すことができます.

georadiusbymember


georadiusbymemberは、指定された地理的位置に基づいて指定された範囲内の地理的位置の集合を取得することができる.georadiusコマンドは座標を渡し、georadiusbymemberは地理的位置を渡します.georadiusはより柔軟で、任意の座標点範囲の地理的位置を得ることができます.しかし、多くの場合、ある地理的位置の近くの他の地理的位置を取得したいだけで、georadiusbymemerを使用すると便利です.georadiusbymemberコマンドの形式は(コマンドオプションパラメータはgeoradiusの意味と同じです):
GEORADIUSBYMEMBER key member radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]

geohash


geohashは、ある地理的位置のgeohash値を取得することができる.geohashは2次元の緯度を文字列hash値に変換するアルゴリズムであり,後でgeohashの原理を具体的に紹介する.複数の地理的位置のgeohash値を一括して取得できます.コマンドの形式は次のとおりです.
GEOHASH key member [member ...]

redis GEO実装


redis GEOの実装には、主に次の2つの技術が含まれています.
1、geohashを使用して地理的位置の座標を保存します.
2、地理的位置の集合を秩序化集合(zset)で保存する.

geohash


geohashの考え方は2次元の経緯度を1次元の文字列に変換することであり、geohashには以下の3つの特徴がある.
1、文字列が長ければ長いほど、表現の範囲が正確になります.符号化長が8の場合、精度は19 m程度であり、符号化長が9の場合、精度は2 m程度である.
2、文字列が似ているのは距離が近いことを表し、文字列の接頭辞マッチングを利用して、近くの地理的位置を照会することができる.これにより、座標付近の地理的位置をすばやく検索できます.
3、geohashで計算した文字列は、元の経緯度を逆復号することができる.
この3つの特性はgeohashに2次元hash値を表すのに特に適している.この文章:GeoHashコア原理解析geohashの原理を詳しく紹介し,geohashの実現を知りたい方はこの文章を参考にしてください.

redis GEOコマンド実装


Redisが秩序集合(zset)を使用して地理的位置データを保存していること(redis秩序集合を理解したい場合は、この文章「秩序集合オブジェクト」を参照)とgeohashの特性を知ると、redisがどのようにredis GEOコマンドを実現するかが容易に理解できます.注意深い読者は、redisが地理的な削除コマンドを実現していないことに気づくかもしれません.ただし、GEOデータはzsetに保存されているため、zremで地理的位置を削除することができます.
geoaddコマンドで地理的位置を増やす場合は、まず地理的位置座標のgeohash値を計算し、次に地理的位置を秩序化集合のmemberとし、geohashをそのmemberのscoreとします.次にzaddコマンドを使用して秩序セットに挿入します.
geoposコマンドは、まず地理的位置に基づいてgeohash値を取得し、decodeは地理的位置の座標を取得します.
geodistコマンドは、2つの地理的位置に基づいてそれぞれ座標を取得し、2つの座標の距離を計算します.
georadiusとgeoradiusbymemberは同じ実装を使用しており、georadiusbymemberは地理的位置を対応する座標に変換するステップを増やしています.次に、この座標と周囲に対応する8つの座標が距離要件を満たす地理的位置を検索します.geohashで得られた値は実際には格子であり,点ではないため,周囲の8座標を計算することでエッジ問題を解決できる.秩序化された集合を使用して地理的位置を保存するため、対地列位置で範囲クエリーに基づいてzrangeコマンドを実現することに相当し、内部の実現は確かにzrangeコマンドと一致しているが、geoには特定の処理があり、例えば得られた地理的位置が、その地理的位置が所定の距離アクセスに合致するかどうかを計算する必要がある.
geohashは地理的なgeohash値を直接返します.
redisは、geohashに関してArdbのgeohashライブラリgeohash-intを使用し、redisが使用するgeohash符号化長は26ビットである.0.59 mの精度まで正確にできます.

まとめ


本稿では,GEOの背後にある雲霧を解くことにより,redisが秩序集合(zset)とgeohashを用い,redis自体が実現するコマンドフレームワークを加えることで,地理的位置に関するコマンドを容易に実現できることが分かる.