2016-03-23 23 views
9

Redis thực hiện hết hạn khóa như thế nào? Từ here Tôi đã học được rằng Redis lưu trữ thời gian mà tại đó khóa sẽ hết hạn, nhưng chính xác như thế nào được thực hiện?Redis hết hạn khóa như thế nào?

+0

tiêu đề và câu hỏi không phù hợp. bạn hỏi gì? Redis hết hạn khóa như thế nào? hoặc liệu có thể hết hạn các mục trong danh sách không? –

+0

@Not_a_Golfer Tôi đã thay đổi tiêu đề, xin lỗi vì sự nhầm lẫn. –

Trả lời

24

Tóm lại - đối với mỗi đối tượng redis, có thời gian hết hạn. Trừ khi bạn đặt đối tượng hết hạn, thời gian đó là "không bao giờ".

Bây giờ, bản thân cơ chế hết hạn là bán lười. Sự hết hạn lười biếng có nghĩa là bạn không thực sự hết hạn các đối tượng cho đến khi chúng được đọc. Trong trường hợp này đọc một đối tượng, chúng ta kiểm tra dấu thời gian hết hạn của nó, và nếu nó trong quá khứ, chúng ta không trả về gì cả, và xóa đối tượng trong khi chúng ta đang ở đó. Nhưng vấn đề là nếu một chìa khóa không bao giờ chạm vào, nó chỉ chiếm bộ nhớ mà không có lý do gì.

Vì vậy, Redis thêm lớp thứ hai của hoạt động hết hạn ngẫu nhiên. Nó chỉ đọc các phím ngẫu nhiên tất cả các thời gian, và khi một khóa hết hạn được chạm vào nó sẽ bị xóa dựa trên cơ chế lười biếng. Điều này không ảnh hưởng đến hành vi hết hạn, nó chỉ thêm "bộ sưu tập rác" của các khóa đã hết hạn.

Tất nhiên việc triển khai thực tế phức tạp hơn điều này, nhưng đây là ý tưởng chính.

Bạn có thể đọc thêm về nó ở đây: http://redis.io/commands/expire

Và mã nguồn cho các chu kỳ hết hạn hoạt động có thể được tìm thấy ở đây: https://github.com/antirez/redis/blob/unstable/src/server.c#L781

Các vấn đề liên quan