Redis Stream β€” Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ Π²Π°ΡˆΠΈΡ… систСм сообщСний

Redis Stream — Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ Π²Π°ΡˆΠΈΡ… систСм сообщСний

Redis Stream β€” Π½ΠΎΠ²Ρ‹ΠΉ абстрактный Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, прСдставлСнный Π² Redis с Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ вСрсии 5.0
ΠšΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ Redis Stream β€” это List, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ записи. КаТдая запись ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ гСнСрируСтся автоматичСски ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΌΠ΅Ρ‚ΠΊΡƒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ записСй ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ ΠΈΡ… поступлСния Π² ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠ°ΠΊ Unix ΠΊΠΎΠΌΠ°Π½Π΄Π° Β«tail -fΒ» Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π»ΠΎΠ³-Ρ„Π°ΠΉΠ» ΠΈ Π·Π°ΠΌΠΈΡ€Π°Π΅Ρ‚ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ Π½ΠΎΠ²Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ»ΡƒΡˆΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ нСсколько ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Β«tail -fΒ» процСссы ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ», Π½Π΅ конфликтуя Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ всС прСимущСства Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π±Π΅Π³Π»ΠΎ вспомним Π΄Π°Π²Π½ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ структуры Redis, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ частично ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Redis Stream.

Redis PUB/SUB

Redis Pub/Sub β€” простая систСма сообщСний, ΡƒΠΆΠ΅ встроСнная Π² вашС key-value Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅. Однако Π·Π° простоту приходится ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ:

  • Если ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· строя, Ρ‚ΠΎ ΠΎΠ½ тСряСт всСх своих подписчиков
  • Π˜Π·Π΄Π°Ρ‚Π΅Π»ΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ адрСс всСх Π΅Π³ΠΎ подписчиков
  • Π˜Π·Π΄Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ своих подписчиков, Ссли Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΡŽΡ‚ΡΡ быстрСС, Ρ‡Π΅ΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ
  • Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ удаляСтся ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π° издатСля сразу послС ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π½Π΅ зависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΌΡƒ числу подписчиков ΠΎΠ½ΠΎ доставлСно ΠΈ ΠΊΠ°ΠΊ быстро Ρ‚Π΅ сумСли ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ это сообщСниС.
  • ВсС подписчики ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ сообщСниС ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. ΠŸΠΎΠ΄ΠΏΠΈΡΡ‡ΠΈΠΊΠΈ сами Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ собой ΡΠΎΠ³Π»Π°ΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ порядок ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ сообщСния.
  • НСт встроСнного ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° подтвСрТдСния ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния подписчиком. Если подписчик ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» сообщСниС ΠΈ свалился Π²ΠΎ врСмя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ρ‚ΠΎ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ ΠΎΠ± этом Π½Π΅ ΡƒΠ·Π½Π°Π΅Ρ‚.

Redis List

Redis List β€” структура Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ чтСния с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΈ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ сообщСния ΠΈΠ· Π½Π°Ρ‡Π°Π»Π° ΠΈΠ»ΠΈ ΠΊΠΎΠ½Π΅Ρ†Π° списка. На Π±Π°Π·Π΅ΠΉ этой структуры ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎΠΉ стСк ΠΈΠ»ΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ для вашСй распрСдСлённой систСмы ΠΈ этого Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π±ΡƒΠ΄Π΅Ρ‚ достаточно. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ отличия ΠΎΡ‚ Redis Pub/Sub:

  • Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ доставляСтся ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ.
  • ΠšΠ»ΠΈΠ½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ сам ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ чтСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сообщСния. List Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°Ρ….
  • БообщСния хранятся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΈΡ… ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ считаСт ΠΈΠ»ΠΈ Π½Π΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ явно. Если Π²Ρ‹ настроили Redis сСрвСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ сбрасывал Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° диск, Ρ‚ΠΎ Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎΡΡ‚ΡŒ систСмы Ρ€Π΅Π·ΠΊΠΎ возрастаСт.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Stream

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ записи Π² ΠΏΠΎΡ‚ΠΎΠΊ

Команда XADD добавляСт Π½ΠΎΠ²ΡƒΡŽ запись Π² ΠΏΠΎΡ‚ΠΎΠΊ. Π—Π°ΠΏΠΈΡΡŒ β€” это Π½Π΅ просто строка, ΠΎΠ½Π° состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ°Ρ€ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, каТдая запись ΡƒΠΆΠ΅ структурирована ΠΈ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ структуру CSV Ρ„Π°ΠΉΠ»Π°.

> XADD mystream * sensor-id 1234 temperature 19.8
1518951480106-0

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ ΠΌΡ‹ добавляСм Π² ΠΏΠΎΡ‚ΠΎΠΊ с ΠΈΠΌΠ΅Π½Π΅ΠΌ (ΠΊΠ»ΡŽΡ‡ΠΎΠΌ) Β«mystreamΒ» Π΄Π²Π° поля: Β«sensor-idΒ» ΠΈ Β«temperatureΒ» со значСниями Β«1234Β» ΠΈ Β«19.8Β» соотвСтствСнно. Π’ качСствС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ присвоСн записи β€” этот ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ запись Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅. Однако Π² этом случаС ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ *, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Redis сгСнСрировал для нас Π½ΠΎΠ²Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π½ΠΎΠ²Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ каТдая новая запись Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ больший ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ записям.

Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°ΠΎΡ€ записи, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ XADD, состоит ΠΈΠ· Π΄Π²ΡƒΡ… частСй:

{millisecondsTime}-{sequenceNumber}

millisecondsTime β€” Unix врСмя Π² миллисСкундах (врСмя сСрвСра Redis). Однако Ссли Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя оказываСтся Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΈΠ»ΠΈ мСньшим, Ρ‡Π΅ΠΌ врСмя ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ записи, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ врСмСнная ΠΌΠ΅Ρ‚ΠΊΠ° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ записи. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ссли врСмя сСрвСра возвращаСтся Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ΅, Ρ‚ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ ΠΈΠ½Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ всё Π΅Ρ‰Ρ‘ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ свойство увСличСния.

sequenceNumber ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для записСй, созданных Π² ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ миллисСкунду. sequenceNumber Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ Π½Π° 1 ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ записи. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ sequenceNumber ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ 64 Π±ΠΈΡ‚Π°, Ρ‚ΠΎ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π²Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΏΠ΅Ρ€Π΅Ρ‚ΡŒΡΡ Π² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° количСство записСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ сгСнСрированы Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ миллисСкунды.

Π€ΠΎΡ€ΠΌΠ°Ρ‚ Ρ‚Π°ΠΊΠΈΡ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ странным. НСдовСрчивый Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π°Ρ‚ΡŒΡΡ вопросом, ΠΏΠΎΡ‡Π΅ΠΌΡƒ врСмя являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Redis ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ запросы Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΏΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ связан со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ создания записи, Ρ‚ΠΎ это Π΄Π°Ρ‘Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠœΡ‹ рассмотрим ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘ΠΌ ΠΊ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ XRANGE.

Если ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ трСбуСтся ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ свой собствСнный ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, связан с ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ внСшнСй систСмой, Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ XADD вмСсто Π·Π½Π°ΠΊΠ° * ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

> XADD somestream 0-1 field value
0-1
> XADD somestream 0-2 foo bar
0-2

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² этом случаС Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ сами ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ€Π°Π²Π΅Π½ Β«0-1Β», поэтому ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π²Π΅Π½ ΠΈΠ»ΠΈ мСньшС Β«0-1Β».

> XADD somestream 0-1 foo bar
(error) ERR The ID specified in XADD is equal or smaller than the target stream top item

Число записСй Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅

МоТно ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ количСство записСй Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅, просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ XLEN. Для нашСго ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° эта ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²Π΅Ρ€Π½Ρ‘Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

> XLEN somestream
(integer) 2

Запросы ΠΏΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρƒ β€” XRANGE ΠΈ XREVRANGE

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρƒ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄Π²Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° β€” Π½Π°Ρ‡Π°Π»ΠΎ ΠΈ ΠΊΠΎΠ½Π΅Ρ† Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ всС элСмСнты, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹. Π’Π°ΠΊΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° «-» ΠΈ «+», соотвСтствСнно ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ самый малСнький (пСрвая запись) ΠΈ самый большой (послСдняя запись) ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ всС записи ΠΏΠΎΡ‚ΠΎΠΊΠ°.

> XRANGE mystream - +
1) 1) 1518951480106-0
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.8"
2) 1) 1518951482479-0
   2) 1) "sensor-id"
      2) "9999"
      3) "temperature"
      4) "18.2"

КаТдая возвращаСмая запись прСдставляСт собой массив ΠΈΠ· Π΄Π²ΡƒΡ… элСмСнтов: ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈ список ΠΏΠ°Ρ€ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠœΡ‹ ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ записи ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Однако, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² запросС Π½Π΅ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Unix врСмя, опустив Ρ‡Π°ΡΡ‚ΡŒ, ΠΎΡ‚Π½ΠΎΡΡΡ‰ΡƒΡŽΡΡ ΠΊ sequenceNumber. ΠžΠΏΡƒΡ‰Π΅Π½Π½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° автоматичСски приравняСтся ΠΊ Π½ΡƒΠ»ΡŽ Π² Π½Π°Ρ‡Π°Π»Π΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΈ ΠΊ максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π² ΠΊΠΎΠ½Ρ†Π΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, Ρ€Π°Π²Π½Ρ‹ΠΉ Π΄Π²ΡƒΠΌ миллисСкундам.

> XRANGE mystream 1518951480106 1518951480107
1) 1) 1518951480106-0
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.8"

Π£ нас Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° запись Π² этом Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π½Π°Π±ΠΎΡ€Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌ. По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ XRANGE ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠΏΡ†ΠΈΡŽ COUNT. Π£ΠΊΠ°Π·Π°Π² количСство, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ просто ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ N записСй. Если Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ N записСй (пагинация), ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ послСдний ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρƒ Π½Π΅Π³ΠΎ sequenceNumber Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΈ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ снова. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° это Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. ΠœΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ 10 элСмСнтов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XADD (ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ mystream ΡƒΠΆΠ΅ Π±Ρ‹Π» Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ 10 элСмСнтами). Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ, получая ΠΏΠΎ 2 элСмСнта Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°, Π½ΠΎ с COUNT Ρ€Π°Π²Π½Ρ‹ΠΌ 2.

> XRANGE mystream - + COUNT 2
1) 1) 1519073278252-0
   2) 1) "foo"
      2) "value_1"
2) 1) 1519073279157-0
   2) 1) "foo"
      2) "value_2"

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ двумя элСмСнтами, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ послСдний ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ 1519073279157-0, ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ 1 ΠΊ sequenceNumber.
Π Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС 1519073279157-1, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС Π½ΠΎΠ²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π½Π°Ρ‡Π°Π»Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° XRANGE:

> XRANGE mystream 1519073279157-1 + COUNT 2
1) 1) 1519073280281-0
   2) 1) "foo"
      2) "value_3"
2) 1) 1519073281432-0
   2) 1) "foo"
      2) "value_4"

И Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ XRANGE составляСт O(log (N)) для поиска, Π° Π·Π°Ρ‚Π΅ΠΌ O(M) для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° M элСмСнтов, Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ шаг ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ являСтся быстрым. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XRANGE ΠΌΠΎΠΆΠ½ΠΎ эффСктивно ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ.

Команда XREVRANGE являСтся эквивалСнтом XRANGE, Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ элСмСнты Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС:

> XREVRANGE mystream + - COUNT 1
1) 1) 1519073287312-0
   2) 1) "foo"
      2) "value_10"

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° XREVRANGE ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° start ΠΈ stop Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС.

Π§Ρ‚Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… записСй с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XREAD

Часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π·Π°Π΄Π°Ρ‡Π° ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π½Π° ΠΏΠΎΡ‚ΠΎΠΊ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΠΎΠ²Ρ‹Π΅ сообщСния. Π­Ρ‚Π° концСпция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΡ…ΠΎΠΆΠ΅ΠΉ Π½Π° Redis Pub/Sub ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Redis List, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ различия Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Redis Stream:

  1. КаТдоС Π½ΠΎΠ²ΠΎΠ΅ сообщСниС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ доставляСтся ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ подписчику. Π­Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ отличаСтся ΠΎΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Redis List, Π³Π΄Π΅ Π½ΠΎΠ²ΠΎΠ΅ сообщСниС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ΄Π½ΠΈΠΌ подписчиком.
  2. Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π² Redis Pub/Sub всС сообщСния Π·Π°Π±Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ, Π² Stream всС сообщСния ΡΠΎΡ…Ρ€ΡΠ½ΡΡŽΡ‚ΡΡ Π½Π° Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ срок (Ссли ΠΊΠ»ΠΈΠ΅Π½Ρ‚ явно Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅).
  3. Redis Stream позволяСт Ρ€Π°Π·Π³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ сообщСниям Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ подписчик ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ свою Π»ΠΈΡ‡Π½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ сообщСний.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π½Π° ΠΏΠΎΡ‚ΠΎΠΊ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ сообщСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ XREAD. Π­Ρ‚ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС, Ρ‡Π΅ΠΌ XRANGE, поэтому ΠΌΡ‹ спСрва Π½Π°Ρ‡Π½Π΅ΠΌ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΏΠΎΠΏΡ€ΠΎΡ‰Π΅.

> XREAD COUNT 2 STREAMS mystream 0
1) 1) "mystream"
   2) 1) 1) 1519073278252-0
         2) 1) "foo"
            2) "value_1"
      2) 1) 1519073279157-0
         2) 1) "foo"
            2) "value_2"

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ ΡƒΠΊΠ°Π·Π°Π½Π° Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π°Ρ Ρ„ΠΎΡ€ΠΌΠ° XREAD. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ опция COUNT Π½Π΅ являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ. ЀактичСски СдинствСнной ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ являСтся опция STREAMS, которая Π·Π°Π΄Π°Π΅Ρ‚ список ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² вмСстС с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ. ΠœΡ‹ написали Β«STREAMS mystream 0Β» β€” ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ всС записи ΠΏΠΎΡ‚ΠΎΠΊΠ° mystream с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ большС Ρ‡Π΅ΠΌ Β«0-0Β». Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ имя ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π½Π° нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Β«STREAMS mystream otherstream 0 0Β». ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ послС ΠΎΠΏΡ†ΠΈΠΈ STREAMS Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ спСрва ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π° всСх Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Ρ‚Π΅ΠΌ список ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ².

Π’ этой простой Ρ„ΠΎΡ€ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ особСнного ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с XRANGE. Однако интСрСсно Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ XREAD Π² Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, ΡƒΠΊΠ°Π·Π°Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ BLOCK:

> XREAD BLOCK 0 STREAMS mystream $

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΡƒΠΊΠ°Π·Π°Π½Π° новая ΠΎΠΏΡ†ΠΈΡŽ BLOCK с Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ оТидания 0 миллисСкунд (это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ бСсконСчноС ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅). Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, вмСсто ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° для ΠΏΠΎΡ‚ΠΎΠΊΠ° mystream, Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ $. Π­Ρ‚ΠΎΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ XREAD Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ mystream. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΠΎΠ²Ρ‹Π΅ сообщСния, начиная с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π½Π°Ρ‡Π°Π»ΠΈ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΠ΅. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ смыслС это ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° Unix ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Β«tail -fΒ».

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ использовании ΠΎΠΏΡ†ΠΈΠΈ BLOCK Π½Π°ΠΌ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ $. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любой ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€. Если ΠΊΠΎΠΌΠ°Π½Π΄Π° смоТСт ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ наш запрос Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΎΠ½Π° сдСлаСт это, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½Π° заблокируСтся.

Π‘Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ XREAD Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Ρ‚ΡŒ сразу нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², просто Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΡ… ΠΈΠΌΠ΅Π½Π°. Π’ этом случаС ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²Π΅Ρ€Π½Π΅Ρ‚ запись ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ поступили Π΄Π°Π½Π½Ρ‹Π΅. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ подписчик, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ.

Consumer Groups

Π’ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡Π°Ρ… ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ€Π°Π·Π³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ доступ подписчиков ΠΊ сообщСниям Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ β€” ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний с Π²ΠΎΡ€ΠΊΠ΅Ρ€Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ сообщСния ΠΏΠΎΡ‚ΠΎΠΊΠ°, позволяя ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сообщСний.

Если ΠΌΡ‹ прСдставим, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ подписчика C1, C2, C3 ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит сообщСния 1, 2, 3, 4, 5, 6, 7, Ρ‚ΠΎ обслуТиваниС сообщСний Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅ Π½ΠΈΠΆΠ΅:

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

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ этот эффСкт, Redis Stream ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ Consumer Group. Π­Ρ‚Π° концСпция ΠΏΠΎΠ΄ΠΎΠ±Π½Π° псСвдо-подписчику, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π½ΠΎ фактичСски обслуТиваСтся нСсколькими подписчиками Π²Π½ΡƒΡ‚Ρ€ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹, прСдоставляя ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ:

  1. КаТдоС сообщСниС доставляСтся Ρ€Π°Π·Π½Ρ‹ΠΌ подписчикам Π²Π½ΡƒΡ‚Ρ€ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹.
  2. Π’ ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Π³Ρ€ΡƒΠΏΠΏΡ‹ подписчики ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдставляСт собой строку с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ рСгистра. Если ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ подписчик Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹ΠΏΠ°Π΄Π΅Ρ‚ ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹, Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π² Π³Ρ€ΡƒΠΏΠΏΡƒ ΠΏΠΎ собствСнному ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ.
  3. КаТдая Consumer Group слСдуСт ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ Β«ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π½Π΅ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½ΠΎΠ΅ сообщСниС». Когда подписчик Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹Π΅ сообщСния, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ сообщСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Ρ€Π°Π½Π΅Π΅ Π½Π΅ Π΄ΠΎΡΡ‚Π°Π²Π»ΡΠ»ΠΈΡΡŒ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΌΡƒ подписчику Π²Π½ΡƒΡ‚Ρ€ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹.
  4. БущСствуСт ΠΊΠΎΠΌΠ°Π½Π΄Π° явного подтвСрТдСния ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния подписчиком. Пока Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° эта ΠΊΠΎΠΌΠ°Π½Π΄Π°, Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ΅ сообщСниС Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π² статусС Β«pendingΒ» .
  5. Π’Π½ΡƒΡ‚Ρ€ΠΈ Consumer Group ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ подписчик ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ сообщСний, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ доставлСны ΠΈΠΌΠ΅Π½Π½ΠΎ Π΅ΠΌΡƒ, Π½ΠΎ Π΅Ρ‰Ρ‘ Π½Π΅ Π±Ρ‹Π»ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ (Π² статусС Β«pendingΒ»)

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ смыслС, состояниС Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСставлСно Ρ‚Π°ΠΊ:

+----------------------------------------+
| consumer_group_name: mygroup          
| consumer_group_stream: somekey        
| last_delivered_id: 1292309234234-92    
|                                                           
| consumers:                                          
|    "consumer-1" with pending messages  
|       1292309234234-4                          
|       1292309234232-8                          
|    "consumer-42" with pending messages 
|       ... (and so forth)                             
+----------------------------------------+

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с основными ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ для Consumer Group, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ:

  • XGROUP ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания, уничтоТСния ΠΈ управлСния Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ
  • XREADGROUP ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для чтСния ΠΏΠΎΡ‚ΠΎΠΊΠ° Ρ‡Π΅Ρ€Π΅Π· Π³Ρ€ΡƒΠΏΠΏΡƒ
  • XACK β€” это ΠΊΠΎΠΌΠ°Π½Π΄Π° позволяСт подписчику ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ сообщСниС ΠΊΠ°ΠΊ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Consumer Group

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ mystream ΡƒΠΆΠ΅ сущСствуСт. Π’ΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° создания Π³Ρ€ΡƒΠΏΠΏΡ‹ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΈΠ΄:

> XGROUP CREATE mystream mygroup $
OK

ΠŸΡ€ΠΈ создании Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, начиная с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π³Ρ€ΡƒΠΏΠΏΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ сообщСния. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ просто ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ всС Π½ΠΎΠ²Ρ‹Π΅ сообщСния, Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ $ (ΠΊΠ°ΠΊ Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅). Если вмСсто ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ 0, Ρ‚ΠΎ Π³Ρ€ΡƒΠΏΠΏΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ доступны всС сообщСния ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π³Ρ€ΡƒΠΏΠΏΠ° создана, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ сразу ΠΆΠ΅ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ сообщСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ XREADGROUP. Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° XREAD ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠΏΡ†ΠΈΡŽ BLOCK. Однако Π΅ΡΡ‚ΡŒ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ опция GROUP, которая Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ всСгда ΡƒΠΊΠ°Π·Π°Π½Π° c двумя Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ: имя Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΈ имя подписчика. ΠžΠΏΡ†ΠΈΡ COUNT поддСТиваСтся Ρ‚Π°ΠΊΠΆΠ΅.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ помСстим Ρ‚ΡƒΠ΄Π° нСсколько сообщСний:

> XADD mystream * message apple
1526569495631-0
> XADD mystream * message orange
1526569498055-0
> XADD mystream * message strawberry
1526569506935-0
> XADD mystream * message apricot
1526569535168-0
> XADD mystream * message banana
1526569544280-0

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ этот ΠΏΠΎΡ‚ΠΎΠΊ Ρ‡Π΅Ρ€Π΅Π· Π³Ρ€ΡƒΠΏΠΏΡƒ:

> XREADGROUP GROUP mygroup Alice COUNT 1 STREAMS mystream >
1) 1) "mystream"
   2) 1) 1) 1526569495631-0
         2) 1) "message"
            2) "apple"

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° дословно гласит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

Β«Π―, Алиса-подписчик, Ρ‡Π»Π΅Π½ Π³Ρ€ΡƒΠΏΠΏΡ‹ mygroup, Ρ…ΠΎΡ‡Ρƒ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° mystream ΠΎΠ΄Π½ΠΎ сообщСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Ρ‹Π»ΠΎ Π½ΠΈΠΊΠΎΠΌΡƒ доставлСно Ρ€Π°Π½Π΅Π΅Β».

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° подписчик выполняСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ с Π³Ρ€ΡƒΠΏΠΏΠΎΠΉ, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ своС имя, ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ идСнтифицируя сСбя Π²Π½ΡƒΡ‚Ρ€ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° ΠΎΡ‡Π΅Π½ΡŒ ваТная Π΄Π΅Ρ‚Π°Π»ΡŒ β€” ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ «>». Π­Ρ‚ΠΎΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅Ρ‚ сообщСния, оставляя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎ сих ΠΏΠΎΡ€ Π½ΠΈ Ρ€Π°Π·Ρƒ Π½Π΅ Π΄ΠΎΡΡ‚Π°Π²Π»ΡΠ»ΠΈΡΡŒ.

Π’Π°ΠΊΠΆΠ΅, Π² особых случаях, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ 0 ΠΈΠ»ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€. Π’ этом случаС ΠΊΠΎΠΌΠ°Π½Π΄Π° XREADGROUP Π²Π΅Ρ€Π½Ρ‘Ρ‚ Π²Π°ΠΌ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ сообщСний со статусом Β«pendingΒ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ доставлСны ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ подписчику (Alice), Π½ΠΎ Π΅Ρ‰Ρ‘ Π½Π΅ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ XACK.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, сразу ΡƒΠΊΠ°Π·Π°Π² ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ 0, Π±Π΅Π· ΠΎΠΏΡ†ΠΈΠΈ COUNT. ΠœΡ‹ просто ΡƒΠ²ΠΈΠ΄ΠΈΠΌ СдинствСнноС ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅Π΅ сообщСниС, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ сообщСниС с яблоком:

> XREADGROUP GROUP mygroup Alice STREAMS mystream 0
1) 1) "mystream"
   2) 1) 1) 1526569495631-0
         2) 1) "message"
            2) "apple"

Однако Ссли ΠΌΡ‹ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΠΌ сообщСниС ΠΊΠ°ΠΊ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅, Ρ‚ΠΎ ΠΎΠ½ΠΎ большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ:

> XACK mystream mygroup 1526569495631-0
(integer) 1
> XREADGROUP GROUP mygroup Alice STREAMS mystream 0
1) 1) "mystream"
   2) (empty list or set)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ настала ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π‘ΠΎΠ±Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ:

> XREADGROUP GROUP mygroup Bob COUNT 2 STREAMS mystream >
1) 1) "mystream"
   2) 1) 1) 1526569498055-0
         2) 1) "message"
            2) "orange"
      2) 1) 1526569506935-0
         2) 1) "message"
            2) "strawberry"

Π‘ΠΎΠ±, Ρ‡Π»Π΅Π½ Π³Ρ€ΡƒΠΏΠΏΡ‹ mygroup, попросил Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡƒΡ… сообщСний. Команда сообщаСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎ нСдоставлСнных сообщСниях ΠΈΠ·-Π·Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° «>». Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, сообщСниС Β«appleΒ» Π½Π΅ отобраТСтся, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ ΡƒΠΆΠ΅ доставлСно АлисС, поэтому Π‘ΠΎΠ± ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Β«orangeΒ» ΠΈ Β«strawberryΒ».

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Алиса, Π‘ΠΎΠ± ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ подписчик Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ сообщСния ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ свою ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… сообщСний ΠΈΠ»ΠΈ ΠΏΠΎΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ сообщСния ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅.

Π•ΡΡ‚ΡŒ нСсколько Π²Π΅Ρ‰Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ:

  • Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ подписчик считаСт сообщСниС ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ XREADGROUP, это сообщСниС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС Β«pendingΒ» ΠΈ закрСпляСтся Π·Π° этим ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ подписчиком. Π”Ρ€ΡƒΠ³ΠΈΠ΅ подписчики Π³Ρ€ΡƒΠΏΠΏΡ‹ Π½Π΅ смогут ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ это сообщСниС.
  • ΠŸΠΎΠ΄ΠΏΠΈΡΡ‡ΠΈΠΊΠΈ автоматичСски ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠΈ, Π½Π΅Ρ‚ нСобходимости Π² ΠΈΡ… явном создании.
  • Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XREADGROUP Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ сообщСния ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏΡ‹ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XGROUP

ВосстановлСниС послС сбоя

ΠŸΠΎΠ΄ΠΏΠΈΡΡ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ послС сбоя ΠΈ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ свой список сообщСний со статусом Β«pendingΒ». Однако Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΈΡ€Π΅ подписчики ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠ΅Ρ‚ΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ. Π§Ρ‚ΠΎ происходит с подвисшими сообщСниями подписчика, Ссли ΠΎΠ½ Π½Π΅ смог Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ послС сбоя?
Consumer Group ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ для Ρ‚Π°ΠΊΠΈΡ… случаСв β€” ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° сообщСний.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ XPENDING, которая ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ всС сообщСния Π³Ρ€ΡƒΠΏΠΏΡ‹ со статусом Β«pendingΒ». Π’ своСй ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° вызываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с двумя Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ: ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π³Ρ€ΡƒΠΏΠΏΡ‹:

> XPENDING mystream mygroup
1) (integer) 2
2) 1526569498055-0
3) 1526569506935-0
4) 1) 1) "Bob"
      2) "2"

Команда Π²Ρ‹Π²Π΅Π»Π° количСство Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… сообщСний для всСй Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ подписчика. Π£ нас Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π‘ΠΎΠ± с двумя Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΌΠΈ сообщСниями, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ СдинствСнноС сообщСниС, Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ΅ Алисой, Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XACK.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ большС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²:

XPENDING {key} {groupname} [{start-id} {end-id} {count} [{consumer-name}]]
{start-id} {end-id} β€” Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² (ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ «-» ΠΈ «+»)
{count} β€” количСство ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ доставки
{consumer-name} β€” имя Π³Ρ€ΡƒΠΏΠΏΡ‹

> XPENDING mystream mygroup - + 10
1) 1) 1526569498055-0
   2) "Bob"
   3) (integer) 74170458
   4) (integer) 1
2) 1) 1526569506935-0
   2) "Bob"
   3) (integer) 74170458
   4) (integer) 1

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сообщСния: ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, имя подписчика, врСмя простоя Π² миллисСкундах ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, количСство ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ доставки. Π£ нас Π΅ΡΡ‚ΡŒ Π΄Π²Π° сообщСния ΠΎΡ‚ Π‘ΠΎΠ±Π°, ΠΈ ΠΎΠ½ΠΈ ΠΏΡ€ΠΎΡΡ‚Π°ΠΈΠ²Π°ΡŽΡ‚ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 74170458 миллисСкунд, ΠΎΠΊΠΎΠ»ΠΎ 20 часов.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π½Π°ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠΌ Π±Ρ‹Π»ΠΎ содСрТаниС сообщСния, просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ XRANGE.

> XRANGE mystream 1526569498055-0 1526569498055-0
1) 1) 1526569498055-0
   2) 1) "message"
      2) "orange"

ΠœΡ‹ просто Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π΄Π²Π°ΠΆΠ΄Ρ‹ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ…. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ нСкоторая идСя, Алиса ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ послС 20 часов простоя Π‘ΠΎΠ±, вСроятно, Π½Π΅ восстановится, ΠΈ ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ эти сообщСния ΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ вмСсто Π‘ΠΎΠ±Π°. Для этого ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ XCLAIM:

XCLAIM {key} {group} {consumer} {min-idle-time} {ID-1} {ID-2} ... {ID-N}

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Β«Ρ‡ΡƒΠΆΠΎΠ΅Β» сообщСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΅Ρ‰Ρ‘ Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ, ΠΏΡƒΡ‚Ρ‘ΠΌ смСны Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° Π½Π° {consumer}. Однако ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ минимальноС врСмя простоя {min-idle-time}. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° Π΄Π²Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° Ρƒ ΠΎΠ΄Π½ΠΈΡ… ΠΈ Ρ‚Π΅Ρ… ΠΆΠ΅ сообщСний:

Client 1: XCLAIM mystream mygroup Alice 3600000 1526569498055-0
Clinet 2: XCLAIM mystream mygroup Lora 3600000 1526569498055-0

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ сбросит врСмя простоя ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ счСтчик количСства доставок. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ смоТСт Π΅Π³ΠΎ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ.

> XCLAIM mystream mygroup Alice 3600000 1526569498055-0
1) 1) 1526569498055-0
   2) 1) "message"
      2) "orange"

Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ вострСбовано Алисой, которая Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ сообщСниС ΠΈ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ Π΅Π³ΠΎ.

Из ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ запроса Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ содСрТимоС самого сообщСния. Однако это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. ΠžΠΏΡ†ΠΈΡ JUSTID ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² сообщСния. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Ссли Π²Π°ΠΌ Π½Π΅ интСрСсны Π΄Π΅Ρ‚Π°Π»ΠΈ сообщСния ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ систСмы.

Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ доставки

Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚Π΅ Π² Π²Ρ‹Π²ΠΎΠ΄Π΅ XPENDING β€” это количСство доставок ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сообщСния. Π’Π°ΠΊΠΎΠΉ счСтчик увСличиваСтся двумя способами: ΠΊΠΎΠ³Π΄Π° сообщСниС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· XCLAIM ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Ρ‹Π·ΠΎΠ² XREADGROUP.

Π­Ρ‚ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сообщСния Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎ нСсколько Ρ€Π°Π·. Π“Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΠΈΡ‚ΠΎΠ³Π΅ всС сообщСния Π±Ρ‹Π»ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹. Иногда ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ сообщСния Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈΠ·-Π·Π° поврСТдСния самого сообщСниС ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сообщСния Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² ΠΊΠΎΠ΄Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ это сообщСниС Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π² состоянии ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ нас Π΅ΡΡ‚ΡŒ счСтчик ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ доставки, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот счСтчик для обнаруТСния Ρ‚Π°ΠΊΠΈΡ… ситуаций. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ счСтчик доставок достигнСт Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π²Π°ΠΌΠΈ большого числа, вСроятно, Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·ΡƒΠΌΠ½Π΅Π΅ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ сообщСниС Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ систСмному администратору.

БостояниС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

Команда XINFO ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для запроса Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ Π΅Π³ΠΎ Π³Ρ€ΡƒΠΏΠΏΠ°Ρ…. НапримСр, Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Π²ΠΈΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

> XINFO STREAM mystream
 1) length
 2) (integer) 13
 3) radix-tree-keys
 4) (integer) 1
 5) radix-tree-nodes
 6) (integer) 2
 7) groups
 8) (integer) 2
 9) first-entry
10) 1) 1524494395530-0
    2) 1) "a"
       2) "1"
       3) "b"
       4) "2"
11) last-entry
12) 1) 1526569544280-0
    2) 1) "message"
       2) "banana"

Команда Π²Ρ‹ΡˆΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΎΠ±Ρ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТный ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

> XINFO GROUPS mystream
1) 1) name
   2) "mygroup"
   3) consumers
   4) (integer) 2
   5) pending
   6) (integer) 2
2) 1) name
   2) "some-other-group"
   3) consumers
   4) (integer) 1
   5) pending
   6) (integer) 0

Команда Π²Ρ‹ΡˆΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΎΠ±Ρ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ всСм Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°

> XINFO CONSUMERS mystream mygroup
1) 1) name
   2) "Alice"
   3) pending
   4) (integer) 1
   5) idle
   6) (integer) 9104628
2) 1) name
   2) "Bob"
   3) pending
   4) (integer) 1
   5) idle
   6) (integer) 83841983

Команда Π²Ρ‹ΡˆΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ всСм подписчикам ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹.
Если Π²Ρ‹ Π·Π°Π±ΡƒΠ΄ΠΈΡ‚Π΅ синтаксис ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, просто ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ Π·Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊ самой ΠΊΠΎΠΌΠ°Π½Π΄Π΅:

> XINFO HELP
1) XINFO {subcommand} arg arg ... arg. Subcommands are:
2) CONSUMERS {key} {groupname}  -- Show consumer groups of group {groupname}.
3) GROUPS {key}                 -- Show the stream consumer groups.
4) STREAM {key}                 -- Show information about the stream.
5) HELP                         -- Print this help.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°

МногиС прилоТСния Π½Π΅ хотят ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΏΠΎΡ‚ΠΎΠΊ Π²Π΅Ρ‡Π½ΠΎ. Часто ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ максимально допустимоС количСство сообщСний Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅. Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… случаях ΠΏΠΎΠ»Π΅Π·Π½ΠΎ пСрСнСсти всС сообщСния ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ постоянноС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΏΡ€ΠΈ достиТСнии Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° MAXLEN Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ XADD:

> XADD mystream MAXLEN 2 * value 1
1526654998691-0
> XADD mystream MAXLEN 2 * value 2
1526654999635-0
> XADD mystream MAXLEN 2 * value 3
1526655000369-0
> XLEN mystream
(integer) 2
> XRANGE mystream - +
1) 1) 1526654999635-0
   2) 1) "value"
      2) "2"
2) 1) 1526655000369-0
   2) 1) "value"
      2) "3"

ΠŸΡ€ΠΈ использовании MAXLEN старыС записи автоматичСски ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ достиТСнии ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, поэтому ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ постоянный Ρ€Π°Π·ΠΌΠ΅Ρ€. Однако ΠΎΠ±Ρ€Π΅Π·ΠΊΠ° Π² этом случаС происходит Π½Π΅ самым ΠΏΡ€ΠΎΠΈΠ²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ способом Π² памяти Redis. Π£Π»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

XADD mystream MAXLEN ~ 1000 * ... entry fields here ...

АргумСнт ~ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Π΄Π»ΠΈΠ½Π½Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любоС число большС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ 1000 (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 1000, 1010 ΠΈΠ»ΠΈ 1030). ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΌΡ‹ явно ΡƒΠΊΠ°Π·Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наш ΠΏΠΎΡ‚ΠΎΠΊ Ρ…Ρ€Π°Π½ΠΈΠ» Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 1000 записСй. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ эффСктивнСС Π²Π½ΡƒΡ‚Ρ€ΠΈ Redis.

Π’Π°ΠΊΠΆΠ΅ сущСствСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° XTRIM, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ Ρ‚ΠΎ ΠΆΠ΅ самоС:

> XTRIM mystream MAXLEN 10

> XTRIM mystream MAXLEN ~ 10

ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½ΠΎΠ΅ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈ рСпликация

Redis Stream асинхронно рСплицируСтся Π½Π° slave Π½ΠΎΠ΄Ρ‹ ΠΈ сохраняСтся Π² Ρ„Π°ΠΉΠ»Ρ‹ Ρ‚ΠΈΠΏΠ° AOF (ΡΠ½Π°ΠΏΡˆΠΎΡ‚ всСх Π΄Π°Π½Π½Ρ‹Ρ…) ΠΈ RDB (Π»ΠΎΠ³ всСх ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ записи). Π’Π°ΠΊΠΆΠ΅ поддСрТиваСтся рСпликация состояния Consumer Groups. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ссли сообщСниС находится Π² статусС Β«pendingΒ» Π½Π° master Π½ΠΎΠ΄Π΅, Ρ‚ΠΎ Π½Π° slave Π½ΠΎΠ΄Π°Ρ… это сообщСниС Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ статус.

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ°

Для удалСния сообщСний сущСствуСт ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° XDEL. Команда ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ имя ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ сообщСний, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ:

> XRANGE mystream - + COUNT 2
1) 1) 1526654999635-0
   2) 1) "value"
      2) "2"
2) 1) 1526655000369-0
   2) 1) "value"
      2) "3"
> XDEL mystream 1526654999635-0
(integer) 1
> XRANGE mystream - + COUNT 2
1) 1) 1526655000369-0
   2) 1) "value"
      2) "3"

ΠŸΡ€ΠΈ использовании этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‡Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ фактичСски ΠΏΠ°ΠΌΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ высвобоТдСна Π½Π΅ сразу.

ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹

Π Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ структурами Π΄Π°Π½Π½Ρ‹Ρ… Redis Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ структуры Π΄Π°Π½Π½Ρ‹Ρ… большС Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ элСмСнтов Π²Π½ΡƒΡ‚Ρ€ΠΈ сСбя, Π² качСствС ΠΏΠΎΠ±ΠΎΡ‡Π½ΠΎΠ³ΠΎ эффСкта, сама структура Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½Π° ΠΈΠ· памяти. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, отсортированный Π½Π°Π±ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡƒΠ΄Π°Π»Π΅Π½, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π·ΠΎΠ² ZREM ΡƒΠ΄Π°Π»ΠΈΡ‚ послСдний элСмСнт. ВмСсто этого ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π² памяти, Π΄Π°ΠΆΠ΅ Π½Π΅ имСя Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта Π²Π½ΡƒΡ‚Ρ€ΠΈ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Redis Stream идСально ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для создания Π±Ρ€ΠΎΠΊΠ΅Ρ€ΠΎΠ² сообщСний, ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний, ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² ΠΈ систСм Ρ‡Π°Ρ‚Π°, хранящих ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ.

Как ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ сказал Никлаус Π’ΠΈΡ€Ρ‚, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ β€” это Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ плюс структуры Π΄Π°Π½Π½Ρ‹Ρ…, Π° Redis ΡƒΠΆΠ΅ Π΄Π°Π΅Ρ‚ Π²Π°ΠΌ ΠΈ Ρ‚ΠΎ, ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com