2013-05-24 10 views
14

Tôi hiện đang tăng cường một ứng dụng web và muốn sử dụng Redis để lưu trữ phiên. Khi đăng nhập, phiên được chèn vào Redis với một id người dùng tương ứng và thiết lập hết hạn là 15 phút. Bây giờ tôi muốn thực hiện tra cứu ngược lại cho các phiên (nhận các phiên với một id người dùng nhất định). Vấn đề ở đây là, vì tôi không thể tìm kiếm không gian phím Redis, làm thế nào để thực hiện điều này. Một cách sẽ là đặt redis cho mỗi userId, chứa tất cả các id phiên. Nhưng vì Redis không cho phép hết hạn một mục trong một tập hợp và các phiên được đặt hết hạn, sẽ có một tấn id phiên không tồn tại trong các tập hợp.Redis, hết hạn phiên và tra cứu ngược

Cách tốt nhất để xóa id khỏi tập hợp vào ngày hết hạn chính là gì? Hoặc, là có một cách tốt hơn để hoàn thành những gì tôi muốn (đảo ngược tra cứu)?

Trả lời

16

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ục 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 phải triển khai thủ công hỗ trợ thông báo hết hạn. 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 khỏi người dùng khi phiên hết hạn. Vì vậy, bạn có thể duy trì một tập hợp đượ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 phải xây dựng một daemon mà sẽ thăm dò ý kiến ​​các zset để xác định phiên sắp hết hạn (ZRANGEBYSCORE). Đối với mỗi phiên đã hết hạn, nó có để duy trì cấu trúc dữ liệu:

  • pop phiên ra khỏi zset (ZREMRANGEBYRANK)
  • lấy phiên userid (HMGET)
  • xóa phiên (DEL)
  • remove phiên từ bộ userid (SREM)

Khó khăn chính là đảm bảo không có điều kiện chủng tộc khi daemon thăm dò và xử lý các mục. Xem câu trả lời của tôi cho câu hỏi này để xem cách nó có thể được triển khai:

how to handle session expire basing redis?