すべてのプロダクト
Search
ドキュメントセンター

Tair (Redis® OSS-Compatible):TairGIS を使用したローカルショッピングサービスの実装

最終更新日:Mar 29, 2026

EC プラットフォームが、消費者の位置情報を店舗の配達エリアと照合する必要がある場合、MySQL や PostGIS などのディスクベースデータベースに対するクエリは、スケール時にボトルネックとなる可能性があります。TairGIS は、Tair(Enterprise Edition)に組み込まれた地理空間データ構造であり、R 木インデックスを活用して、CONTAINS、WITHIN、INTERSECTS クエリをミリ秒単位で実行します。これにより、低遅延が極めて重要な「オンライン購入・店頭受け取り(BOPIS)」や同一都市内配送といったユースケースに最適です。

本ガイドでは、TairGIS を使用して店舗検索サービスを構築する方法について説明します。具体的には、消費者の座標を入力として、その位置がサービスエリア内に含まれる店舗を特定します。

MySQL や PostGIS ではなく TairGIS を選ぶ理由

項目MySQL / PostGISTairGIS
ストレージディスクベースインメモリ
クエリ遅延大量データ時におけるパフォーマンス低下ミリ秒
インデックス種別B ツリー / GiSTR 木
空間演算機能完全な GIS APICONTAINS、WITHIN、INTERSECTS

仕組み

EC プラットフォーム上の各店舗は、注文を受け付ける地理的範囲である「サービスエリア」を定義します。このサービスエリアは、特定の行政区画、不規則な形状の領域、または店舗を中心とした指定半径の球体などとして表現できます。

消費者が注文を行う際、システムはその消費者の位置がいずれかの店舗のサービスエリア内に含まれるかどうかをチェックします。TairGIS では、以下の 2 つの操作でこれを実現します。

  1. ブランドごとの利用可能な店舗の範囲を TairGIS に登録します。

  2. 消費者の位置情報をもとに、近隣の利用可能な店舗をクエリします。

前提条件

開始する前に、以下の環境が整っていることを確認してください。

  • Tair(Enterprise Edition)インスタンス(TairGIS 機能が有効化済み)

  • Python 3.8

  • Tair-py SDK をインストール済み:pip3 install tair を実行します。

Tair インスタンスへの接続

Tair インスタンスに接続します。プレースホルダー値(エンドポイントおよびパスワード)を、実際の値に置き換えてください。

# -*- coding: utf-8 -*-
from typing import Dict
from tair import Tair
from tair import ResponseError


def get_tair() -> Tair:
    """
    Tair インスタンスに接続します。
    - host: Tair インスタンスのエンドポイント
    - port: ポート番号(デフォルト: 6379)
    - password: デフォルトデータベースアカウントのパスワード。
      カスタムデータベースアカウントで接続する場合は、username:password 形式を使用します。
    """
    tair: Tair = Tair(
        host="r-8vb************.redis.zhangbei.rds.aliyuncs.com",
        port=6379,
        db=0,
        password="D******23",
        decode_responses=True
    )
    return tair

店舗のサービスエリアの登録

GIS.ADD コマンドを使用して、各店舗のサービスエリアを Well-Known Text(WKT)形式の POLYGON ジオメトリとして登録します。ブランド ID ごとに店舗をグループ化することで、1 回の呼び出しで特定ブランドのすべての店舗をクエリできるようになります。

def add_brand_store(brandID: str, mapping: Dict[str, str]) -> bool:
    """
    GIS.ADD を使用して、ブランドのすべての店舗のサービスエリアを登録します。
    - brandID: ブランド識別子(TairGIS のキーとして使用)
    - mapping: 店舗 ID を WKT POLYGON ジオメトリにマッピングした辞書
    """
    try:
        tair = get_tair()
        ret = tair.gis_add(brandID, mapping)
        return ret == 1
    except ResponseError as e:
        print(e)
        return False

消費者の位置に基づく利用可能店舗のクエリ

gis_contains を使用して、消費者の位置がサービスエリア内に含まれる店舗を特定します。消費者の座標は、WKT POINT ジオメトリ形式で渡します。

def get_service_store(brandID: str, user_location: str):
    """
    サービスエリア内に消費者の位置が含まれる店舗を返します。
    - brandID: ブランド識別子
    - user_location: 消費者の位置を表す WKT POINT(例: 'POINT(lon lat)')
    """
    try:
        tair = get_tair()
        return tair.gis_contains(brandID, user_location)
    except:
        return None

(任意)ブランドのすべてのサービスエリアをクエリ

GIS.GETALL を使用して、特定ブランドのすべての店舗のサービスエリアを取得します。デバッグや店舗マップ表示の構築に役立ちます。

def get_brand_all(brandID):
    """
    GIS.GETALL を使用して、ブランドのすべての店舗およびそのサービスエリアを返します。
    """
    try:
        tair = get_tair()
        return tair.gis_getall(brandID)
    except:
        return None

サンプル

以下のサンプルでは、brand1 の 2 店舗のサービスエリアを登録し、すべてのサービスエリアを取得した後、座標 (120.19707, 30.19539) にいる消費者が利用可能な店舗を特定しています。

if __name__ == "__main__":
    tair = get_tair()

    # brand1 の 2 店舗のサービスエリアを登録
    add_brand_store(
        "brand1",
        {
            "store_1": "POLYGON ((120.14772 30.19513, 120.15370 30.17838, 120.19385 30.18011, 120.18853 30.20817))",
            "store_2": "POLYGON ((120.18986 30.20852, 120.19651 30.17988, 120.22512 30.17978, 120.21667 30.22292))"
        },
    )

    print("brand1 のすべての店舗およびその利用可能な範囲をクエリします:")
    print(get_brand_all('brand1'))

    print("座標 (120.19707, 30.19539) にいる消費者が利用可能な店舗をクエリします:")
    print(get_service_store('brand1', 'POINT(120.19707 30.19539)'))

期待される出力:

brand1 のすべての店舗およびその利用可能な範囲をクエリします。
['store_1', 'POLYGON((120.14772 30.19513,120.1537 30.17838,120.19385 30.18011,120.18853 30.20817))', 'store_2', 'POLYGON((120.18986 30.20852,120.19651 30.17988,120.22512 30.17978,120.21667 30.22292))']
座標 (120.19707, 30.19539) にいる消費者が利用可能な店舗をクエリします。
[1, ['store_2', 'POLYGON((120.18986 30.20852,120.19651 30.17988,120.22512 30.17978,120.21667 30.22292))']]

座標 (120.19707, 30.19539) にいる消費者が利用可能な店舗は、store_2 です。

次のステップ