All Products
Search
Document Center

Tair (Redis® OSS-Compatible):Implementasikan layanan belanja lokal menggunakan TairGIS

Last Updated:Mar 29, 2026

Saat platform e-commerce perlu mencocokkan lokasi konsumen dengan area pengiriman toko, kueri terhadap database berbasis disk seperti MySQL atau PostGIS dapat menjadi bottleneck pada skala besar. TairGIS, struktur data geospasial dalam Tair (Enterprise Edition), menggunakan indeks R-tree untuk menjalankan kueri CONTAINS, WITHIN, dan INTERSECTS dalam hitungan milidetik—sehingga sangat cocok untuk skenario buy-online-pickup-in-store (BOPIS) dan pengiriman dalam kota yang membutuhkan latensi rendah.

Panduan ini menunjukkan cara menggunakan TairGIS untuk membangun layanan pencari toko: diberikan koordinat konsumen, identifikasi toko-toko yang mencakup lokasi tersebut dalam area layanannya.

Mengapa TairGIS dibandingkan MySQL atau PostGIS

FactorMySQL / PostGISTairGIS
StorageDisk-basedIn-memory
Query latencyLambat pada volume data besarMilidetik
Index typeB-tree / GiSTR-tree
Spatial operationsFull GIS APICONTAINS, WITHIN, INTERSECTS

Cara kerja

Setiap toko pada platform e-commerce menentukan area layanan—zona geografis tempat toko tersebut menerima pesanan. Area layanan dapat berupa distrik tertentu, area berbentuk tidak beraturan, atau lingkaran dengan radius tertentu di sekitar toko.

Saat konsumen melakukan pemesanan, sistem memeriksa apakah lokasi konsumen berada dalam area layanan salah satu toko. TairGIS menangani hal ini melalui dua operasi:

  1. Menambahkan cakupan layanan toko-toko dari suatu brand ke TairGIS.

  2. Mengkueri toko-toko yang tersedia di dekat konsumen berdasarkan lokasi konsumen.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Instans Tair (Enterprise Edition) dengan TairGIS diaktifkan

  • Python 3.8

  • SDK Tair-py yang telah diinstal: jalankan pip3 install tair

Hubungkan ke instans Tair

Buat koneksi ke instans Tair Anda. Ganti nilai placeholder dengan endpoint dan password aktual Anda.

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


def get_tair() -> Tair:
    """
    Hubungkan ke instans Tair.
    - host: titik akhir instans Tair Anda
    - port: nomor port (default: 6379)
    - password: password akun database default.
      Untuk menghubungkan dengan akun database kustom, gunakan format 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

Tambahkan area layanan toko

Gunakan GIS.ADD untuk menyimpan area layanan setiap toko sebagai geometri POLYGON dalam format Well-Known Text (WKT). Kelompokkan toko berdasarkan ID brand agar Anda dapat mengkueri semua toko untuk brand tertentu dalam satu panggilan.

def add_brand_store(brandID: str, mapping: Dict[str, str]) -> bool:
    """
    Tambahkan area layanan semua toko suatu brand menggunakan GIS.ADD.
    - brandID: pengenal brand (digunakan sebagai kunci TairGIS)
    - mapping: dict yang memetakan ID toko ke geometri POLYGON WKT-nya
    """
    try:
        tair = get_tair()
        ret = tair.gis_add(brandID, mapping)
        return ret == 1
    except ResponseError as e:
        print(e)
        return False

Kueri toko yang tersedia berdasarkan lokasi konsumen

Gunakan gis_contains untuk menemukan toko-toko yang mencakup lokasi konsumen dalam area layanannya. Berikan koordinat konsumen sebagai geometri WKT POINT.

def get_service_store(brandID: str, user_location: str):
    """
    Kembalikan toko-toko yang area layanannya mencakup lokasi konsumen.
    - brandID: pengenal brand
    - user_location: lokasi konsumen dalam bentuk WKT POINT, contoh: 'POINT(lon lat)'
    """
    try:
        tair = get_tair()
        return tair.gis_contains(brandID, user_location)
    except:
        return None

(Opsional) Kueri semua area layanan untuk suatu brand

Gunakan GIS.GETALL untuk mengambil area layanan semua toko untuk brand tertentu—berguna untuk debugging atau membangun tampilan peta toko.

def get_brand_all(brandID):
    """
    Kembalikan semua toko beserta area layanannya untuk suatu brand menggunakan GIS.GETALL.
    """
    try:
        tair = get_tair()
        return tair.gis_getall(brandID)
    except:
        return None

Contoh

Contoh berikut menambahkan dua toko untuk brand1, mengambil semua area layanan, lalu menentukan toko mana yang melayani konsumen di koordinat (120.19707, 30.19539).

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

    # Tambahkan area layanan untuk dua toko 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("Kueri semua toko brand1 dan cakupan layanan mereka:")
    print(get_brand_all('brand1'))

    print("Kueri toko yang tersedia untuk konsumen yang berlokasi di koordinat (120.19707, 30.19539):")
    print(get_service_store('brand1', 'POINT(120.19707 30.19539)'))

Output yang diharapkan:

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))']]

Toko yang tersedia untuk konsumen yang berlokasi di koordinat (120.19707, 30.19539) adalah store_2.

Langkah selanjutnya