Tiếc là không có. "Vùng chứa" của Redis (tức là danh sách, băm, tập hợp và tập hợp được sắp xếp) không hỗ trợ hết hạn cho mỗi thành viên, mặc dù chức năng này đã được yêu cầu nhiều lần trước đây.
Tuy nhiên, bạn có thể thực hiện logic của riêng mình để đạt được kết quả đó. Có một số cách tiếp cận khả thi để giải quyết vấn đề này - đây là một ví dụ. Thay vì sử dụng một tập hợp, hãy sử dụng một tập hợp được sắp xếp (ZSET) và đặt điểm số của mỗi thành viên theo thời gian hết hạn sử dụng các giá trị kỷ nguyên. Ví dụ:loại quy trình công việc này có thể được triển khai bằng cách sử dụng tập lệnh Lua. Để thêm thành viên, hãy sử dụng một cái gì đó như:
redis.call('zadd', KEYS[1], os.time()+ARGV[1], ARGV[2])
và ĐÁNH GIÁ nó bằng cách sử dụng '1 a 60 1' và '1 a 120 2' làm đối số, theo ví dụ của bạn. Để thực sự "hết hạn" các mục khỏi tập hợp, bạn cần phải xóa chúng khi thời gian của chúng đã trôi qua. Bạn có thể làm điều đó bằng cách thực hiện một quy trình định kỳ quét danh sách của bạn hoặc khi truy cập nó. Ví dụ:Lua sau có thể được sử dụng để hết hạn thành viên:
redis.call('zremrangebyscore', KEYS[1], '-inf', os.time())
và ĐÁNH GIÁ nó bằng cách sử dụng '1 a' làm đối số theo ví dụ của bạn.
CHỈNH SỬA:Cách đạt được những điều trên bằng Python
import time
import redis
def add(r, key, ttl, member):
r.zadd(key, member, int(time.time()+ttl))
def expire(r, key):
r.zremrangebyscore(key, '-inf', int(time.time()))
...
r = redis.Redis()
add(r, 'a', 1, 60)
add(r, 'a', 2, 120)
# periodically or before every operation do
expire(r, 'a')