Tôi muốn nói rằng nó được liên kết với sự hết hạn của khóa.
Các cửa hàng khóa / giá trị như Redis hoặc memcached không đủ khả năng xác định bộ đếm thời gian vật lý cho mỗi đối tượng hết hạn. Sẽ có quá nhiều trong số họ. Thay vào đó, họ xác định cấu trúc dữ liệu để dễ dàng theo dõi các mục sắp hết hạn và ghép tất cả các sự kiện hết hạn vào một bộ đếm thời gian vật lý. Họ cũng có xu hướng thực hiện chiến lược lười biếng để đối phó với những sự kiện này.
Với Redis, khi một vật phẩm hết hạn, sẽ không có gì xảy ra. Tuy nhiên, trước khi truy cập mỗi mặt hàng, việc kiểm tra được thực hiện một cách có hệ thống để tránh trả lại các mặt hàng đã hết hạn sử dụng và có khả năng xóa mặt hàng đó. Trên hết của chiến lược lười biếng này, cứ sau 100 mili giây, một thuật toán bộ quét được kích hoạt để làm hết hạn thực tế một số mục (tức là xóa chúng khỏi từ điển chính). Số lượng khóa được xem xét ở mỗi lần lặp phụ thuộc vào khối lượng công việc hết hạn (thuật toán có thể thích ứng).
Hậu quả là Redis có thể tồn đọng các mặt hàng sẽ hết hạn tại một thời điểm nhất định, khi bạn có một dòng sự kiện hết hạn ổn định.
Bây giờ quay lại câu hỏi, lệnh DBSIZE chỉ trả về kích thước của từ điển chính, vì vậy nó bao gồm các mục đã hết hạn chưa được xóa. Lệnh KEYS duyệt qua toàn bộ từ điển, truy cập các khóa riêng lẻ, do đó, nó loại trừ tất cả các mục đã hết hạn. Do đó, số lượng mục có thể không khớp.