Bạn đúng, bạn không thể "đặt thời hạn" cho chính giá trị đã được sắp xếp.
Nhưng bạn có thể làm việc với khóa chính và nắm bắt sự kiện khi hết hạn xảy ra. Bạn có ít nhất 2 cách để đạt được điều này:
- Sử dụng Thông báo Không gian Chính
- Sử dụng Redis Gears
Thông báo không gian chính
Sử dụng Thông báo không gian chính, bạn có thể nắm bắt sự kiện EXPIRE sẽ gửi thông báo XUẤT BẢN mà sau đó bạn có thể sử dụng.
Hãy để tôi giải thích quy trình cơ bản:
Định cấu hình thông báo
CONFIG SET notify-keyspace-events Ex
- Đ :sự kiện xảy ra trên các phím
- x :nắm bắt các sự kiện đã hết hạn
Bây giờ cơ sở dữ liệu của bạn sẽ xuất bản một sự kiện trên __key*__:*
kênh.
Vì vậy, bạn có thể xây dựng một dịch vụ lắng nghe các sự kiện này cập nhật tập hợp (trực tiếp hoặc gián tiếp):
psubscribe __key*__:*
Nếu bạn có một ứng dụng đặt giá trị và thời hạn sau đây
set foo bar EX 5
Bạn sẽ nhận được thông báo sau
1) "pmessage"
2) "__key*__:*"
3) "[email protected]__:expired"
4) "foo"
Redis Gears
Sử dụng Redis Gears, bạn nắm bắt được cùng một sự kiện (nó cũng dựa trên thông báo), nhưng việc viết mã trực tiếp trong Cơ sở dữ liệu Redis của bạn sẽ dễ dàng hơn.
Bạn có thể tạo Gears như sau:(đây là một tập lệnh Python, tôi đang sử dụng RedisInsight để triển khai nó cho Redis)
def process(x):
execute('LPUSH', 'expired:keys', x['value']['key']);
# Capture an expiration event and adds it to 'expired:events' stream
cap = GB('KeysReader')
cap.foreach(lambda x:
execute('XADD', 'expired:events', '*', 'key', x['key']))
cap.register(prefix='*',
mode='sync',
eventTypes=['expired'],
readValue=False)
# Consume new messages from expiration streams and process them somehow
proc = GB('StreamReader')
proc.foreach(process)
proc.register(prefix='expired:*',
batch=100,
duration=1,
trimStream = False)
Xem phần bắt đầu bởi cap = GB('KeysReader')
- Thao tác này sẽ lắng nghe mọi khóa hết hạn
prefix='*'
&eventTypes=['expired']
- Trong trường hợp hết hạn, nó sẽ thêm một thông báo vào
'expired:events'
Redis Stream bằng lệnh XADD - Sau đó, hãy xem hàm
proc = GB('StreamReader')
điều đó sẽ xử lý các luồng - mỗi khi có tin nhắn mới trong luồng, nó sẽ gọi
process()
chức năng.
Bạn có thể thêm logic của mình để cập nhật tập hợp đã sắp xếp trong hàm này. Trong ví dụ của tôi, tôi vừa thêm khóa đã hết hạn vào danh sách.
Hãy để tôi phân tích một chút so với câu hỏi ban đầu của bạn.
Có vẻ như bạn đang sử dụng Tập hợp đã sắp xếp để tạo một số hình thức lập chỉ mục cho dữ liệu của mình.
Nếu đúng như vậy, bạn nên xem RediSearch, một mô-đun Redis khác cho phép bạn lập chỉ mục Hash và sau đó sử dụng chỉ mục để thực hiện một số truy vấn nâng cao và tổng hợp.
Với RediSearch, bạn không cần thêm bất kỳ mã nào để quản lý chỉ mục, nó được thực hiện tự động bởi cơ sở dữ liệu và bạn có thể truy vấn trên các trường.
Tôi mời bạn xem:
- Mô-đun RediSearch
- Tìm kiếm Redi bắt đầu
Xin lỗi nếu đây không phải là lý do bạn sử dụng Sorted Set, nhưng tôi nghĩ bạn nên kiểm tra vì như vậy có thể đơn giản hóa rất nhiều mã ứng dụng của bạn nếu bạn quản lý chỉ mục theo cách thủ công ngay hôm nay.