sql >> Databasteknik >  >> NoSQL >> Redis

Hur uppnår Redis den höga genomströmningen och prestandan?

Det finns en mängd information i Redis-dokumentationen för att förstå hur det fungerar. Nu, för att specifikt svara på dina frågor:

1) Hur upprätthålls anslutningarna?

Anslutningar underhålls och hanteras med hjälp av ae-händelseloopen (designad av Redis-författaren). Alla nätverks I/O-operationer är icke-blockerande. Du kan se ae som en minimalistisk implementering som använder plattformens bästa nätverks-I/O-demultiplexeringsmekanism (epoll för Linux, kqueue för BSD, etc ...) precis som libevent, libev, libuv, etc ...

2) Är anslutningar TCP eller HTTP?

Anslutningar är TCP som använder Redis-protokollet, som är ett enkelt telnet-kompatibelt, textorienterat protokoll som stöder binär data. Detta protokoll är vanligtvis mer effektivt än HTTP.

3) Hur hanteras minnet?

Minnet hanteras genom att förlita sig på en allmän minnesallokator. På vissa plattformar är detta faktiskt systemets minnesallokator. På vissa andra plattformar (inklusive Linux) har jemalloc valts eftersom det erbjuder en bra balans mellan CPU-förbrukning, samtidighetsstöd, fragmentering och minnesfotavtryck. jemalloc källkod är en del av Redis-distributionen.

I motsats till andra produkter (som memcached) finns det ingen implementering av en plattfördelare i Redis.

Ett antal optimerade datastrukturer har implementerats ovanpå allokatorn för allmänna ändamål för att minska minnesavtrycket.

4) Vilka synkroniseringstekniker används för att uppnå hög genomströmning trots konkurrerande läsning/skrivning?

Redis är en entrådad händelseslinga, så det finns ingen synkronisering att göra eftersom alla kommandon är serialiserade. Nu körs även vissa trådar i bakgrunden för interna ändamål. I de sällsynta fallen kommer de åt data som hanteras av huvudtråden, klassiska pthread-synkroniseringsprimitiver används (mutexar till exempel). Men 100 % av dataåtkomsterna som görs på uppdrag av flera klientanslutningar kräver ingen synkronisering.

Du kan hitta mer information där:Redis är enkeltrådad, hur gör den då samtidig I/O?

Vad är skillnaden mellan en vanlig vaniljimplementering av en maskin med minnescache och server som kan svara på kommandon och en Redis-box?

Det är ingen skillnad. Redis är en vanlig vaniljimplementering av en maskin med minnescache och server som kan svara på kommandon. Men det är en implementering som görs rätt:

  • med den entrådade händelseloopmodellen
  • med enkla och minimalistiska datastrukturer optimerade för deras motsvarande användningsfall
  • erbjuder en uppsättning kommandon noggrant utvalda för att balansera minimalism och användbarhet
  • ständigt inriktat på det bästa råa resultatet
  • väl anpassad till moderna OS-mekanismer
  • att tillhandahålla flera uthållighetsmekanismer eftersom "en storlek passar alla" är bara en dröm.
  • tillhandahåller byggstenarna för HA-mekanismer (t.ex. replikeringssystem)
  • undvika att stapla upp värdelösa abstraktionslager som pannkakor
  • som resulterar i en ren och begriplig kodbas som alla bra C-utvecklare kan vara bekväma med



  1. Varför kan inte mitt Redis Lua-skript atomiskt uppdatera nycklar på olika Redis Cluster-noder?

  2. gruppera efter datum i mongodb

  3. Twisted:varför är det så att om du skickar en uppskjuten återuppringning till en uppskjuten tråd så blockeras tråden helt plötsligt?

  4. Ska jag alltid använda pipelining när det finns mer än 1 kommando i Redis?