sql >> Databasteknik >  >> NoSQL >> Redis

Om redis redan är en del av stacken, varför används Memcached fortfarande tillsammans med Redis?

Den främsta anledningen till att jag ser idag som ett användningsfall för memcachad över Redis är den överlägsna minneseffektiviteten du borde kunna få med vanlig HTML-fragment cachning (eller liknande applikationer). Om du behöver lagra olika fält av dina objekt i olika memcachade nycklar, så kommer Redis-haschar att bli mer minneseffektiva, men när du har ett stort antal nyckel -> simple_string-par bör memcached kunna ge dig fler objekt pr. megabyte.

Andra saker som är bra med memcached:

  • Det är en väldigt enkel kod, så om du bara behöver den funktionalitet som den ger är det ett rimligt alternativ antar jag, men jag har aldrig använt det i produktionen.
  • Den är flertrådad, så om du behöver skala i en enkelbox-inställning är det bra och du behöver bara prata med en instans.

Jag tror att Redis som cache blir mer och mer vettigt när människor går mot intelligent cachelagring eller när de försöker bevara strukturen för cachelagrade data via Redis datastrukturer.

Jämförelse mellan Redis LRU och memcachad LRU.

Både memcached och Redis utför inte riktiga LRU-vräkningar, utan bara en uppskattning av det.

Memcachevräkning är per storleksklass och beror på implementeringsdetaljerna för dess skivfördelare. Om du till exempel vill lägga till ett objekt som passar i en given storleksklass, kommer memcached att försöka ta bort utgångna/inte-nyligen använda objekt i den klassen, istället för att försöka ett globalt försök att förstå vad som är objektet, oavsett dess storlek, vilket är den bästa kandidaten.

Redis försöker istället välja ett bra objekt som kandidat för vräkning när maxmemory gränsen nås, tittar på alla objekt, oavsett storleksklass, men kan bara ge ett ungefär bra objekt, inte det bästa objektet med den längre vilotiden.

Sättet Redis gör detta på är genom att sampla några objekt, välja det som var ledigt (inte åtkomligt) under längst tid. Sedan Redis 3.0 (för närvarande i beta) har algoritmen förbättrats och tar även en god kandidatpool över vräkningar, så approximationen förbättrades. I Redis-dokumentationen kan du hitta en beskrivning och grafer med detaljer om hur det fungerar.

Varför memcached har ett bättre minnesfotavtryck än Redis för enkla strängkartor -> strängkartor.

Redis är en mer komplex mjukvara, så värden i Redis lagras på ett sätt som mer liknar objekt i ett programmeringsspråk på hög nivå:de har tillhörande typ, kodning, referensräkning för minneshantering. Detta gör Redis interna struktur bra och hanterbar, men har en overhead jämfört med memcached som bara hanterar strängar.

När Redis börjar bli mer minneseffektiv

Redis kan lagra små samlade datatyper på ett speciellt minnessparande sätt. Till exempel en liten Redis Hash som representerar ett objekt, lagras internt inte med en hashtabell, utan som en binär unik blob. Så att ställa in flera fält per objekt i en hash är mer effektivt än att lagra N separerade nycklar i memcached.

Du kan faktiskt lagra ett objekt i memcachad som en enda JSON (eller binärkodad) blob, men i motsats till Redis kommer detta inte att tillåta dig att hämta eller uppdatera oberoende fält.

Fördelen med Redis i samband med intelligent cachning.

På grund av Redis datastrukturer är det vanliga mönstret som används med memcached för att förstöra objekt när cachen är ogiltig, för att återskapa den från DB senare, ett primitivt sätt att använda Redis.

Föreställ dig till exempel att du måste cachelagra de senaste N-nyheterna som lagts upp i Hacker News för att kunna fylla den "nyaste" delen av webbplatsen. Vad du gör med Redis är att ta en lista (begränsad till M objekt) med de senaste nyheterna infogade. Om du använder en annan butik för din data, och Redis som en cache, är det du gör att fylla i båda åsikterna (Redis och DB) när en ny post läggs upp. Det finns ingen cacheminne.

Applikationen kan dock alltid ha logik så att om Redis-listan visar sig vara tom, till exempel efter en uppstart, kan den initiala vyn återskapas från DB.

Genom att använda intelligent cachning är det möjligt att utföra cachning med Redis på ett mer effektivt sätt jämfört med memcached, men alla problem är inte lämpliga för detta mönster. Till exempel kan cachelagring av HTML-fragment inte dra nytta av denna teknik.



  1. Fjäderdata åsidosätter förinställd serialiserare

  2. C#-drivrutin för MongoDb:hur använder man limit+count?

  3. HBase-uppgradering ovanpå Event Sourcing och CQRS-arkitektur på 3 veckor

  4. Hur hanterar Redis Streams att använda allt tillgängligt minne?