В чем разница между Redis Stack и Redis?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# 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 OSS | Redis Stack |
|---|---|---|
| Основной функционал | Ключ-значение | Ключ-значение + модули |
| JSON поддержка | Нет | Да (RedisJSON) |
| Полнотекстовый поиск | Нет | Да (RediSearch) |
| Граф БД | Нет | Да (RedisGraph) |
| Временные ряды | Нет | Да (RedisTimeSeries) |
| Bloom/Cuckoo фильтры | Нет | Да (RedisBloom) |
| Machine Learning | Нет | Да (RedisAI) |
| Стоимость | Бесплатно | Commercial |
| Лицензия | GPL v3 (OSS) | Commercial |
| Поддержка | Community | Redis 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 - это расширенная платформа для более сложных сценариев: поиск, графы, временные ряды. Стоит рассмотреть если нужна дополнительная функциональность, которая иначе потребует отдельных БД или сервисов.