Redis-stream nodejs

Redis là một kho lưu trữ cấu trúc dữ liệu trong bộ nhớ, chủ yếu được sử dụng làm cơ sở dữ liệu, bộ đệm và môi giới tin nhắn. Redis cực kỳ phổ biến đối với các nhà phát triển vì tốc độ đáng kinh ngạc và hỗ trợ các loại cấu trúc dữ liệu khác nhau như chuỗi, hàm băm, danh sách, bộ, bitmap, luồng, v.v.

Hơn nữa, Nó có rất nhiều tính năng tích hợp như bản sao tích hợp, tập lệnh Lua, loại bỏ LRU, giao dịch, tính bền vững trên đĩa, v.v., khiến nó trở nên nổi bật. Trong bài viết này, chúng ta sẽ tìm hiểu về một cấu trúc dữ liệu Redis có tên là stream. Chúng tôi có thể sử dụng cấu trúc dữ liệu này để xây dựng dịch vụ nhắn tin giữa những người tiêu dùng hoặc dịch vụ siêu nhỏ của chúng tôi

Đơn giản, Chúng tôi có thể sử dụng nó như một nhà môi giới tin nhắn và các dịch vụ siêu nhỏ của chúng tôi có thể giao tiếp giữa chúng thông qua cấu trúc dữ liệu này. Hãy bắt đầu

Luồng Redis là gì?

Nói một cách đơn giản, luồng Redis là cấu trúc dữ liệu chỉ nối thêm của Redis. Nó có một số điểm tương đồng với các cấu trúc dữ liệu khác như danh sách, nhưng nó hữu ích và phức tạp hơn. Khi chúng tôi thêm một số dữ liệu/thông báo vào một biến luồng, nó sẽ có sẵn cho người tiêu dùng. Nó có API BLOCKING cho phép chúng tôi khiến người tiêu dùng chờ đợi tin nhắn mới đến. Nó mạnh mẽ về tốc độ và dễ thực hiện. Nó cũng cung cấp Nhóm người tiêu dùng cho phép gửi một tập hợp con tin nhắn khác nhau đến những người tiêu dùng khác nhau

Ví dụ trường hợp sử dụng

Ví dụ: giả sử chúng ta có hai dịch vụ siêu nhỏ - MS-1 và MS-2. Các dịch vụ siêu nhỏ này muốn giao tiếp giữa chúng hoặc muốn trao đổi một số dữ liệu giữa chúng. Trong trường hợp này, các dịch vụ nhắn tin xuất hiện. Luồng Redis giữ vị trí giữa MS-1 và MS-2 và hoạt động như một nhà môi giới. Nó trao đổi tin nhắn/dữ liệu MS-1 sang MS-2 và ngược lại thông qua một số biến luồng trong Redis. Để rõ ràng hơn, giả sử MS-1 nối thêm một số dữ liệu vào luồng. MS-2 đang lắng nghe luồng đó liên tục. Ngay khi MS-1 thêm dữ liệu vào luồng đó, MS-2 sẽ nhận được dữ liệu đó

Hoạt động cơ bản

Mục nhập luồng không chỉ là một chuỗi mà thay vào đó bao gồm một hoặc nhiều cặp giá trị trường. Về cơ bản, chủ yếu có hai loại hoạt động, Thêm dữ liệu vào luồng và Lấy dữ liệu từ luồng

Thêm dữ liệu

Lệnh ghi cơ bản là XADD, nối thêm một mục mới trong luồng đã chỉ định

> XADD profile-information * name alex age 27 hair blackSample Output
-------------------------------------------
1627885225420-0

Lệnh trên sẽ thêm một mục mới vào luồng tại khóa “thông tin hồ sơ. “ Hãy giải thích lệnh này từng phần một để hiểu rõ

  • XADD là lệnh yêu cầu Redis nối thêm một mục mới tại một khóa đã chỉ định
  • thông tin hồ sơ là tên chính của luồng
  • * yêu cầu Redis tạo ID tăng dần đều cho mọi mục nhập. Chúng tôi cũng có thể chỉ định ID một cách rõ ràng, nhưng rất hiếm khi. Tự động tạo ID bởi máy chủ là hoàn hảo cho hầu hết mọi trường hợp
  • Phần còn lại của lệnh là các cặp khóa-giá trị tạo mục nhập luồng của chúng tôi

Ngoài ra còn có một lệnh hữu ích có thể cho chúng tôi biết số lượng mục bên trong Luồng

> XLEN profile-informationSample Output
-------------------------------------------
(integer) 1
  • thông tin hồ sơ là tên chính của luồng
Lấy dữ liệu

Bây giờ chúng tôi có thể nối thêm dữ liệu trong luồng thông qua lệnh XADD. Bây giờ là lúc tìm hiểu cách đọc các mục từ luồng. Chủ yếu có ba loại hoạt động để lấy dữ liệu. Hãy thảo luận từng cái một

Truy vấn theo phạm vi. XRANGE & XREVRANGE

Trước khi tìm hiểu cách hoạt động của truy vấn phạm vi, chúng ta cần hiểu thêm một chút về ID. Các ID được trả về bởi lệnh XADD trông như thế này - 1627796743670–0, có định dạng

-

Phần mili giây là thời gian cục bộ trong nút Redis cục bộ và số thứ tự được sử dụng để phân biệt các mục nhập nếu chúng được tạo trong cùng một mili giây. Redis đảm bảo rằng các ID này theo thứ tự tăng dần đều. Phần đầu tiên của ID về cơ bản là dấu thời gian, do đó, nó cũng cung cấp cho chúng tôi truy vấn phạm vi dựa trên thời gian. Để thực hiện một truy vấn phạm vi, chúng ta cần chỉ định hai ID — tương ứng là bắt đầu và kết thúc. Xin lưu ý rằng phạm vi của truy vấn là bao gồm, nghĩa là phạm vi được trả về sẽ bao gồm phần tử có đầu hoặc cuối là ID

> XRANGE profile-information - +Sample Output
-------------------------------------------
1) 1) 1627885225420-0
2) 1) "name"
2) "alex"
3) "age"
4) "27"
5) "hair"
6) "black"
  • XRANGE là lệnh cho truy vấn dựa trên phạm vi
  • thông tin hồ sơ là tên chính của luồng
  • Hai ID đặc biệt ( — và + ) tương ứng có nghĩa là ID nhỏ nhất và lớn nhất có sẵn trong luồng được chỉ định
  • Chúng tôi cũng có thể chỉ định bất kỳ ID hợp lệ nào thay vì — và + để chỉ điểm đầu và điểm cuối của phạm vi

Truy vấn phạm vi thời gian

Chúng tôi có thể bỏ qua phần trình tự cho truy vấn dựa trên thời gian và chỉ đặt dấu thời gian cho thời gian bắt đầu và thời gian kết thúc. Khi chúng tôi bỏ qua phần trình tự, trình tự bắt đầu sẽ tự động đặt thành 0 và trình tự kết thúc sẽ là số trình tự tối đa có sẵn

> XRANGE profile-information 1627796743670 1627799297560

Chúng tôi có thể chỉ định một tùy chọn COUNT trong truy vấn ở cuối. Nó sẽ nhận được N mục đầu tiên từ một phạm vi

> XRANGE profile-information - + COUNT 2

XREVRANGE hoạt động chính xác như XRANGE theo thứ tự ngược lại

> XREVRANGE profile-information + - COUNT 2

Nó sẽ trả về N phần tử theo thứ tự ngược lại của phạm vi

Nhận các mục mới với XREAD

Chúng tôi có thể đăng ký các mục mới đến luồng. Khái niệm này trông giống như Pub/Sub, nhưng có sự khác biệt đáng kể. Điểm giống nhau chính là, Một luồng có thể có nhiều người tiêu dùng và theo mặc định, một mặt hàng mới sẽ được gửi tới mọi người tiêu dùng đang chờ tin nhắn. Điều này khá giống với công nghệ quạt ra như Pub/Sub. Sự khác biệt chính là, trong khi Pub/Sub hoạt động như lửa và quên phương tiện sau khi phân phát thông báo, nó sẽ bị xóa khỏi Redis, thì Luồng hoạt động theo cách khác về cơ bản. Các luồng lưu giữ các tin nhắn với ID của chúng. Bên cạnh Luồng, Nhóm người tiêu dùng cung cấp mức độ kiểm soát mà Pub/Sub hoặc danh sách chặn không thể đạt được

XREAD là lệnh lắng nghe các tin nhắn mới đến một luồng

> XREAD COUNT 1 STREAMS profile-information 0
  • COUNT là một lệnh tùy chọn để giới hạn mục nhập đầu ra. Giá trị sau COUNT cho biết có bao nhiêu mục chúng tôi muốn đọc từ một luồng
  • STREAMS là bắt buộc với tên khóa sau của luồng
  • Giá trị cuối cùng, 0, là ID. ID này cho biết rằng ID tối đa đã được lưu trữ trong thông tin cấu hình luồng và lệnh sẽ chỉ trả về những mục nhập có ID lớn hơn giá trị này. Ở đây, 0 có nghĩa là chúng tôi muốn các thông báo từ đầu luồng có ID lớn hơn 0–0

Chúng ta có thể biến XREAD thành lệnh chặn một cách dễ dàng

________số 8_______
  • Tùy chọn BLOCK với thời gian chờ 0 sau đây có nghĩa là lệnh này sẽ kiểm tra xem nó có thể xử lý yêu cầu ngay lập tức hay không. Nếu nó có thể xử lý yêu cầu, nó sẽ làm như vậy. Nếu không, nó sẽ chặn yêu cầu cho đến khi dữ liệu đến. thời gian chờ 0 mili giây có nghĩa là yêu cầu này sẽ không bao giờ hết thời gian chờ
  • $ là một ID đặc biệt đại diện cho ID tối đa đã được lưu trữ trong các luồng để chúng tôi sẽ chỉ nhận được các tin nhắn mới
  • Chúng tôi cũng chỉ định tùy chọn COUNT để giới hạn các mục đầu ra. Thực ra XREAD chỉ có 2 lựa chọn BLOCK & COUNT

Nhóm người tiêu dùng

Bây giờ chúng ta đang ở trong một phần thú vị. XREAD đã cung cấp cho chúng tôi một công nghệ quạt ra rất tốt. Nhưng chúng tôi có thể xem xét một trường hợp khác khi chúng tôi có thể có nhiều người tiêu dùng và chúng tôi muốn phân phối tập hợp con các thông báo giữa họ. Đơn giản, Chúng tôi không muốn gửi cùng một thông điệp đến những người tiêu dùng khác nhau. Ví dụ: Giả sử chúng ta có hai người tiêu dùng — C1, C2 và chúng ta có 7 tin nhắn có ID là 1, 2, 3, 4, 5, 6, 7. Bây giờ chúng tôi muốn phân phối các tin nhắn này giữa C1 và C2 như thế này -

1 -> C1
2 -> C2
3 -> C1
4 -> C2
5 -> C1
6 -> C2
7 -> C1

Bạn có thể nhận thấy rằng chúng tôi không đẩy cùng một thông báo tới nhiều khách hàng. Chúng tôi đang gửi các thông điệp khác nhau đến các khách hàng khác nhau. Trong kịch bản này, Nhóm người tiêu dùng tham gia vào bức tranh này

Tạo nhóm người tiêu dùng

Giả sử tôi đã có sẵn một "thông tin hồ sơ" chính của luồng loại, thì lệnh sau sẽ tạo một nhóm người tiêu dùng

> XLEN profile-informationSample Output
-------------------------------------------
(integer) 1
0
  • Có thể bạn đã biết $ là một ID đặc biệt đại diện cho ID tối đa cuối cùng có sẵn trong các luồng. Nhóm người tiêu dùng cần biết nên theo dõi thông báo cho người tiêu dùng của mình từ đâu. Chuyển $ sẽ chỉ theo dõi các tin nhắn mới sau thời gian tạo Nhóm này. Nếu chúng ta chuyển 0 thay vì $, thì Nhóm này sẽ sử dụng tất cả các tin nhắn từ đầu luồng. Chúng tôi có thể chỉ định bất kỳ ID hợp lệ nào cho biết điểm bắt đầu từ đó Nhóm sử dụng tin nhắn
  • mygroup là tên của nhóm
  • thông tin hồ sơ là khóa luồng hiện có
  • XGROUP cũng hỗ trợ tạo luồng nếu luồng không tồn tại bằng cách chuyển một lệnh con ở MKSTREAM cuối cùng
> XLEN profile-informationSample Output
-------------------------------------------
(integer) 1
1

Tiêu thụ từ một nhóm

Redis cung cấp một tên lệnh XREADGROUP rất giống và cung cấp tùy chọn BLOCK tương tự; . Có một tùy chọn bắt buộc NHÓM với hai đối số — tên của Nhóm người tiêu dùng và tên của người tiêu dùng đang cố đọc

> XLEN profile-informationSample Output
-------------------------------------------
(integer) 1
2
  • Lệnh được mô tả khá nhiều. Nó nói rằng tôi muốn đọc từ luồng 'thông tin hồ sơ' bằng cách sử dụng nhóm người tiêu dùng 'mygroup' và tôi là người tiêu dùng Alice. Mỗi người tiêu dùng phải chỉ định một tên và tên người tiêu dùng này đang xác định duy nhất người tiêu dùng này trong nhóm
  • > là một ID đặc biệt khác, chỉ hợp lệ trong ngữ cảnh của các nhóm người tiêu dùng, có nghĩa là cho đến nay tin nhắn chưa bao giờ được gửi đến những người tiêu dùng khác
Phần kết luận

Đây gần như là tất cả những điều cơ bản về Redis Streams. Tôi đã lấy các khái niệm và thông tin từ bài báo này được xuất bản trên trang web chính thức. Nếu bạn đọc bài viết gốc, bạn có thể tìm hiểu thêm. Tôi đã thu hẹp bài viết chính và cố gắng trình bày một cách nhìn hữu ích về luồng Redis. Tôi hy vọng nó có thể giúp ích cho bạn và nếu có, hãy chia sẻ điều này với bạn bè của bạn. Mã hóa vui vẻ