Hlavním důvodem, který dnes vidím jako případ použití pro memcached přes Redis, je vynikající efektivita paměti, kterou byste měli být schopni získat s plain Ukládání fragmentů HTML do mezipaměti (nebo podobné aplikace). Pokud potřebujete uložit různá pole vašich objektů do různých klíčů memcached, pak budou hashe Redis efektivnější z hlediska paměti, ale když máte velký počet párů klíč -> simple_string, memcached by vám měl být schopen poskytnout více položek za megabajt.
Další věci, které jsou na memcached dobré:
- Je to velmi jednoduchý kus kódu, takže pokud potřebujete pouze funkce, které poskytuje, je to myslím rozumná alternativa, ale nikdy jsem ji nepoužil ve výrobě.
- Je vícevláknový, takže pokud potřebujete škálovat v nastavení s jedním boxem, je to dobrá věc a potřebujete mluvit pouze s jednou instancí.
Věřím, že Redis jako mezipaměť dává stále větší smysl, když lidé přecházejí na inteligentní ukládání do mezipaměti nebo když se snaží zachovat strukturu dat uložených v mezipaměti prostřednictvím datových struktur Redis.
Porovnání mezi Redis LRU a memcached LRU.
Jak memcached, tak Redis neprovádějí skutečné vystěhování LRU, ale pouze přibližné.
Vyklizení Memcache je třída podle velikosti a závisí na podrobnostech implementace jejího slab alokátoru. Například pokud chcete přidat položku, která se hodí do dané třídy velikosti, memcached se pokusí odstranit položky, jejichž platnost vypršela / nedávno nepoužívané, místo toho, aby se pokusila o globální pokus pochopit, co je objekt, bez ohledu na jeho velikost, která je nejlepším kandidátem.
Redis se místo toho snaží vybrat dobrý objekt jako kandidáta na vystěhování, když maxmemory
je dosaženo limitu, dívá se na všechny objekty bez ohledu na třídu velikosti, ale je schopen poskytnout pouze přibližně dobrý objekt, nikoli nejlepší objekt s delší dobou nečinnosti.
Redis to dělá tak, že navzorkuje několik objektů a vybere ten, který byl nečinný (bez přístupu) po nejdelší dobu. Od Redis 3.0 (aktuálně ve verzi beta) byl algoritmus vylepšen a také přijímá skupiny dobrých kandidátů napříč vystěhováním, takže aproximace byla vylepšena. V dokumentaci Redis můžete najít popis a grafy s podrobnostmi o tom, jak to funguje.
Proč má memcached lepší paměťovou stopu než Redis pro jednoduché řetězce -> mapy řetězců.
Redis je složitější software, takže hodnoty v Redis jsou uloženy způsobem více podobným objektům v programovacím jazyce vyšší úrovně:mají přiřazený typ, kódování a počítání odkazů pro správu paměti. Díky tomu je vnitřní struktura Redis dobrá a ovladatelná, ale má režii ve srovnání s memcached, který se zabývá pouze řetězci.
Když Redis začne být efektivnější z hlediska paměti
Redis je schopen ukládat malé agregované datové typy speciálním způsobem úspory paměti. Například malý Redis Hash představující objekt není uložen interně s hashovací tabulkou, ale jako binární jedinečný blob. Takže nastavení více polí na objekt do hashe je efektivnější než ukládání N oddělených klíčů do memcached.
Ve skutečnosti můžete uložit objekt do memcached jako jeden JSON (nebo binárně kódovaný) blob, ale na rozdíl od Redis vám to nedovolí načítat nebo aktualizovat nezávislá pole.
Výhoda Redis v kontextu inteligentního ukládání do mezipaměti.
Vzhledem k datovým strukturám Redis je obvyklým vzorem používaným u memcached ničení objektů, když je mezipaměť zrušena, k jejímu pozdějšímu opětovnému vytvoření z DB, je primitivní způsob použití Redis.
Představte si například, že potřebujete uložit do mezipaměti nejnovější zprávy N zveřejněné v Hacker News, abyste naplnili sekci „Nejnovější“ webu. Co uděláte s Redis, je vzít si seznam (omezený na M položek) s vloženými nejnovějšími zprávami. Pokud pro svá data používáte jiný obchod a Redis jako mezipaměť, vyplníte obě pohledy (Redis a DB) při zaúčtování nové položky. Nedochází k žádnému zneplatnění mezipaměti.
Aplikace však může mít vždy logiku, takže pokud se zjistí, že seznam Redis je prázdný, například po spuštění, lze původní pohled znovu vytvořit z DB.
Použitím inteligentního ukládání do mezipaměti je možné provádět ukládání do mezipaměti pomocí Redis efektivněji ve srovnání s memcached, ale ne všechny problémy jsou vhodné pro tento vzor. Například ukládání fragmentů HTML do mezipaměti nemusí mít prospěch z této techniky.