Redis — kiểu dữ liệu

Kiểu dữ liệu của Redis cho vị trí Senior Backend / Tech Lead: mỗi kiểu thật ra được cất thế nào, tốn bao nhiêu RAM, lệnh nào chặn cả server, sai ở đâu khi nhiều worker cùng ghi, khi failover, khi dữ liệu lớn dần — và khi nào nên dùng hệ thống khác. Ví dụ trộn LMS (điểm danh, khoá học, học viên online) và e-commerce (giỏ hàng, tồn kho, đơn hàng). Nên đọc bài 1 trước, các bài sau đọc theo nhu cầu. Mọi output là output thật: Redis 8.8.0 (so với Redis 7.4.11 và Valkey 9.1.2), Laravel 12.64 + phpredis 6.3, PostgreSQL 18.4.

Bài 1 · Nền tảng

Redis là data structure server — key, kiểu, encoding, độ phức tạp và cách chọn kiểu

GET-sửa-SET JSON mất 899/1000 lần cộng; HGETALL 1 triệu field chặn mọi client 311 ms; zset 128 → 129 member RAM ×12; ngưỡng embstr của 8.8 tính cả tên key; RDB 14 không về được 7.4 hay Valkey.

Bài 2 · String

String, Bitmap, Bitfield, HyperLogLog — một mảng byte, bốn cách nhìn

SET xoá TTL cũ; 1 bit ở offset cuối = 640 MB; điểm danh bitmap 16 KB vs set 2,5 MB; HLL ±1% trong 14 KB; INCREX (8.8) và SET … IFEQ (8.4); bẫy facade Laravel.

Bài 3 · Hash, Set

Hash và Set — TTL từng field, listpack, phép tập hợp, rút thăm

HSET xoá TTL field; ép listpack 10 000 field làm HSET chậm 260 lần; SUNIONSTORE 1,25 s; "ai online" bằng set sai mãi; SRANDMEMBER không đều (69–388 lần cho kỳ vọng 200).

Bài 4 · List, Array

List và Array — hàng đợi, N mới nhất, ring buffer, kiểu Array mới của 8.8

LPOP làm mất job; Laravel queue = list + zset + Lua, quá retry_after là chạy 2 lần; nén list đọc giữa chậm 36 lần; Array thưa tốn 47–11 558 byte/phần tử tuỳ cách rải index.

Bài 5 · Sorted Set, Geo

Sorted Set và Geo — bảng xếp hạng, job hẹn giờ, độ chính xác của score, tìm quanh đây

Bằng điểm xếp theo tên; score ghép vượt 2^53 đảo thứ hạng; scheduler đọc-rồi-chạy làm 1 000 job chạy 8 927 lần; rank 15 µs vs PostgreSQL 103 ms; Geo lệch 0,5%.

Bài 6 · Stream

Stream — log append-only, consumer group, PEL, trim, IDMP và failover

MAXLEN cắt mất 8 900 entry của group chậm mà lag vẫn báo 1 000; XNACK (8.8), CLAIM (8.4), IDMP (8.6); failover mất 20 entry đã OK và giao lại 50; consumer Laravel idempotent + DLQ.

Bài 7 · Redis 8

Kiểu mới trong Redis 8 — JSON, Bloom/Cuckoo, Count-min, Top-K, t-digest, TimeSeries, Vector set, Query Engine

Đo với đáp án thật: Bloom sai dương 0,5%, CF.DEL nhầm gây sai âm, CMS đếm dư +489% ở đuôi, t-digest ≤ 1,2%; vector Q8 recall 95% còn BIN 25%; không có trên Valkey.

Bổ sung · Stream

Thứ tự xử lý background job bằng Redis Stream — solution và trade-off

Log đúng thứ tự nhưng xử lý thì không: nhiều consumer ghi đè state; S1–S5 (1 consumer, sharding theo khoá, worker-per-key, lock, CAS theo version); producer retry làm created vào log sau paid → outbox + version nghiệp vụ (P1–P4).

Liên quan · nhóm Database

Redis — những thứ cần biết

Một luồng chạy lệnh, eviction, persistence, replication mất write, lock, Sentinel/Cluster với Laravel.

Liên quan · nhóm Database

Thiết kế tên key Redis

Format tên, số đo RAM, hash tag trong Cluster, tên key mà Laravel thật sự ghi và 5 bẫy prefix.

Liên quan · nhóm Database

Forum khoá học: post, reply, like không trùng

PRIMARY KEY giữ luật, Redis SET theo user + khoá học, Lua + Stream gom like cho bài hot.