All Products
Search
Document Center

Tair (Redis® OSS-Compatible):Manage\ multi\-device\ user\ logon\ with\ TairHash

Last Updated:Mar 29, 2026

TairHash adalah struktur data ekstensi internal dari Tair yang memungkinkan Anda menetapkan waktu hidup (TTL) dan nomor versi untuk setiap bidang. Saat satu pengguna masuk dari beberapa perangkat, menyimpan setiap sesi sebagai string Redis mengharuskan Anda menggabungkan ID pengguna dan jenis perangkat menjadi satu kunci—misalnya, User_1_phone. TairHash menghilangkan pendekatan tidak langsung ini dengan memetakan struktur sesi secara langsung ke model datanya: tetapkan key ke ID pengguna, field ke jenis perangkat, dan value ke token sesi. Karena TairHash mendukung pengaturan TTL baik untuk kunci maupun bidang, token kedaluwarsa secara independen per perangkat tanpa memerlukan logika aplikasi tambahan.

Mengapa string Redis standar tidak memadai

Untuk sesi satu perangkat, string Redis bekerja dengan baik. Namun, sesi multi-perangkat mengungkap tiga masalah:

MasalahDampak
Penggabungan stringAplikasi Anda harus membangun dan mengurai kunci komposit seperti user_1_phone pada setiap operasi baca dan tulis
Overhead pengodeanPenguraian kunci berulang meningkatkan beban CPU dan kompleksitas kode
Duplikasi penyimpananAwalan ID pengguna diulang di setiap kunci spesifik perangkat

TairHash mengatasi ketiganya: satu kunci per pengguna, satu bidang per perangkat, dan satu TTL per bidang.

Comparison between Redis strings and TairHash

Kasus penggunaan

TTL tingkat bidang dalam TairHash cocok untuk beberapa pola manajemen sesi:

  • Manajemen token multi-perangkat: Simpan satu token per perangkat di bawah satu kunci pengguna. Setiap token kedaluwarsa secara independen berdasarkan aktivitas sesi perangkat tersebut.

  • Pelacakan sesi aktif: Gunakan EXHGETALL untuk mencantumkan semua sesi aktif pengguna. Bidang yang telah kedaluwarsa secara otomatis dikecualikan, sehingga hasil selalu mencerminkan status aktif terkini.

  • Pembersihan sesi otomatis: Tetapkan TTL pendek pada token saat login. Ketika pengguna tidak aktif pada suatu perangkat lebih lama dari TTL-nya, sesi tersebut dihapus tanpa perlu pekerjaan pembersihan terjadwal.

Perintah utama

TujuanPerintahDeskripsi
Menulis token dengan TTLEXHSET key field value EX secondsMenetapkan TTL tingkat bidang dalam detik
Membaca semua token aktifEXHGETALL keyMengembalikan hanya bidang yang belum kedaluwarsa

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Instans Tair (Alibaba Cloud Redis dengan ekstensi Tair diaktifkan)

  • Python 3.8 atau versi lebih baru

  • tair-py terinstal (pip3 install tair) — kode sumber tersedia di github.com/alibaba/tair-py

Simpan dan ambil token sesi

Contoh berikut menyimpan token untuk dua pengguna di beberapa perangkat, menunggu 6 detik, lalu mengambil token aktif yang tersisa. Setelah 6 detik, token ponsel user1 (TTL = 5 detik) telah kedaluwarsa dan tidak termasuk dalam hasil.

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


def get_tair() -> Tair:
    # Terhubung ke instans Tair.
    # host: titik akhir instans Tair Anda
    # port: default adalah 6379
    # username: biarkan kosong untuk menggunakan akun default
    # password: dibaca dari variabel lingkungan TAIR_PASSWORD
    return Tair(
        host="r-bp************.redis.rds.aliyuncs.com",
        port=6379,
        db=0,
        username="",
        password=os.environ.get("TAIR_PASSWORD"),
    )


def add_user_token(tair: Tair, user_id: str, device: str, token: str, ttl_seconds: int) -> bool:
    # Simpan token sesi menggunakan EXHSET dengan TTL per bidang.
    # key   = user_id  (mengelompokkan semua perangkat untuk satu pengguna)
    # field = device   (mengidentifikasi jenis perangkat)
    # value = token    (token sesi)
    # ex    = TTL dalam detik
    try:
        result = tair.exhset(user_id, device, token, ex=ttl_seconds)
        return result == 1
    except ResponseError as e:
        print(e)
        return False


def print_active_tokens(tair: Tair, user_id: str):
    # EXHGETALL hanya mengembalikan bidang yang belum kedaluwarsa.
    for entry in tair.exhgetall(user_id):
        print("{}:{}".format(user_id, entry))


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

    user_1 = "user1"
    user_2 = "user2"

    # Tulis empat token dengan TTL berbeda.
    add_user_token(tair, user_1, "phone", "token_123", 5)   # kedaluwarsa dalam 5 dtk
    add_user_token(tair, user_1, "pad",   "token_124", 10)  # kedaluwarsa dalam 10 dtk
    add_user_token(tair, user_2, "pad",   "token_456", 10)  # kedaluwarsa dalam 10 dtk
    add_user_token(tair, user_2, "pc",    "token_457", 10)  # kedaluwarsa dalam 10 dtk

    # Tunggu 6 detik. Token ponsel user1 (TTL = 5 dtk) akan kedaluwarsa.
    print("Menunggu 6 detik...")
    time.sleep(6)

    # Hanya 3 dari 4 token yang dikembalikan; user1/phone telah kedaluwarsa.
    print_active_tokens(tair, user_1)  # mencetak hanya user1/pad
    print_active_tokens(tair, user_2)  # mencetak user2/pad dan user2/pc

Output yang diharapkan:

Menunggu 6 detik...
user1:{field: pad, value: token_124}
user2:{field: pad, value: token_456}
user2:{field: pc, value: token_457}

user1/phone tidak muncul karena TTL 5 detiknya telah habis sebelum kueri dilakukan. Ketiga token lainnya, yang masing-masing ditetapkan dengan TTL 10 detik, masih aktif.

Topik terkait