sql >> Database teknologi >  >> NoSQL >> Redis

Hvis redis allerede er en del af stakken, hvorfor bruges Memcached så stadig sammen med Redis?

Hovedårsagen til, at jeg i dag ser en use-case for memcached over Redis, er den overlegne hukommelseseffektivitet, du burde kunne få med plain Caching af HTML-fragmenter (eller lignende applikationer). Hvis du skal gemme forskellige felter af dine objekter i forskellige memcached nøgler, så bliver Redis hashes mere hukommelseseffektive, men når du har et stort antal nøgle -> simple_string par, burde memcached kunne give dig flere elementer pr. megabyte.

Andre ting, der er gode pointer ved memcached:

  • Det er et meget simpelt stykke kode, så hvis du bare har brug for den funktionalitet, den giver, er det vel et rimeligt alternativ, men jeg har aldrig brugt det i produktionen.
  • Den er multi-threaded, så hvis du har brug for at skalere i en enkelt-boks opsætning, er det en god ting, og du skal tale med kun én instans.

Jeg mener, at Redis som cache giver mere og mere mening, efterhånden som folk bevæger sig mod intelligent cachelagring, eller når de forsøger at bevare strukturen af ​​de cachelagrede data via Redis-datastrukturer.

Sammenligning mellem Redis LRU og memcached LRU.

Både memcached og Redis udfører ikke rigtige LRU-udsættelser, men kun en tilnærmelse af det.

Memcache-udsættelse er pr. størrelsesklasse og afhænger af implementeringsdetaljerne for dens pladeallokator. Hvis du f.eks. vil tilføje et element, der passer i en given størrelsesklasse, vil memcached forsøge at fjerne udløbne/ikke-nyligt brugte elementer i den pågældende klasse, i stedet for at prøve et globalt forsøg på at forstå, hvad objektet er, uanset dets størrelse, som er den bedste kandidat.

Redis forsøger i stedet at vælge et godt objekt som kandidat til udsættelse, når maxmemory grænsen er nået, når man ser på alle objekterne, uanset størrelsesklassen, men er kun i stand til at give et tilnærmelsesvis godt objekt, ikke det bedste objekt med den større tomgangstid.

Måden Redis gør dette på, er ved at prøve et par objekter og vælge den, der har været inaktiv (ikke tilgået) i længst tid. Siden Redis 3.0 (i øjeblikket i beta) blev algoritmen forbedret og tager også en god kandidatpulje på tværs af udsættelser, så tilnærmelsen blev forbedret. I Redis-dokumentationen kan du finde en beskrivelse og grafer med detaljer om, hvordan det fungerer.

Hvorfor memcached har et bedre hukommelsesfodaftryk end Redis til simple strenge -> strengkort.

Redis er et mere komplekst stykke software, så værdier i Redis er gemt på en måde, der ligner objekter i et programmeringssprog på højt niveau:de har tilknyttet type, kodning, referencetælling til hukommelsesstyring. Dette gør Redis interne struktur god og overskuelig, men har en overhead sammenlignet med memcached, som kun omhandler strenge.

Når Redis begynder at være mere hukommelseseffektiv

Redis er i stand til at gemme små aggregerede datatyper på en særlig hukommelsesbesparende måde. For eksempel er en lille Redis Hash, der repræsenterer et objekt, gemt internt, ikke med en hash-tabel, men som en binær unik klat. Så det er mere effektivt at angive flere felter pr. objekt i en hash end at gemme N adskilte nøgler i memcached.

Du kan faktisk gemme et objekt i memcached som en enkelt JSON (eller binært-kodet) blob, men i modsætning til Redis vil dette ikke tillade dig at hente eller opdatere uafhængige felter.

Fordelen ved Redis i forbindelse med intelligent caching.

På grund af Redis-datastrukturer er det sædvanlige mønster, der bruges med memcached, til at ødelægge objekter, når cachen er ugyldig, for at genskabe den fra DB'en senere, en primitiv måde at bruge Redis på.

Forestil dig f.eks., at du skal cache de seneste N-nyheder, der er postet i Hacker News, for at udfylde "Nyeste"-sektionen på webstedet. Hvad du gør med Redis er at tage en liste (begrænset til M elementer) med de nyeste nyheder indsat. Hvis du bruger en anden butik til dine data og Redis som en cache, er det du gør at udfylde begge visningerne (Redis og DB'en), når en ny vare er postet. Der er ingen cache-invalidering.

Applikationen kan dog altid have logik, så hvis Redis-listen viser sig at være tom, for eksempel efter en opstart, kan den indledende visning genskabes fra DB.

Ved at bruge intelligent caching er det muligt at udføre caching med Redis på en mere effektiv måde sammenlignet med memcached, men ikke alle problemerne er egnede til dette mønster. For eksempel kan cachelagring af HTML-fragmenter ikke drage fordel af denne teknik.



  1. Sådan forbinder du mongodb-klienter til lokale Meteor MongoDB

  2. HDFS-datablok – Lær det interne i Big Data Hadoop

  3. MongoDB PHP UTF-8 problemer

  4. Sammenkædning og oprettelse af MongoDB-forbindelser ved hjælp af SQL:Del 3