2013-06-12 26 views
37

Có thể trong Redis để đặt TTL (thời gian sống) không cho một khóa cụ thể, nhưng đối với một thành viên cho một bộ?TTL cho một thành viên được thiết lập

Tôi đang sử dụng cấu trúc cho các thẻ được đề xuất bởi tài liệu Redis - dữ liệu là các cặp khóa-giá trị đơn giản và các thẻ là tập hợp chứa các khóa tương ứng với từng thẻ, ví dụ:

> SETEX id:id_1 100 'Lorem ipsum' 
OK 
> SADD tag:tag_1 id:id_1 
(integer) 1 

Mấu chốt id:id_1 sẽ hết hạn như mong đợi, nhưng tôi không thấy một cách hiệu quả để loại bỏ các thành viên tương ứng từ tập tag:tag_1. Một trong những cách tôi đưa ra là sử dụng một công việc cron có chứa một kịch bản sẽ loại bỏ các khóa hết hạn từ các bộ định kỳ - bằng cách thêm tất cả các tên thẻ vào một bộ khác và sau đó lặp qua tất cả các thẻ, sau đó tất cả các id tương ứng với mỗi và kiểm tra xem khóa tương ứng có tồn tại không - nếu không, hãy gọi SREM. Tôi không nghĩ rằng nó sẽ là một cách hiệu quả và tôi có thể muốn giữ các thẻ càng sạch càng tốt, vì kích thước của các bộ sẽ có thể ảnh hưởng đến hiệu suất tìm kiếm theo nhiều thẻ (SINTER). Có cách nào "nội bộ" hơn không?

Trả lời

15

Không thể trực tiếp hết hạn các mục trong danh sách, bộ hoặc zsets.

Bạn cần triển khai cơ chế được thông báo khi mục chính hết hạn, để bạn có thể duy trì các bộ tương ứng tương ứng.

Xem câu trả lời cho câu hỏi này, tôi nghĩ rằng nó áp dụng cho trường hợp sử dụng của bạn (thay phiên bởi id, và người sử dụng bằng thẻ):

Redis, session expiration, and reverse lookup

+0

Vâng, đó là một cách khá và tôi có thể sẽ xử lý vấn đề với một cái gì đó tương tự. Vì sự tồn tại của các thành viên đã hết hạn trong bộ thẻ không phải là vấn đề theo bất kỳ cách nào khác sau đó hiệu suất, tôi rất có thể sẽ sử dụng một cron istead chạy theo định kỳ của một deamon - để hạn chế các cuộc thăm dò đến mức tối thiểu. – Przemek

20

Không, đây là không thể (và not planned either). Cách tiếp cận recommended là sử dụng tập hợp đặt hàng có điểm được đặt thành dấu thời gian và sau đó xóa thủ công các khóa đã hết hạn. Để truy vấn các khóa không hết hạn, bạn có thể sử dụng ZRANGEBYSCORE $now +inf, để xóa các khóa đã hết hạn, ZREMRANGEBYSCORE -inf $now sẽ thực hiện thủ thuật.

Trong ứng dụng của mình, tôi chỉ phát hành cả hai lệnh mỗi khi tôi truy vấn tập hợp. Tôi cũng kết hợp điều này với thời gian hết hạn (dài) trên bản thân thiết lập để cuối cùng thanh lọc các bộ không sử dụng.

This article xem chi tiết hơn.

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