sql >> Databasteknik >  >> NoSQL >> Redis

Vilka är de största skillnaderna mellan Redis Pub/Sub och Redis Stream?

Datalagring

Pub/Sub är en utgivare/prenumerantplattform, det är inte datalagring. Publicerade meddelanden försvinner, oavsett om det finns någon prenumerant.

I Redis Streams är stream en datatyp, en datastruktur i sig själv. Meddelanden eller poster lagras i minnet och stannar där tills du får kommandot att raderas.

Synkronisera/asynkronisera kommunikation (Push/Pull)

Pub/Sub är synkron kommunikation (push protokoll). Alla parter behöver vara aktiva samtidigt för att kunna kommunicera. Här är Redis en ren synkron meddelandemäklare.

Redis-strömmar tillåter både synkrona (XREAD med BLOCK och den speciella $ ID är en push protokoll) och asynkron kommunikation (vanlig XREAD är en drag protokoll). XREAD med BLOCK är som Pub/Sub, men med möjligheten att återuppta vid frånkoppling utan att förlora meddelanden.

Leveranssemantik

Pub/Sub är At-most-once, d.v.s. "elda och glömma".

Redis Streams tillåter både At-most-once eller At-minst-en gång (uttrycklig bekräftelse skickad av mottagaren)

Blockeringsläge för konsumenter

Pub/Sub är endast blockeringsläge. När klienten väl har prenumererat på en kanal försätts den i prenumerantläge och den kan inte utfärda kommandon (förutom [P]SUBSCRIBE , [P]UNSUBSCRIBE , PING och QUIT ), har den blivit skrivskyddad.

Redis Streams låter konsumenter läsa meddelanden i blockeringsläge eller inte.

Fan-out

Pub/Sub är endast fan-out. Alla aktiva klienter får alla meddelanden.

Redis Streams tillåter fan-out (med XREAD ), men också för att tillhandahålla en annan delmängd av meddelanden från samma ström till många klienter. Detta möjliggör skalning av meddelandebehandling, genom att dirigera olika meddelanden till olika arbetare, på ett sätt så att det inte är möjligt att samma meddelande levereras till flera konsumenter. Det sista scenariot uppnås med konsumentgrupper .

Redis Streams tillhandahåller många fler funktioner, som tidsstämplar, fältvärdepar, intervall, etc. Det betyder inte att du alltid ska välja Streams. Om ditt användningsfall kan uppnås med Pub/Sub, är det bättre för dig att använda Pub/Sub då. Med Streams måste du ta hand om minnesanvändning.




  1. Flask-SocketIO gör om prenumeration

  2. Finns det någon låsmekanism i Azure Redis Cache när du uppdaterar ett objekt?

  3. Kapslade arrayer i Mongoose

  4. MongoDB fungerar inte. FEL:dbpath (/data/db) finns inte.