De belangrijkste reden die ik vandaag zie als een use-case voor memcached via Redis, is de superieure geheugenefficiëntie die je zou moeten kunnen krijgen met plain HTML-fragmenten cachen (of vergelijkbare toepassingen). Als je verschillende velden van je objecten in verschillende memcached-sleutels moet opslaan, dan zullen Redis-hashes geheugenefficiënter zijn, maar als je een groot aantal key -> simple_string-paren hebt, zou memcached je meer items per megabyte.
Andere dingen die goede punten zijn over memcached:
- Het is een heel eenvoudig stukje code, dus als je alleen de functionaliteit nodig hebt die het biedt, is het een redelijk alternatief denk ik, maar ik heb het nooit in productie gebruikt.
- Het is multi-threaded, dus als je moet schalen in een single-box setup, is dat een goede zaak en hoef je maar met één instantie te praten.
Ik geloof dat Redis als cache steeds logischer wordt naarmate mensen op weg zijn naar intelligente caching of wanneer ze proberen de structuur van de gegevens in de cache te behouden via Redis-gegevensstructuren.
Vergelijking tussen Redis LRU en memcached LRU.
Zowel memcached als Redis voeren geen echte LRU-uitzettingen uit, maar slechts een benadering daarvan.
Memcache-uitzetting is per grootteklasse en is afhankelijk van de implementatiedetails van de plaattoewijzer. Als je bijvoorbeeld een item wilt toevoegen dat in een bepaalde grootteklasse past, zal memcached proberen om verlopen / niet-recent gebruikte items in die klasse te verwijderen, in plaats daarvan een globale poging te doen om te begrijpen wat het object is, ongeacht zijn maat, wat de beste kandidaat is.
Redis probeert in plaats daarvan een goed object te kiezen als kandidaat voor ontruiming wanneer de maxmemory
limiet is bereikt, kijkend naar alle objecten, ongeacht de grootteklasse, maar kan alleen een ongeveer goed object leveren, niet het beste object met de grotere inactieve tijd.
De manier waarop Redis dit doet, is door een paar objecten te samplen en degene te kiezen die het langst inactief was (niet toegankelijk). Sinds Redis 3.0 (momenteel in bèta) is het algoritme verbeterd en zijn er ook goede kandidaten voor uitzettingen, dus de benadering is verbeterd. In de Redis-documentatie vindt u een beschrijving en grafieken met details over hoe het werkt.
Waarom memcached een betere geheugenvoetafdruk heeft dan Redis voor eenvoudige string -> string-maps.
Redis is een complexer stuk software, dus waarden in Redis worden opgeslagen op een manier die meer lijkt op objecten in een programmeertaal op hoog niveau:ze hebben een bijbehorend type, codering en referentietelling voor geheugenbeheer. Dit maakt de interne structuur van Redis goed en beheersbaar, maar heeft een overhead in vergelijking met memcached die alleen strings behandelt.
Wanneer Redis geheugenefficiënter begint te worden
Redis is in staat om kleine geaggregeerde datatypes op een speciale geheugenbesparende manier op te slaan. Een kleine Redis Hash die een object vertegenwoordigt, wordt bijvoorbeeld intern niet opgeslagen met een hashtabel, maar als een binaire unieke blob. Dus het instellen van meerdere velden per object in een hash is efficiënter dan het opslaan van N gescheiden sleutels in memcached.
Je kunt een object eigenlijk in memcached opslaan als een enkele JSON (of binair gecodeerde) blob, maar in tegenstelling tot Redis kun je hiermee geen onafhankelijke velden ophalen of bijwerken.
Het voordeel van Redis in de context van intelligent caching.
Vanwege Redis-gegevensstructuren is het gebruikelijke patroon dat wordt gebruikt met memcached om objecten te vernietigen wanneer de cache ongeldig is, om deze later opnieuw uit de DB te maken, een primitieve manier om Redis te gebruiken.
Stel je bijvoorbeeld voor dat je het laatste N-nieuws dat in Hacker News is gepost, moet cachen om het "Nieuwste" gedeelte van de site te vullen. Wat u met Redis doet, is een lijst maken (afgetopt tot M-items) met het nieuwste nieuws erin. Als u een andere winkel voor uw gegevens gebruikt en Redis als cache, moet u beide invullen de weergaven (Redis en de DB) wanneer een nieuw item wordt geplaatst. Er is geen cache-invalidatie.
De toepassing kan echter altijd logica hebben, zodat als de Redis-lijst leeg blijkt te zijn, bijvoorbeeld na een opstart, de initiële weergave opnieuw kan worden gemaakt vanuit de DB.
Door intelligent caching te gebruiken is het mogelijk om caching met Redis op een efficiëntere manier uit te voeren in vergelijking met memcached, maar niet alle problemen zijn geschikt voor dit patroon. Het cachen van HTML-fragmenten kan bijvoorbeeld niet profiteren van deze techniek.