Computer >> Máy Tính >  >> Lập trình >> Redis

Redis Pub / Sub:Hướng dẫn Cách làm

Bài viết tổng quan của chúng tôi về Redis pub / sub thảo luận về mục đích của pub / sub và mô tả cụ thể các lựa chọn thiết kế của Redis pub / sub. Bây giờ chúng ta sẽ chuyển sang cách sử dụng Redis pub / sub bằng cách xem qua từng khái niệm chính của Redis pub / sub:các kênh, xuất bản, đăng ký và đối sánh tài liệu, bằng cách sử dụng ứng dụng khách gật đầu node.js.

Hiểu kênh

Một kênh là một tên được sử dụng để phân loại các thông báo được xuất bản trên pub / hệ thống con. Các kênh có thể có tên phụ thuộc vào hệ thống, như system-health:i-36a44b83 , trade-prices:RAX , temp-reading:living-room hoặc một cái gì đó rất chung chung, như events . Bất kỳ người đăng ký nào quan tâm đến dữ liệu xuất hiện trên kênh đều có thể công bố dữ liệu đó và các nhà xuất bản và người đăng ký mới dễ dàng được thêm vào khi hệ thống phát triển.

Để biết kênh nào đang hoạt động trên máy chủ Redis, bạn có thể sử dụng PUBSUB CHANNELS lệnh này không trả về gì khi hệ thống chưa được sử dụng cho pub / sub:

Các kênh
$ redis-cli pubsub channels
(empty list or set)

Các kênh chỉ tồn tại trên hệ thống khi người đăng ký đang nghe tin nhắn, vì vậy không cần phải “tạo” hoặc “xóa” kênh - chúng chỉ tồn tại khi người đăng ký đang nghe. Để xem điều này, chúng ta có thể sử dụng redis-cli để hoạt động như người đăng ký trong một cửa sổ bảng điều khiển và chạy PUBSUB CHANNELS một lần nữa trong một cửa sổ khác:

Bảng điều khiển 1:

$ redis-cli subscribe events
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "events"
3) (integer) 1

Bảng điều khiển 2:

$ redis-cli pubsub channels
1) "events"

Ngay sau khi Bảng điều khiển 1 ngắt kết nối, hệ thống sẽ lại không có kênh.

Đang xuất bản thông báo

Cú pháp lệnh

PUBLISH lệnh được sử dụng để xuất bản tin nhắn.

PUBLISH channel message

Tất cả các thuê bao đang nghe trên kênh sẽ được gửi tin nhắn. Nếu không có người đăng ký nào xung quanh nhận được tin nhắn, tin nhắn sẽ bị loại bỏ.

Ví dụ về Node.js

Sau khi tạo kết nối thông thường với Redis, xuất bản có thể được sử dụng giống như bất kỳ lệnh nào khác:

var client = require("redis").createClient();
client.publish("temp-reading:living-room", "37.0");

Sử dụng với các lệnh Redis khác

Xuất bản dữ liệu lên kênh là một thao tác nhanh, vì vậy nó thường được sử dụng song song với các thao tác khác. Việc kết hợp các hoạt động như thế này sẽ mở ra sức mạnh của Redis:

var client = require("redis").createClient();

client.multi()
  .publish("temp-reading:living-room", "37.0")
  .lpush("recent-temperatures", "37.0")
  .ltrim("recent-temperatures", 0, 99)
  .exec();

Đây là thao tác tương tự như ví dụ trước đó cho hệ thống pub / sub, nhưng trong cùng một MULTI/EXEC giao dịch nhiệt độ được đưa vào danh sách giữ 100 nhiệt độ gần đây nhất.

Ví dụ ngắn này cho thấy một cách để tích hợp Redis pub / sub vào một thiết kế hệ thống lớn hơn bao gồm lịch sử tin nhắn. Một thao tác như thao tác ở trên cho phép các khách hàng khác truy vấn các giá trị gần đây cũng như đăng ký các giá trị mới.

Đăng ký nhận tin nhắn

Cú pháp lệnh

SUBSCRIBE lệnh được sử dụng để đăng ký kênh. Lệnh này đặt phòng khám ở trạng thái “đã đăng ký” đặc biệt, nơi nó không còn gửi các lệnh khác ngoài SUBSCRIBE bổ sung hoặc UNSUBSCRIBE lệnh.

SUBSCRIBE channel [channel ...]

Ví dụ về Node.js

Người đăng ký này có thể được sử dụng với ví dụ về nhà xuất bản trước đó:

var subscriber = require("redis").createClient();

subscriber.on("message", function(channel, message) {
  console.log("A temperature of " + message + " was read.");
});

subscriber.subscribe("temp-reading:living-room");

Điều này sử dụng một trình phát sự kiện đơn giản gọi một hàm mỗi khi một thông báo gửi đến. Chức năng xử lý chỉ ghi nhiệt độ vào bảng điều khiển ngay bây giờ - nó có thể làm bất cứ điều gì.

Sử dụng các lệnh khác với người đăng ký

Như đã đề cập trước đó, các máy khách đã đăng ký đang ở một chế độ đặc biệt và không thể được sử dụng cho các lệnh khác. Để sử dụng các lệnh khác, bạn sẽ tạo một kết nối máy khách riêng với Redis:

var redis = require("redis")
  , subscriber = redis.createClient()
  , client = redis.createClient();

subscriber.on("message", function(channel, message) {
  console.log("A temperature of " + message + " was read.");
  client.incr("temp-count");
});

subscriber.subscribe("temp-reading:living-room");

Trình xử lý này ghi lại thông báo vào bảng điều khiển và tăng bộ đếm Redis. Trong một số trường hợp, bạn có thể tính toán một kết quả và sau đó xuất bản kết quả đó lên một kênh riêng để những người đăng ký khác đọc - chỉ cần không xuất bản nó trở lại chính kênh bạn đang nghe, vì bạn sẽ gây ra một vòng lặp vô hạn:)

Đối sánh mẫu

Cú pháp lệnh

PSUBSCRIBE lệnh được sử dụng để khớp các mẫu kênh.

PSUBSCRIBE pattern [pattern ...]

Điều này hoạt động giống như một SUBSCRIBE bình thường nhưng cho phép bạn khớp các kênh với tên phù hợp với một mẫu. Điều này cho phép các nhà xuất bản biết rất cụ thể về thông tin họ đang xuất bản và cho phép người đăng ký nghe nhiều kênh khác nhau mà không cần biết tên chính xác của họ.

Các mẫu được hỗ trợ rất đơn giản:* khớp với bất kỳ ký tự nào, ? khớp với một ký tự đơn và dấu ngoặc vuông có thể được sử dụng để khớp với một tập hợp các ký tự được chấp nhận, như [acd] .

Khớp các kết quả đo nhiệt độ từ một số phòng:

PSUBSCRIBE temp-reading:*

Khớp các sự kiện từ các thử nghiệm A / B như site-link:logo:a:clickratesite-link:logo:b:clickrate :

PSUBSCRIBE site-link:logo:?:clickrate

Khớp các sự kiện trên một loạt các phiên bản AWS, cho các sự kiện đã xuất bản như system-health:us-east-1a:i-36a44b83system-health:us-east-1c:i-73657420636f636f6 :

PSUBSCRIBE system-health:us-east-1[acd]:i-*

Ví dụ về Node.js

Trong ví dụ này, cũng có thể được sử dụng với ví dụ xuất bản trước đó, nhiệt độ được ghi cùng với căn phòng nơi đọc nhiệt độ.

var subscriber = require("redis").createClient();

subscriber.on("pmessage", function(pattern, channel, message) {
  var room = channel.split(":")[1];
  console.log("A temperature of " + message + " was read in " + room);
});

subscriber.psubscribe("temp-reading:*");

Người đăng ký dựa trên mẫu sẽ nhận được thêm một số chi tiết trong cuộc gọi lại của mình:không chỉ kênh và tin nhắn, mà còn cả mẫu cụ thể đã khớp - người đăng ký theo tỉnh có thể nghe trên nhiều kênh hoặc mẫu.

Ghi chú Bên cạnh:Đặc điểm Hiệu suất của PUBLISH

Mọi lệnh trong Redis đều có độ phức tạp về thời gian được ghi lại và hầu hết các độ phức tạp về thời gian này là trực quan. Kể từ khi PUBLISH hoạt động cảm thấy rất đơn giản (gần giống như SET ) người ta có thể cho rằng độ phức tạp của nó là O (1). Trên thực tế, độ phức tạp về thời gian của PUBLISH phát triển tuyến tính theo hành vi của người đăng ký.

Khi PUBLISH lệnh chạy nó phải bước qua tất cả các mẫu được đăng ký có thể khớp với kênh tất cả những người đăng ký sẽ nhận được tin nhắn, dẫn đến độ phức tạp về thời gian là O (N + M).

Hầu hết các triển khai sẽ không bao giờ gặp bất kỳ sự cố hiệu suất nào với tính phổ biến của PUBLISH , nhưng việc theo dõi hiệu suất của lệnh đó theo thời gian vẫn là điều khôn ngoan - hãy cẩn thận nếu mã của bạn tự động tạo ra các mẫu kênh để lắng nghe.

Mã của bạn ở đây?

Chúng tôi muốn giới thiệu một số ví dụ tuyệt vời về các ứng dụng được xây dựng bằng Redis pub / sub. Nếu bạn biết một số ví dụ điển hình, hãy gửi ghi chú cho chúng tôi theo địa chỉ tạ[email protected] - chúng tôi sẽ cố gắng hết sức để giới thiệu một số mã mà chúng tôi thấy.