2014-06-08 17 views

Trả lời

6

Thật không may, không có. Redis' container "(ví dụ: danh sách, băm, bộ và sắp xếp bộ) không hỗ trợ mỗi thành viên hết hạn, mặc dù chức năng này đã được yêu cầu nhiều lần trong quá khứ.

Bạn có thể, tuy nhiên, thực hiện logic của riêng bạn để đạt được kết quả đó. Có một số cách tiếp cận có thể có để giải quyết vấn đề này - đây là một ví dụ. Thay vì sử dụng một bộ, sử dụng một tập hợp được sắp xếp (ZSET) và thiết lập điểm số của mỗi thành viên đến thời điểm hết hạn của nó bằng cách sử dụng các giá trị epoch. Loại công việc này có thể được thực hiện bằng cách sử dụng một kịch bản Lua ví dụ. Để 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à EVAL 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 từ bộ này, bạn sẽ cần phải xóa chúng sau 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 quá trình định kỳ quét danh sách của bạn hoặc khi truy cập nó. Ví dụ, Lua sau đây có thể được sử dụng hết hạn thành viên:

redis.call('zremrangebyscore', KEYS[1], '-inf', os.time()) 

và EVAL nó sử dụng '1 a' như các đối số cho mỗi ví dụ của bạn.

EDIT: Làm thế nào để đạt được nêu trên sử dụ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') 
+0

thankyou rất nhiều vì lời giải thích của bạn, có một ví dụ về cách đạt được điều này bằng Python. – user3218088

+0

thêm một số mã Python (chưa được kiểm tra mặc dù) - hy vọng điều này sẽ làm cho nó dễ dàng hơn cho bạn để thực hiện :) –

+0

... và cảm ơn các chỉnh sửa - đã nói với bạn nó không được kiểm tra;) –

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