Todos os produtos
Search
Central de documentação

Tair (Redis® OSS-Compatible):Implementar um serviço de compras local com TairGIS

Última atualização: Jun 26, 2026

Quando plataformas de e-commerce precisam associar a localização de um consumidor à área de entrega de uma loja, consultas em bancos de dados baseados em disco, como MySQL ou PostGIS, podem se tornar um gargalo em cenários de alta escala. O TairGIS, uma estrutura de dados geoespacial do Tair (Enterprise Edition), usa índices R-tree para executar consultas CONTAINS, WITHIN e INTERSECTS em milissegundos — ideal para cenários de retirada em loja (BOPIS) e entrega na mesma cidade onde a baixa latência é essencial.

Este guia demonstra como usar o TairGIS para criar um serviço de localização de lojas: dadas as coordenadas de um consumidor, o sistema identifica quais lojas têm essa localização dentro de sua área de atendimento.

Por que usar TairGIS em vez de MySQL ou PostGIS

Fator

MySQL / PostGIS

TairGIS

Armazenamento

Baseado em disco

Em memória

Latência de consulta

Lenta em grandes volumes de dados

Milissegundos

Tipo de índice

B-tree / GiST

R-tree

Operações espaciais

API GIS completa

CONTAINS, WITHIN, INTERSECTS

Como funciona

Cada loja em uma plataforma de e-commerce define uma área de atendimento — a zona geográfica dentro da qual aceita pedidos. Essa área pode ser um bairro específico, uma região de formato irregular ou uma esfera com um raio determinado ao redor da loja.

Quando um consumidor faz um pedido, o sistema verifica se a localização do consumidor está dentro da área de atendimento de alguma loja. O TairGIS executa essa verificação com duas operações:

  1. Adicione as áreas de atendimento das lojas de uma marca ao TairGIS.

  2. Consulte as lojas disponíveis próximas ao consumidor com base em sua localização.

Pré-requisitos

Antes de começar, certifique-se de ter:

  • Uma instância do Tair (Enterprise Edition) com TairGIS ativado

  • Python 3.8

  • O Tair-py SDK instalado: execute pip3 install tair

Conectar a uma instância do Tair

Crie uma conexão com sua instância do Tair. Substitua os valores de exemplo pelo endpoint e pela senha reais.

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

def get_tair() -> Tair:
    """
    Connect to a Tair instance.
    - host: the endpoint of your Tair instance
    - port: the port number (default: 6379)
    - password: the password of the default database account.
      To connect with a custom database account, use 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

Adicionar áreas de atendimento das lojas

Use GIS.ADD para armazenar a área de atendimento de cada loja como uma geometria POLYGON em formato Well-Known Text (WKT). Agrupe as lojas pelo ID da marca para consultar todas as lojas de uma marca em uma única chamada.

def add_brand_store(brandID: str, mapping: Dict[str, str]) -> bool:
    """
    Add service areas for all stores of a brand using GIS.ADD.
    - brandID: the brand identifier (used as the TairGIS key)
    - mapping: a dict mapping store IDs to their WKT POLYGON geometries
    """
    try:
        tair = get_tair()
        ret = tair.gis_add(brandID, mapping)
        return ret == 1
    except ResponseError as e:
        print(e)
        return False

Consultar lojas disponíveis pela localização do consumidor

Use gis_contains para identificar quais lojas têm a localização do consumidor dentro de sua área de atendimento. Passe as coordenadas do consumidor como uma geometria WKT POINT.

def get_service_store(brandID: str, user_location: str):
    """
    Return stores whose service area contains the consumer's location.
    - brandID: the brand identifier
    - user_location: the consumer's location as a WKT POINT, e.g. 'POINT(lon lat)'
    """
    try:
        tair = get_tair()
        return tair.gis_contains(brandID, user_location)
    except:
        return None

(Opcional) Consultar todas as áreas de atendimento de uma marca

Use GIS.GETALL para recuperar as áreas de atendimento de todas as lojas de uma marca — útil para depuração ou para criar uma visualização de mapa de lojas.

def get_brand_all(brandID):
    """
    Return all stores and their service areas for a brand using GIS.GETALL.
    """
    try:
        tair = get_tair()
        return tair.gis_getall(brandID)
    except:
        return None

Exemplo

O exemplo a seguir adiciona duas lojas para brand1, recupera todas as áreas de atendimento e, em seguida, identifica qual loja atende um consumidor nas coordenadas (120.19707, 30.19539).

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

    # Add service areas for 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)'))

Saída esperada:

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

A loja disponível para o consumidor nas coordenadas (120.19707, 30.19539) é store_2.

Próximos passos