2012-06-08 42 views
11

Tôi hiện đang quan tâm đến việc xem kênh nào được đăng ký trong một ứng dụng phụ/quán rượu Redis mà tôi có. Khi một khách hàng kết nối với máy chủ của chúng tôi, chúng tôi đăng ký chúng vào một kênh đó trông giống như:Redis xuất bản/đăng ký: xem kênh nào hiện đang đăng ký

user:user_id

Lý do cho điều này là tôi muốn để có thể xem ai đang "online". Tôi hiện đang mù quáng gửi tin nhắn đến một kênh mà không biết liệu một khách hàng có trực tuyến hay không vì điều quan trọng là họ không nhận được các loại tin nhắn này.

Để nỗ lực làm cho ứng dụng của tôi thông minh hơn, tôi muốn có thể khám phá xem khách hàng có trực tuyến hay không sử dụng API pub/sub và nếu họ ngoại tuyến, hãy lưu trữ thư của họ vào hàng đợi redis riêng biệt mà tôi có thể thúc đẩy họ khi họ trở lại trực tuyến.

Điều này không phải chính xác 100%, nhưng chính xác hơn, càng tốt. Tôi giả sử một khóa chung không được tạo khi kênh được đăng ký, vì vậy tôi không thể làm điều gì đó tầm thường như:

redis-cli keys user* để tìm tất cả người dùng trực tuyến. Một chiến lược khác mà tôi đã nghĩ đến là chỉ duy trì Redis của riêng mình bất cứ khi nào người dùng xuất bản hoặc tự xóa mình khỏi kênh (mà khách hàng sẽ tự động xử lý khi họ trực tuyến và đóng ứng dụng). Đó sẽ là một lớp phức tạp bổ sung mà tôi cần quản lý và tôi hy vọng có một cách tiếp cận tầm thường hơn với dữ liệu đã có sẵn.

Trả lời

1

Tôi không biết bất kỳ cách cụ thể nào để truy vấn kênh nào đang được đăng ký và bạn chính xác không có bất kỳ khóa nào được tạo khi điều này xảy ra. Ngoài ra, tôi sẽ không sử dụng lệnh KEYS trong sản xuất vì nó thực sự là một lệnh gỡ lỗi.

Bạn có ý tưởng đúng về việc sử dụng bộ để thêm người dùng khi họ trực tuyến và sau đó truy vấn bằng SISMEMBER <set> <user_id> để xác định xem thư có được gửi tới họ hay không hoặc thêm vào danh sách Redis để xử lý sau khi họ thực hiện trực tuyến.

Bạn sẽ cần tìm ra khi nào người dùng đăng xuất để bạn có thể xóa họ khỏi danh sách người dùng trực tuyến, nhưng tôi không biết đủ về hệ thống của bạn để biết chính xác bạn sẽ làm như thế nào.

Nếu khách hàng được kết nối có khả năng gửi tin nhắn trở lại để thông báo cho máy chủ biết (các) thư đã được tiêu thụ, bạn có thể sử dụng thông tin này để theo dõi thư nào sẽ được lưu trữ để truy xuất sau này.

Chúc mừng, Mike

3

Hiện tại chưa có lệnh cho hiển thị những gì các kênh truyền hình "tồn tại" bằng cách được đăng ký, nhưng có và "chấp nhận" vấn đề và yêu cầu kéo mà thực hiện này.

https://github.com/antirez/redis/issues/221
https://github.com/antirez/redis/pull/412

Do tính chất của cuộc gọi này, nó không phải là cái gì đó có thể mở rộng, và do đó là một "DEBUG" lệnh.

Tuy nhiên, có một vài cách khác để giải quyết vấn đề của bạn. Nếu bạn có lý do để tin rằng kênh có thể được đăng ký, bạn có thể gửi một tin nhắn và xem kết quả. Kết quả là số lượng người đăng ký nhận được tin nhắn. Nếu bạn có 0, bạn biết rằng họ không có ở đó.

Giả sử rằng user_ids của bạn đang tăng dần, bạn có thể quan tâm đến việc sử dụng SETBIT để đặt 1 hoặc 0 cho bit bù đắp của người dùng để theo dõi sự hiện diện. Sau đó, bạn có thể làm những việc thú vị như mới BITCOUNT để xem số người dùng đang trực tuyến và GETBIT để xác định xem một người dùng cụ thể có trực tuyến không.

Cách tôi đã giải quyết vấn đề của bạn cụ thể hơn trong quá khứ là bằng cách báo hiệu người quản lý đăng ký mà tôi đã đăng ký kênh. Người quản lý sau đó "ping" kênh bằng cách gửi một thông báo trống để xác nhận rằng có một người đăng ký, và đôi khi ping kênh sau đó để xác định xem người dùng có còn trực tuyến hay không. Không lý tưởng, nhưng tốt hơn sử dụng DEBUG CHANNELS trong sản xuất.

+0

Đề xuất tuyệt vời! Tôi đã có nhu cầu tương tự ngay bây giờ và quản lý để viết xung quanh nó bằng cách xuất bản 'null' cho kênh để có được số lượng thuê bao. Sau đó, trong người nghe tôi kiểm tra xem tin nhắn là Không có và bỏ qua nó nếu nó được. Cổ vũ người bạn đời! –

1

Từ phiên bản 2.8.0 redis có một lệnh pubsub mà có thể giúp trong trường hợp này:

http://redis.io/commands/pubsub

Ghi chú: hiện trạng thái của 2.8.0 không ổn định chưa (RC2)

4

Kể từ Redis 2.8 bạn có thể làm:

PUBSUB CHANNELS [pattern] 

PUBSUB CHANNELS command có độ phức tạp O (N), trong đó N là số kênh đang hoạt động.

Vì vậy, trong trường hợp của bạn:

redis-cli PUBSUB CHANNELS user* 

sẽ cung cấp cho bạn muốn, bạn muốn.

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