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

Tair (Redis® OSS-Compatible):TairGISを使用してローカル購入サービスを実装する

最終更新日:Sep 12, 2024

このトピックでは、TairのTairGISデータ構造を使用してローカル購入サービスを実装する方法について説明します。

背景情報

eコマースプラットフォーム上のローカル購入サービスは、消費者が望むものを提供する最も近い店舗に関する情報に基づいて提供される。

eコマースプラットフォームにサインアップするすべてのストアには、オンライン注文の利用可能なスコープがあります。 スコープは、特定の地区、不規則な形状のエリア、または店舗の周りに所定の半径を持つ球である場合があります。 オンライン注文がストアの利用可能なスコープ内にある場合、ストアは注文を受け取ります。 それ以外の場合、ストアは利用できません。 このシナリオでは、オンライン注文が店舗の利用可能な範囲内にあるかどうかをシステムが判断する必要があります。

このシナリオに対するレガシーソリューションは、通常、MySQLまたはPostGISを使用します。これは、地理情報システム (GIS) データを処理するための完全なAPIセットを提供します。 ただし、MySQLおよびPostGISでは、特にデータ量が多いシナリオでは、これらのデータベースシステムがディスクにデータを保存するため、クエリが遅くなる可能性があります。

この場合、代わりにTairGISを使用できます。 TairGISは、Rツリーインデックスを使用し、CONTAINS、WITHIN、またはINTERSECTSを含むクエリをミリ秒以内に実行するデータ構造です。 詳細については、「GIS」をご参照ください。

解決策

  1. ブランドのストアの利用可能なスコープをTairGISに追加します。

  2. 消費者の位置に基づいて、消費者の近くにある利用可能な店舗を照会する。

サンプルコード

この例では、Python 3.8が使用され、Tair-pyがインストールされています。 pip3 install tairコマンドを実行してTair-pyをインストールできます。

# -*- coding: utf-8 -*-
# !/usr/bin/env python
from typing import Dict
from tair import Tair
from tair import ResponseError


def get_tair() -> Tair:
    """
    This method is used to connect to a Tair instance. 
    * host: the endpoint that is used to connect to the Tair instance. 
    * port: the port number that is used to connect to the Tair instance. Default value: 6379. 
    * password: the password of the default database account of the Tair instance. If you want to connect to the Tair instance by using a custom database account, you must specify the password in the username:password format. 
    """
    tair: Tair = Tair(
        host="r-8vb************.redis.zhangbei.rds.aliyuncs.com",
        port=6379,
        db=0,
        password="D******23",
        decode_responses=True
    )
    return tair


def add_brand_store(brandID: str, mapping: Dict[str, str]) -> bool:
    """
    This method uses the GIS.ADD command to add the information about the available scopes of stores of a brand to TairGIS. 
    """
    try:
        tair = get_tair()
        ret = tair.gis_add(brandID, mapping)
        return ret == 1
    except ResponseError as e:
        print(e)
        return False


def get_brand_all(brandID):
    """
    This method uses the GIS.GETALL command to query the available scopes of all stores of a brand. 
    """
    try:
        tair = get_tair()
        return tair.gis_getall(brandID)
    except:
        return None


def get_service_store(brandID: str, user_location: str):
    """
    Query available stores that sit near a consumer based on the location of the consumer. 
    """
    try:
        tair = get_tair()
        return tair.gis_contains(brandID, user_location)
    except:
        return None


if __name__ == "__main__":
    tair = get_tair()
    # Add the available scopes of two stores of brand1. 
    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("Query all the stores of brand1 and their available scopes:")
    print(get_brand_all('brand1'))
    print("Query the available stores for a consumer who is located at coordinates (120.19707, 30.19539):")
    print(get_service_store('brand1', 'POINT(120.19707 30.19539)'))

サンプル成功出力:

Query all the stores of brand1 and their available scopes.
['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))']
Query the available stores for a consumer who is located at coordinates (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です。

概要

地理空間データ構造TairGISは、eコマースプラットフォームに登録されたマーチャントがローカル購入サービスを正確かつ効率的に提供するのに役立ちます。

関連ドキュメント