В чём разница между Redis и Memcached?

«В чём разница между Redis и Memcached?» — вопрос из категории Базы данных, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Redis и Memcached — это высокопроизводительные in-memory хранилища данных (кэши), но с фундаментальными различиями в архитектуре и возможностях.

Ключевые различия

Критерий Redis Memcached
Типы данных Богатый набор: строки, списки, множества, хеши, сортированные множества, битовые массивы, HyperLogLog, потоки. Только строки и целые числа.
Персистентность Поддерживает снимки (RDB) и журнал операций (AOF) для записи данных на диск. Данные хранятся только в оперативной памяти, при перезапуске теряются.
Кластеризация Встроенная поддержка репликации (master-slave) и кластеризации (Redis Cluster) для распределения данных. Нет встроенной кластеризации; распределение реализуется на стороне клиента (consistent hashing).
Производительность Очень высокая, но в чисто кэш-сценариях может немного уступать Memcached из-за накладных расходов на сложные структуры и персистентность. Максимально оптимизирован для простого кэширования ключ-значение, часто показывает наивысшую скорость.
Доп. возможности Pub/Sub, транзакции (MULTI/EXEC), Lua-скрипты, TTL с миллисекундной точностью, геопространственные индексы. Многопоточная архитектура, эффективное использование памяти для простых объектов.

Практический выбор

  • Выбирайте Redis, если нужны: сложные структуры данных, персистентность, репликация, дополнительные функции (Pub/Sub, транзакции). Это полноценное хранилище данных.
  • Выбирайте Memcached, если нужен: максимально быстрый и простой распределённый кэш для объектов среднего размера (например, результатов SQL-запросов, сессий).

Пример кода на C# (StackExchange.Redis / EnyimMemcached)

// Redis
using StackExchange.Redis;
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
IDatabase db = redis.GetDatabase();
await db.StringSetAsync("user:1:name", "Alice");
string name = await db.StringGetAsync("user:1:name");

// Memcached
using Enyim.Caching;
using Enyim.Caching.Memcached;
MemcachedClient client = new MemcachedClient();
client.Store(StoreMode.Set, "session:abc123", userData);
var data = client.Get<SessionData>("session:abc123");