← Назад к вопросам

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

1.7 Middle🔥 71 комментариев
#Кэширование и NoSQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Redis vs Redis Stack: подробное сравнение

Redis и Redis Stack - это две разные продукты от компании Redis, предоставляющие разные уровни функциональности. Redis Stack - это расширенная версия Redis с дополнительными модулями.

Redis (OSS - Open Source)

Redis - это классический высокоскоростной In-Memory data store с открытым исходным кодом.

Основные структуры данных:

  • Strings (строки)
  • Lists (списки)
  • Sets (множества)
  • Sorted Sets (отсортированные множества)
  • Hashes (хеши)
  • Streams (потоки - добавлены в Redis 5.0)
  • HyperLogLog (вероятностная структура)
  • Bitmaps (битовые карты)
  • Geospatial (геопространственные индексы)

Характеристики Redis:

  • Простой ключ-значение store
  • Основан на памяти
  • Очень быстро (microseconds)
  • Поддержка TTL (expiration)
  • Pub/Sub механизм
  • Transactions (MULTI/EXEC)
  • Persistence (RDB snapshots, AOF)
  • Replication
  • Clustering

Типичное использование Redis:

// Кеширование
redisTemplate.opsForValue().set("user:123", userObject);
UserObject user = redisTemplate.opsForValue().get("user:123");

// Счетчики
redisTemplate.opsForValue().increment("pageviews:home");

// Сессии
redisTemplate.opsForHash().put("session:abc123", "userId", "user123");

// Списки очередей
redisTemplate.opsForList().leftPush("task-queue", taskJson);
String task = redisTemplate.opsForList().rightPop("task-queue");

// Publish/Subscribe
redisTemplate.convertAndSend("notifications", message);

Преимущества Redis:

  • Простота использования
  • Огромная скорость
  • Легко масштабировать
  • Большое сообщество
  • Много клиентских библиотек
  • Open source и бесплатно
  • Встроенная репликация
  • AOF persistence для надежности

Недостатки Redis:

  • Только основные структуры данных
  • Нет встроенного поиска/индексирования
  • Нет встроенных графовых операций
  • Нет JSON поддержки в основной версии
  • Ограниченные возможности для сложных запросов

Redis Stack

Redis Stack - это коммерческий продукт от Redis (бывше Redislabs), который включает Redis + набор модулей для расширенной функциональности.

Включенные модули Redis Stack:

1. RedisJSON - работа с JSON

// Redis Stack позволяет работать с JSON документами
redisTemplate.opsForJSON().set("user:123", root(), userJson);

// Запросы к JSON полям
redisTemplate.opsForJSON().get("user:123", new JSONPath("$.email"));

// Обновление вложенных полей
redisTemplate.opsForJSON().set("user:123", JSONPath("$.profile.age"), 30);

2. RediSearch - полнотекстовый поиск и индексирование

// Создание индекса
FT.CREATE idx:users ON HASH PREFIX 1 user: \
  SCHEMA name TEXT email TEXT age NUMERIC

// Полнотекстовый поиск
FT.SEARCH idx:users "@name:john*"

// Поиск по диапазону
FT.SEARCH idx:users "@age:[25 35]"

// Java клиент
search.ftSearch("idx:users", new Query("@name:john"));

3. RedisGraph - граф база данных

// Создание узлов и связей
GRAPH.QUERY mygraph 
  "CREATE (a:Person {name: 'John'}) 
           (b:Person {name: 'Jane'}) 
           (a)-[:KNOWS]->(b)"

// Запрос соседей
GRAPH.QUERY mygraph 
  "MATCH (p:Person)-[:KNOWS]->(friend) 
   WHERE p.name='John' 
   RETURN friend.name"

4. RedisTimeSeries - временные ряды (TSDB)

// Создание временного ряда для метрик
TS.CREATE temperature:living_room

// Добавление точки данных
TS.ADD temperature:living_room 1609459200 22.5
TS.ADD temperature:living_room 1609545600 23.0

// Агрегация за период
TS.RANGE temperature:living_room 1609200000 1609600000 \
  AGGREGATION avg 86400

5. RedisBloom - вероятностные структуры

// Bloom filter для быстрой проверки принадлежности
BF.ADD urls_seen "https://example.com"
BF.EXISTS urls_seen "https://example.com" // 1
BF.EXISTS urls_seen "https://unknown.com" // 0

// Cuckoo filter (лучше Bloom)
CF.ADD visited_users "user123"

// Count-Min Sketch для частот
CMS.INITBYDIM sketch 10000 5
CMS.INCRBY sketch "apple" 10
CMS.QUERY sketch "apple" // ~10

6. RedisAI - машинное обучение

// Загрузка модели
AI.CONFIG SET BACKENDS_PATH /path/to/backends
AI.MODELSCAN script:classifier.onnx

// Инференс
AI.SCRIPTEXEC script:classifier input output

Дополнительные возможности Redis Stack:

  • Встроенная поддержка SQL запросов (через модули)
  • Vector similarity search для embeddings
  • Probabilistic data structures
  • Streaming аналитика
  • Active-active geo-replication

Таблица сравнения

ПараметрRedis OSSRedis Stack
Основной функционалКлюч-значениеКлюч-значение + модули
JSON поддержкаНетДа (RedisJSON)
Полнотекстовый поискНетДа (RediSearch)
Граф БДНетДа (RedisGraph)
Временные рядыНетДа (RedisTimeSeries)
Bloom/Cuckoo фильтрыНетДа (RedisBloom)
Machine LearningНетДа (RedisAI)
СтоимостьБесплатноCommercial
ЛицензияGPL v3 (OSS)Commercial
ПоддержкаCommunityRedis Inc
ПроизводительностьОтличнаяОтличная + модули
МасштабируемостьХорошаяЛучше

Практический пример: Redis vs Redis Stack

Случай 1: Кеширование пользователей

Redis (достаточно):

@Service
public class UserCacheServiceRedis {
    @Autowired
    private RedisTemplate<String, User> redisTemplate;
    
    public void cacheUser(User user) {
        // Сохраняем User как JSON строку
        redisTemplate.opsForValue().set(
            "user:" + user.getId(), 
            user,
            Duration.ofHours(1)
        );
    }
    
    public User getUser(String userId) {
        return redisTemplate.opsForValue().get("user:" + userId);
    }
}

Redis Stack (если нужны сложные запросы):

@Service
public class UserCacheServiceStack {
    @Autowired
    private RedisTemplate<String, User> redisTemplate;
    
    public void indexUsers() {
        // Создаем индекс для поиска по email и имени
        FT.CREATE idx:users ON HASH PREFIX 1 user: \
          SCHEMA firstName TEXT lastName TEXT email TEXT age NUMERIC
    }
    
    public List<User> searchByName(String name) {
        // Полнотекстовый поиск
        return search.ftSearch("idx:users", 
            new Query("@firstName:" + name + "*")).getDocuments();
    }
    
    public List<User> findByAgeRange(int minAge, int maxAge) {
        // Поиск по диапазону
        return search.ftSearch("idx:users", 
            new Query("@age:[" + minAge + " " + maxAge + "]")).getDocuments();
    }
}

Случай 2: Хранение метрик и логов

Redis (сложнее):

// Нужно вручную реализовать агрегацию и запросы
redisTemplate.opsForZSet().add("metrics:cpu", value, timestamp);
// Вручную обрабатываем диапазоны
Set<ZSetOperations.TypedTuple<Double>> data = 
    redisTemplate.opsForZSet().rangeByScoreWithScores("metrics:cpu", 
        startTime, endTime);
// Вручную агрегируем
Double avg = data.stream().mapToDouble(TypedTuple::getScore).average().orElse(0);

Redis Stack (идеально):

// RedisTimeSeries встроенно
TS.CREATE cpu:metrics LABELS host=server1
TS.ADD cpu:metrics timestamp value

// Агрегация встроенная
TS.RANGE cpu:metrics 
  (now - 1h) now 
  AGGREGATION avg 300 // Average по 5 минут

Случай 3: Граф связей пользователей

Redis (очень сложно):

// Нужно вручную хранить связи
redisTemplate.opsForSet().add("user:123:friends", "user456");
redisTemplate.opsForSet().add("user:456:friends", "user789");

// Поиск друзей друзей - вручную 2 запроса
Set<String> friends = redisTemplate.opsForSet().members("user:123:friends");
for (String friend : friends) {
    Set<String> friendsOfFriend = redisTemplate.opsForSet()
        .members("user:" + friend + ":friends");
    // Вручную обрабатываем
}

Redis Stack с RedisGraph:

// MATCH (u:User {id: 123})-[:FRIEND]->()-[:FRIEND]->(foaf)
// RETURN foaf
// Один запрос вместо O(n) запросов!

graph.query("MATCH (u:User {id: $id})-[:FRIEND]->()-[:FRIEND]->(foaf) "
    + "RETURN foaf.name", 
    Map.of("id", 123));

Когда использовать Redis

Используй Redis (OSS) когда:

  • Простое кеширование
  • Сессии
  • Очереди задач
  • Pub/Sub система
  • Счетчики и рейтинг
  • Списки и множества
  • Ограниченный бюджет
  • Собственный хостинг

Используй Redis Stack когда:

  • Нужен полнотекстовый поиск
  • Граф данных и связи
  • Временные ряды и метрики
  • JSON документы с индексированием
  • Machine learning модели
  • Сложные запросы
  • Требуется Enterprise поддержка
  • Готовы платить за расширенный функционал

Гибридный подход

// Используем Redis для простого кеширования
@Cacheable("users")
public User getUser(String id) { ... }

// Используем Redis Stack для поиска
public List<User> searchUsers(String query) {
    return redisSearch.search(query);
}

// Используем Redis для очередей
public void queueTask(Task task) {
    redisTemplate.opsForList().leftPush("tasks", task);
}

Заключение

Redis - это универсальный инструмент для кеширования и высокоскоростного хранения данных. Отличное решение для 80% use cases.

Redis Stack - это расширенная платформа для более сложных сценариев: поиск, графы, временные ряды. Стоит рассмотреть если нужна дополнительная функциональность, которая иначе потребует отдельных БД или сервисов.