Computer >> Máy Tính >  >> Lập trình >> Redis

Thiếu các phím trên Redis Replicas

Nếu bạn sử dụng các khóa hết hạn (còn được gọi là "dễ bay hơi") trong Redis, bạn có thể ngạc nhiên khi đính kèm một bản sao Redis mới vào cơ sở dữ liệu của mình:số lượng khóa trên bản sao của bạn có thể thấp hơn đáng kể so với số lượng khóa trên DB chính của bạn . Điều này đặc biệt phổ biến nếu bạn có một số lượng lớn các khóa biến động.

Bản sao Redis của bạn có bị thiếu chìa khóa không? Bạn vừa bị mất dữ liệu? Câu trả lời ngắn gọn là không". Tuy nhiên, sẽ rất hữu ích nếu bạn hiểu chính xác lý do tại sao bản sao Redis của bạn đang báo cáo số lượng khóa thấp hơn mặc dù bạn không mất bất kỳ dữ liệu nào. Chi tiết triển khai không có hai này:cách Redis hết hạn khóa và cách Redis gửi tập dữ liệu của bạn tới các bản sao mới.

Làm cách nào để Redis hết hạn các khóa dễ bay hơi?

Trong Redis, các khóa biến động không bị xóa khỏi bộ nhớ vào thời điểm chính xác mà chúng được đặt hết hạn. Thay vào đó, chúng sẽ bị xóa thông qua một trong hai phương pháp:

  1. Khi một ứng dụng khách Redis thực hiện thao tác đọc hoặc ghi trên một khóa, Redisserver trước tiên sẽ kiểm tra xem khóa đó có tồn tại hay không và có thời gian hết hạn hay không. trước khi xử lý lệnh.

  2. Để ngăn chặn các khóa dễ bay hơi lưu lại mãi mãi trong bộ nhớ nếu chúng không được truy cập, Redis sử dụng một thuật toán thụ động đơn giản để làm hết hạn các khóa:Cứ sau 10 mili giây, nó lấy 100 khóa biến động ngẫu nhiên và xóa ngay lập tức bất kỳ khóa nào đã quá thời gian hết hạn. Nếu 25 phím trở lên bị xóa, Hãy lấy lại ngay lập tức 100 phím khác và bắt đầu lại.

Phương pháp thứ hai ở trên rất quan trọng vì nó có nghĩa là một số lượng khóa đáng kể có thể là các khóa dễ bay hơi đã "hết hạn" nhưng vẫn chưa được đưa vào bộ nhớ 1 . Redis sẽ tiếp tục đưa các khóa này vào số lượng "khóa" và "hết hạn" trong INFO của bạn xuất cho đến khi chúng được khai thác.

Redis gửi tập dữ liệu đến các bản sao mới như thế nào?

Khi một bản sao Redis tự gắn vào máy chủ Redis, máy chủ chính sẽ tạo ảnh chụp nhanh RDB của tập dữ liệu của nó và gửi nó đến bản sao. Và khi Redis tạo ảnh chụp nhanh RDB, nó không bao gồm bất kỳ khóa nào có ngày hết hạn trong quá khứ , ngay cả khi chúng chưa được xóa khỏi bộ nhớ.

Vậy tại sao số lượng khóa của bản sao của tôi lại thấp hơn của máy chủ chính?

Khi bạn đính kèm một bản sao vào một bản sao Redis, bản sao đó đang nhận được adataset không bao gồm các khóa biến động đã hết hạn (nhưng vẫn còn tồn tại) từ cơ sở dữ liệu chính. Đây là lý do chung khiến số lượng khóa của bạn có thể giảm khi khôi phục máy chủ Redis từ bản sao lưu RDB.

Xin gửi lời cảm ơn đặc biệt tới @mattsta vì đã trợ giúp theo dõi hành vi RDB.

  1. Trên thực tế, con số này thường thấp hơn nhiều do Redis liên tục tìm kiếm các phím để xóa. ↩