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
| Factor | MySQL / PostGIS | TairGIS |
|---|---|---|
| Storage | Disk-based | In-memory |
| Query latency | Lambat pada volume data besar | Milidetik |
| Index type | B-tree / GiST | R-tree |
| Spatial operations | Full GIS API | CONTAINS, 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:
Menambahkan cakupan layanan toko-toko dari suatu brand ke TairGIS.
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 tairTambahkan 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 FalseKueri 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 NoneContoh
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
Implementasikan digital fences menggunakan TairGIS — gunakan TairGIS untuk memantau apakah entitas yang dilacak memasuki atau keluar dari batas geografis yang telah ditentukan
Referensi perintah TairGIS — referensi lengkap untuk perintah GIS.ADD, GIS.GETALL, GIS.CONTAINS, dan perintah TairGIS lainnya