Tính năng mà Eli đã liên kết cho phép bạn nghe khi khóa hết hạn. Tuy nhiên, nó không cung cấp cho bạn giá trị của chìa khóa. Futhermore, dựa trên vấn đề github đã nộp, có vẻ như bạn không thể mong đợi tính năng này được tích hợp sớm bất cứ lúc nào nếu có (https://github.com/antirez/redis/issues/1876). Giải pháp tôi sử dụng là tạo một khóa hết hạn "bóng tối" đặc biệt được liên kết với khóa mà bạn có giá trị thực tế.
Vì vậy, giả sử bạn có một khóa được gọi là testkey
và nó có giá trị nguyên là 100
. Hơn nữa, khóa sẽ hết hạn sau 10 giây tại thời điểm đó bạn muốn lấy giá trị của khóa. (Có thể bạn đã tăng chìa khóa trong 10 giây mà nó tồn tại).
Trước tiên, bạn cần thiết lập lắng nghe cho các sự kiện keyspace. Đặc biệt, bạn muốn nghe expired
sự kiện. Bạn có thể thực hiện việc này từ cấu hình của mình hoặc sử dụng config set
lệnh trong redis. (xem tại đây để biết thêm thông tin:http://redis.io/topics/notifications)
CONFIG SET notify-keyspace-events Ex
Giờ đây, bạn có thể đăng ký một keyevent
đặc biệt kênh nơi bạn sẽ được thông báo rằng khóa đã hết hạn.
SUBSCRIBE [email protected]__:expired
Định dạng kênh để đăng ký là [email protected]<db>__:<eventName>
. Trong ví dụ của chúng tôi, chúng tôi giả sử chúng tôi đang làm việc với cơ sở dữ liệu mặc định 0 và chúng tôi muốn lắng nghe expired
sự kiện.
Khi testkey
hết hạn, bây giờ bạn sẽ nhận được một thông báo trong __keyevent__
kênh trong đó thông báo là tên của khóa đã hết hạn. Tất nhiên lúc này key đã biến mất nên chúng ta không thể truy cập giá trị được nữa! Giải pháp là sử dụng một khóa hết hạn đặc biệt.
Khi bạn tạo testkey
cũng tạo một khóa "bóng tối" hết hạn đặc biệt (không hết hạn cho testkey
thực tế ). Ví dụ:
SET testkey 100
SET shadowkey:testkey "" EX 10
Bây giờ trong [email protected]__:expired
kênh, bạn sẽ nhận được một thông báo cho bạn biết rằng khóa shadowkey:testkey
hết hạn. Lấy giá trị của thông báo (là tên của khóa), tách trên dấu hai chấm (hoặc bất kỳ dấu phân tách nào bạn quyết định sử dụng), sau đó lấy giá trị của khóa và xóa theo cách thủ công.
// set your key value
SET testkey 100
//set your "shadow" key, note the value here is irrelevant
SET shadowkey:testkey "" EX 10
// Get an expiration message in the channel [email protected]__:expired
// Split the key on ":", take the second part to get your original key
// Then get the value and do whatever with it
GET testkey
// Then delete the key
DEL testkey
Lưu ý rằng giá trị của khóa bóng không được sử dụng, vì vậy bạn muốn sử dụng giá trị nhỏ nhất có thể mà theo câu trả lời này (khóa cửa hàng Redis không có giá trị) là một chuỗi trống ""
. Sẽ tốn thêm một chút công việc để thiết lập nhưng hệ thống trên thực hiện chính xác những gì bạn cần. Chi phí chung là một vài lệnh bổ sung để thực sự truy xuất và xóa khóa của bạn cộng với chi phí lưu trữ của một khóa trống.