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:
| Masalah | Dampak |
|---|---|
| Penggabungan string | Aplikasi Anda harus membangun dan mengurai kunci komposit seperti user_1_phone pada setiap operasi baca dan tulis |
| Overhead pengodean | Penguraian kunci berulang meningkatkan beban CPU dan kompleksitas kode |
| Duplikasi penyimpanan | Awalan ID pengguna diulang di setiap kunci spesifik perangkat |
TairHash mengatasi ketiganya: satu kunci per pengguna, satu bidang per perangkat, dan satu TTL per bidang.

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
EXHGETALLuntuk 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
| Tujuan | Perintah | Deskripsi |
|---|---|---|
| Menulis token dengan TTL | EXHSET key field value EX seconds | Menetapkan TTL tingkat bidang dalam detik |
| Membaca semua token aktif | EXHGETALL key | Mengembalikan 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/pcOutput 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.