Системный администратор рано или поздно слышит: «нам нужен кэш». Рука тянется к Redis — привычно, богато возможностями, работает. Заходишь на сайт — а там про Redis Iris и контекст для AI-приложений. Ладно, компания хочет зарабатывать. Деплоишь Redis, отдаёшь строку подключения, и живёшь спокойно.
Через несколько месяцев выясняется, что cache.set("key", "value") оказался проще, чем INSERT INTO table. Разработчики начинают относиться к Remote Dictionary Server как к постоянному хранилищу, как к базе данных. Ты об этом не знаешь, коллеги из эксплуатации — тоже, алерты молчат. Всё вскрывается, когда ты делаешь что-то с Redis: обновляешь, переезжаешь на другой узел, или кот нажимает eject на лотке RAID0. Проблема не в том, что в Redis нет персистентности — проблема в том, что его затащили как кэш, а используют как БД. К этому моменту Redis уже так врос в приложение, что выпилить невозможно — остаётся вечно холить его как питомца.
Теперь про memcached. Заходишь на сайт — первая же строка: «Free & open source, high-performance, distributed memory object caching system». И код примеров. Симпатичные маскоты. Memcached — тоже кэш, похож на Redis. Например, Django поддерживает подключаемые кэш-бэкенды. Почему сейчас я всегда выбираю memcached?
Вот причины. Пережить downtime с memcached невероятно просто: клиентские библиотеки по умолчанию игнорируют ошибки соединения. Если сервер упал, get просто вернёт None. Кластеризация решена гениально: её нет. Чтобы «кластеризовать», ты даёшь клиенту список URL, и он выбирает узел хешированием ключа. Если нода падает, клиент убирает её из хеша, а через время автоматически пробует переподключиться. Memcached вообще не сохраняет данные на диск — это идеальный stateless-сервис, который можно перезапустить где угодно.
Всё это можно сделать и с Redis, но архитектура memcached изначально подталкивает к правильному использованию. С операционной точки зрения он гораздо проще. Плюс — memcached очень лёгкий: хоть десяток инстансов по ~64 МБ кэша без особого оверхеда. Поэтому если мне нужен кэш, я беру memcached.
И да, часто проблема «база данных тормозит» на самом деле проблема «запрос тормозит» или «нет индексов». Помогайте разработчикам оптимизировать запросы — это добрее, чем плодить кэши. А если интересно, как устроен memcached, в его блоге есть пост «How Long Does That Response Take… For Real?» — вышел как раз в мае.