Memcached vs. Redis – More Different Than You Would Expect
Looks like this article got one bit of updated information but missed everything else... I'll address some things point by point:<p>data structures: - yes, fewer datastructures, if any. The point isn't that they have the features or not, but that memcached is a distributed system _first_, so any feature has to make sense in that context.<p>"Redis is better supported, updated more often. (or maybe memcached is "finished" or has a narrower scope?)" - I've been cutting monthly releases for like 5 years now (mind the pandemic gap). Sigh.<p>Memory organization: This is mostly accurate but missing some major points. The <i>sizes</i> of the slab classes doesn't change, but slabs pages can and do get re-assigned automatically. If you assign all memory to the 1MB page class, then empty that class, memory will go back to a global pool to get re-assigned. There are edge cases but it isn't static and hasn't been for ten years.<p>Item size limit: The max slab size has actually been 512k internally for a long time now, despite the item limit being 1mb. Why? Because "large" items are stitched together from smaller slab chunks. Setting a 2mb or 10mb limit is fine in most use cases, but again there are edge cases, especially for very small memory limits. Usually large items aren't combined with small memory limits.<p>You can also _reduce the slab class overhead_ (which doesn't typically exceed 5-10%), by lowering the "slab_chunk_max" option, which puts the slab classes closer together at the expense of stitching items larger than this class. IE; if all of your objects are 16kb or less, you can freely set this limit to 16kb and reduce your slab class overhead. I'd love to make this automatic or at least reduce the defaults.<p>LRU: looks like the author did notice the blog post (<a href="https://memcached.org/blog/modern-lru/" rel="nofollow">https://memcached.org/blog/modern-lru/</a>) - I'll add that the LRU bumping (mutex contention) is completely removed from the _access path_. This is why it scales to 48 threads. The LRU crawler is not necessary to expire items, there is also a specific thread that does the LRU balancing.<p>The LRU crawler is used to proactively expire items. It is highly efficient since it independently scans slab classes; the more memory an object uses the fewer neighbors it has, and it schedules when to run on each slab class, so it can "Focus" on areas with higest return.<p>Most of the thread scalability is pretty old; not just since 2020.<p>Also worth noting memcached has an efficient flash backed storage system: <a href="https://memcached.org/blog/nvm-caching/" rel="nofollow">https://memcached.org/blog/nvm-caching/</a> - requires RAM to keep track of keys, but can put value data on disk. With this tradeoff we can use flash devices without burning them out, as non-get/non-set operations do not touch the SSD (ie; delete removes from memory, but doesn't cause a write). Many very huge installations of this exist.<p>I've also been working on an internal proxy which is nearing production-readiness for an early featureset: <a href="https://github.com/memcached/memcached/issues/827" rel="nofollow">https://github.com/memcached/memcached/issues/827</a> - scriptable in lua, will have lots of useful features.