日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

基于TairGIS實現同城購業務

本文介紹通過云原生內存數據庫Tair的GIS結構,實現同城購業務。

背景說明

隨著同城購業務的興起,品牌商家在其眾多門店中判斷出距離消費者最近門店的場景越來越流行。

商家通常會對每一個門店設置可銷售的范圍,可能是以行政區劃分,也可能是不規則形狀的區域,或按照半徑圈選。如果消費者坐標在銷售范圍內,就認為該門店可以對該消費者進行銷售,否則,則不可銷售。此模型為:判斷點(消費者)和多邊形(門店銷售范圍)是否為包含關系。

同城購..jpeg

該方案的傳統架構通常使用MySQL或PostGIS數據庫,雖然其對GIS相關能力有專業的支持,API也比較完備,但是由于MySQL或PostGis數據庫本身磁盤存儲的特性,查詢速度較慢,特別是在數據量較大的場景下,會產生多次磁盤讀IO,容易導致業務查詢超時。

您可以使用TairGIS能力構建新一代判店系統,TairGIS底層使用RTree結構,支持常見的Contains、Within、Intersects等關系判斷,可以在毫秒(ms)級別返回查詢結果。更多信息請參見GIS

方案概述

  1. 將某品牌旗下各門店的銷售范圍存入GIS中。

  2. 根據消費者GPS坐標,查詢可進行銷售服務的門店。

代碼示例

本示例的Python版本為3.8,且已安裝Tair-py依賴,Tair-py的快捷安裝命令為:pip3 install tair

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


def get_tair() -> Tair:
    """
    該方法用于連接Tair實例。
    * host:Tair實例連接地址。
    * port:Tair實例的端口號,默認為6379。
    * password:Tair實例的密碼(默認賬號)。若通過自定義賬號連接,則密碼格式為“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


def add_brand_store(brandID: str, mapping: Dict[str, str]) -> bool:
    """
    該方法為通過GIS.ADD命令,將品牌(brandID)下的各門店(storeID)與其銷售范圍(store_wkt)存入GIS中。
    """
    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):
    """
    該方法為通過GIS.GETALL命令,獲取某品牌的全部門店及其對應銷售范圍。
    """
    try:
        tair = get_tair()
        return tair.gis_getall(brandID)
    except:
        return None


def get_service_store(brandID: str, user_location: str):
    """
    根據消費者坐標(user_location),查詢可進行銷售服務的門店。
    """
    try:
        tair = get_tair()
        return tair.gis_contains(brandID, user_location)
    except:
        return None


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

總結

同城購、買菜、本地商超等應用均可通過TairGIS數據結構,方便地實現地理相關的計算,同時也能滿足用戶對高性能的需求。

相關文檔