Trên nhánh phát hành hiện tại của Redis (2.6) , bạn không thể có thông báo khi các mặt hàng hết hạn. Nó có thể sẽ thay đổi với các phiên bản tiếp theo.
Trong thời gian chờ đợi, để hỗ trợ yêu cầu của bạn, bạn cần triển khai hỗ trợ thông báo hết hạn theo cách thủ công. Vì vậy, bạn có:
session:<sessionid> -> a hash storing your session data - one of the field is <userid>
user:<userid> -> a set of <sessionid>
Bạn cần xóa sessionid
từ người dùng đặt khi phiên hết hạn. Vì vậy, bạn có thể duy trì một nhóm được sắp xếp bổ sung có điểm là dấu thời gian.
Khi bạn tạo phiên 10 cho người dùng 100:
MULTI
HMSET session:10 userid:100 ... other session data ...
SADD user:100 10
ZADD to_be_expired <current timestamp + session timeout> 10
EXEC
Sau đó, bạn cần xây dựng một daemon sẽ thăm dò zset để xác định phiên sẽ hết hạn (ZRANGEBYSCORE
). Đối với mỗi phiên hết hạn, nó phải duy trì cấu trúc dữ liệu:
- bật phiên ra khỏi zset (
ZREMRANGEBYRANK
) - truy xuất userid phiên (
HMGET
) - xóa phiên (
DEL
) - loại bỏ phiên khỏi bộ userid (
SREM
)
Khó khăn chính là đảm bảo không có điều kiện chạy đua khi daemon thăm dò và xử lý các vật phẩm. Xem câu trả lời của tôi cho câu hỏi này để biết cách nó có thể được triển khai:
làm thế nào để xử lý phiên hết hạn dựa trên redis?