Memcached is trivial to start and unforgiving in production: the defaults hand you a cache that partitions memory by item size, forgets everything on restart, and answers to anyone who can reach the port.
The basics work. Until one slab class fills while bytes/limit_maxbytes still reads 60% and the global number swears there is room — because memory is partitioned by item size, not shared. Until a deploy changes an object's serialized size and pages stay locked to the old size class while the new one starves and evicts. Until the process restarts and every item is gone at once — there is no persistence — the hit ratio falls to zero, and every miss stampedes the backend. Until curr_connections reaches -c, accepting_conns flips to 0, and clients are refused while CPU and memory look fine. Until someone, or something, sends a single unauthenticated flush_all and the whole cache evaporates.
These guides are written for engineers who already run Memcached, not for people learning what a cache is. The goal is the mental model of how the daemon actually behaves under load — the slab allocator, the per-class segmented LRU, the per-thread worker model — plus the failure patterns that keep recurring, the monitoring story that catches them before they page anyone, and the runbooks you wish someone had handed you before your last incident.