【入門編】 Geospatial:地理空間情報 – Redis

こんにちは。Redisの世界へようこそ。

「地理空間情報」なんて聞くと、なんだか難しそうな地図システムを想像して身構えてしまうかもしれませんね。でも大丈夫。RedisのGeospatial(地理空間)機能は、実は驚くほどシンプルで、かつ実用的です。

今日は、Redisがどうやって「場所」を記憶し、どうやって「近くのスポット」を探し出しているのか、その本質を紐解いていきましょう。ここをクリアすれば、あなたのアプリケーションに「位置情報」という強力な武器が加わりますよ。

—

1. 「場所」をどう記憶する?:GEOADDの魔法

まず、Redisが場所をどう覚えるか。想像してみてください。あなたは巨大なホワイトボードに「お店の名前」と「その場所(緯度・経度)」をピンで留めていく係です。

Redisでは、これを `GEOADD` というコマンドで行います。

「カフェ・ド・Redis」を、緯度35.6812, 経度139.7671の場所に登録
GEOADD my_spots 139.7671 35.6812 “Cafe Redis”

近くの「パン屋」も登録
GEOADD my_spots 139.7680 35.6820 “Bread Shop”

ここがポイント:
Redisは内部的に「Sorted Set(順序付き集合)」というデータ構造を使っています。実は、位置情報を「Geohash(ジオハッシュ)」という特殊な形式に変換して保存しているんです。簡単に言うと、「地図を細かいマス目に切り分けて、そこに番号を振っている」ような状態。だから、計算が爆速なんです。

2. 場所を特定する:GEOPOSとGEOHASH

登録した場所を後から確認したくなったらどうしますか?

  • GEOPOS: 「あの店の正確な緯度経度を教えて」
  • GEOHASH: 「あの場所をハッシュ文字列(例: `xn77h`)に変換して」

「Cafe Redis」の場所を照会
GEOPOS my_spots “Cafe Redis”
結果: 139.76710, 35.68120

位置を短い文字列(ハッシュ)で表現
GEOHASH my_spots “Cafe Redis”
結果: “xn77h4…”

この文字列、実は「同じエリアにある場所は、文字列の先頭が似ている」という性質があります。検索効率を極限まで高めるための、エンジニアの知恵ですね。

3. 距離を測る:GEODIST

「いまいる場所から、目的地まで何メートル?」という問いに答えるのが `GEODIST` です。

2つの地点の距離をメートル単位で取得
GEODIST my_spots “Cafe Redis” “Bread Shop” km
結果: 0.123 (約123メートル離れている)

わざわざ自分でピタゴラスの定理を計算する必要はありません。Redisが地球の曲率(地球は丸いこと)まで考慮して、正確な距離を瞬時に計算してくれます。

4. 最も重要な機能:GEORADIUS(近傍検索)

さあ、ここからが本番です。アプリでよくある「近くのレストランを探す」機能。これをRedisで実現するのが `GEORADIUS` です。

「指定した地点から半径○km以内のスポットを全部教えて!」という命令ですね。

「東京駅(139.7671, 35.6812)」から半径1km以内のスポットを検索
GEORADIUS my_spots 139.7671 35.6812 1 km WITHDIST
結果:
1) “Cafe Redis” 0.0000
2) “Bread Shop” 0.1230

なぜこれがすごいのか?
本来、地図上の検索は「範囲」を計算するため、非常に重い処理になりがちです。しかし、Redisは先ほど言った「マス目(Geohash)」のおかげで、「今いるマス目と、その隣のマス目だけ見ればいい」という状態を作れます。だから、データが数百万件あっても、検索は一瞬で終わります。

—

先輩エンジニアからのアドバイス

Redisで位置情報を扱う際、一番大切なのは「完璧を目指しすぎない」ことです。

Redisは「超高速なリアルタイム検索」には最強ですが、Googleマップのような複雑な経路探索や詳細な地図表示には向きません。あくまで「いま、近くにあるものは何か?」を即座に返すためのスペシャリストだと思ってください。

  • 何でもRedisに突っ込まない: 検索対象となる重要なスポットだけを絞り込む。
  • メモリを意識する: Sorted Setはメモリを消費します。不要なデータは `ZREM` で削除する癖をつけましょう。

どうでしょう? 地理空間情報も、こうして分解してみると怖くないはずです。
まずは手元のRedisで `GEOADD` から試してみてください。自分の好きな場所を登録して、近くを検索してみる。その小さな一歩が、巨大なシステムを支えるアーキテクチャへの第一歩ですよ。

また何か詰まったら、いつでも聞きに来てくださいね。応援しています!

コメント

タイトルとURLをコピーしました