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.

Vì sao hai chủ đề này đi cùng nhau Cả hai đều là quyết định Redis tự đưa ra mà không nói cho ai biết. Thêm một trường thứ 513 vào hash làm khoá đó chiếm gấp 4,65 lần bộ nhớ; 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.

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.

Một cái bẫy trong chính bộ đo Lần đầu dựng ma trận encoding, giá trị sinh ra chỉ khác nhau ở chữ số cuối, nên 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.