Nếu bạn sử dụng các key hết hạn (còn gọi là "volatile") trong Redis, bạn có thể ngạc nhiên khi gắn một Redis replica mới vào database của bạn: số lượng key trên replica của bạn có thể thấp đáng kể so với số lượng key trên primary DB. Điều này đặc biệt phổ biến nếu bạn có một số lượng lớn volatile key.
Redis replica của bạn có thiếu key không? Bạn vừa mất dữ liệu? Câu trả lời ngắn gọn là, "không". Tuy nhiên, việc hiểu tại sao, chính xác, Redis replica của bạn báo cáo số lượng key thấp hơn dù bạn không mất dữ liệu là hữu ích. Điều này liên quan đến hai chi tiết triển khai: cách Redis hết hạn key và cách Redis gửi dataset của bạn đến replica mới.
Redis Hết Hạn Volatile Key Như Thế Nào?
Trong Redis, volatile key không bị xóa khỏi bộ nhớ chính xác tại thời điểm chúng được đặt để hết hạn. Thay vào đó, chúng bị xóa qua một trong hai phương pháp:
-
Khi một Redis client thực hiện thao tác đọc hoặc ghi trên một key, Redis server sẽ trước tiên kiểm tra xem key đó có tồn tại và có thời gian hết hạn không. Nếu nó tồn tại và có thời gian hết hạn trong quá khứ, Redis sẽ ngay lập tức xóa key đó khỏi bộ nhớ trước khi xử lý lệnh.
-
Để ngăn volatile key tồn tại trong bộ nhớ mãi mãi nếu chúng không được truy cập, Redis sử dụng một thuật toán thụ động (passive) đơn giản để hết hạn key: Mỗi 10 mili giây, nó lấy 100 volatile key ngẫu nhiên và ngay lập tức xóa bất kỳ key nào đã quá thời gian hết hạn. Nếu 25 hoặc nhiều key bị xóa, Redis ngay lập tức lấy 100 key khác và bắt đầu lại.
-
Trong thực tế, con số này thường thấp hơn nhiều do Redis liên tục tìm key để xóa. ↩
Phương pháp thứ hai ở trên quan trọng vì nó có nghĩa là một số lượng đáng kể key có thể là volatile key đã "hết hạn" nhưng chưa bị xóa khỏi bộ nhớ1. Redis sẽ tiếp tục bao gồm các key này trong các đếm "keys" và "expires" trong đầu ra INFO của bạn cho đến khi chúng bị xóa.
Redis Gửi Dataset Đến Replica Mới Như Thế Nào?
Khi một Redis replica gắn vào một Redis server, primary server tạo một RDB snapshot của dataset của nó và gửi nó đến replica. Và khi Redis tạo RDB snapshot, nó không bao gồm bất kỳ key nào có ngày hết hạn trong quá khứ, ngay cả khi chúng chưa bị xóa khỏi bộ nhớ.
Tại Sao Replica Của Tôi Có Số Lượng Key Thấp Hơn Primary?
Khi bạn gắn một replica vào một Redis instance, replica đó nhận được một dataset không bao gồm các volatile key đã hết hạn (nhưng vẫn còn tồn tại) từ primary database. Đây là cùng lý do số lượng key của bạn có thể giảm khi khôi phục Redis server từ một RDB backup.
Cảm ơn đặc biệt @mattsta đã giúp tìm ra hành vi RDB.