Khoá học ngắn về Redis
Redis: encoding và khoá hết hạn
Hai chỗ trong Redis mà hành vi thật khác với mô hình trong đầu người dùng: cấu trúc mà Redis
thực sự dùng để lưu một khoá, và thời điểm một khoá đã hết hạn biến mất khỏi bộ nhớ. Khoá này
đo cả hai trên Redis 7.4.11 trong container redis:7-alpine, bằng
OBJECT ENCODING, MEMORY USAGE, DBSIZE và
INFO stats.
DBSIZE có thể trả về 301 khi chỉ còn
một khoá đọc được. Hai con số đó đều đo được, và đều làm người vận hành hiểu sai hệ thống nếu
không biết luật.
Lộ trình
Mỗi bài khoảng 12–18 phút đọc, kèm phòng thí nghiệm chạy ngay trên trình duyệt.
Redis chọn cấu trúc trong bộ nhớ thế nào
Năm kiểu dữ liệu, tám ngưỡng cấu hình, 112 tổ hợp đã đo. Kèm lab tự đặt số phần tử, độ dài giá trị và từng ngưỡng.
Bài 2Ai xoá một khoá đã hết hạn
Xoá lười và vòng quét chủ động. KEYS lọc mà không xoá, SCAN thì xoá — chín lệnh đo riêng từng lệnh trên cùng một trạng thái.
Cách đo
Mỗi bài dựng một container redis:7-alpine riêng, không dùng chung với bất kỳ Redis
nào đang chạy sẵn. Bài 2 cần tắt vòng quét chủ động để tách hai cơ chế, mà
DEBUG bị khoá theo mặc định từ Redis 7, nên container phải khởi động với
--enable-debug-command local.
docker run -d --name rdlab -p 8088:6379 redis:7-alpine \
redis-server --enable-debug-command local
docker exec rdlab redis-cli OBJECT ENCODING h513
# hashtable
docker exec rdlab redis-cli DEBUG SET-ACTIVE-EXPIRE 0
# OK
Script đo được ghi ra file rồi docker cp vào container và chạy bằng
docker exec, chứ không đưa qua stdin — cách đó giữ được nguyên bản script để chạy
lại và đối chiếu. Hai thuật toán JavaScript trong khoá được đối chiếu với 119 phép đo của bài 1
và 25 phép đo của bài 2.
set và zset gộp trùng và số phần tử thật chỉ còn 10 thay vì 129.
Bảng kết quả trông hợp lý nhưng sai hẳn. Bộ đo hiện tại in kèm
SCARD/ZCARD và kiểm rằng nó đúng bằng số phần tử yêu cầu —
112 hàng đều khớp.