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

Что хранит Redis?

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

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Типы данных и структуры хранения в Redis

Redis (Remote Dictionary Server) — это **in-memory структура хранения данных типа "ключ-значение"**, которая поддерживает сложные структуры данных, а не просто строки. Основное отличие от обычных key-value хранилищ в том, что Redis работает с **структурированными значениями**.

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

  1. Strings (Строки) - базовый тип данных

    // Пример в C# с использованием StackExchange.Redis
    IDatabase db = redis.GetDatabase();
    db.StringSet("user:1000:name", "Иван Иванов");
    string name = db.StringGet("user:1000:name");
    
  2. Lists (Списки) - упорядоченные коллекции строк

    // Добавление в список
    db.ListRightPush("tasks:queue", "Обработать заказ");
    db.ListRightPush("tasks:queue", "Отправить уведомление");
    
    // Получение элементов
    RedisValue[] tasks = db.ListRange("tasks:queue", 0, -1);
    
  3. Sets (Множества) - неупорядоченные коллекции уникальных строк

    // Добавление элементов в множество
    db.SetAdd("online:users", "user:1000");
    db.SetAdd("online:users", "user:1001");
    
    // Проверка принадлежности
    bool isOnline = db.SetContains("online:users", "user:1000");
    
  4. Sorted Sets (Упорядоченные множества) - множества с весами (scores)

    // Рейтинг игроков
    db.SortedSetAdd("leaderboard", "player:1", 1500);
    db.SortedSetAdd("leaderboard", "player:2", 1800);
    
    // Получение топ-10 игроков
    var topPlayers = db.SortedSetRangeByRankWithScores("leaderboard", 0, 9, Order.Descending);
    
  5. Hashes (Хэши) - карты полей и значений

    // Хранение объекта пользователя
    HashEntry[] userData = {
        new HashEntry("name", "Иван Иванов"),
        new HashEntry("email", "ivan@example.com"),
        new HashEntry("age", "30")
    };
    db.HashSet("user:1000", userData);
    
  6. Bitmaps (Битовые карты) - манипуляции с битами

    // Статистика посещений за день
    db.StringSetBit("visits:2024-01-15", 100, true);
    int totalVisits = (int)db.StringBitCount("visits:2024-01-15");
    
  7. HyperLogLogs - вероятностная структура для подсчета уникальных элементов

    // Подсчет уникальных посетителей
    db.HyperLogLogAdd("unique:visitors:day", "192.168.1.1");
    db.HyperLogLogAdd("unique:visitors:day", "192.168.1.2");
    long count = db.HyperLogLogLength("unique:visitors:day");
    
  8. Streams (Потоки) - для реализации логов и очередей сообщений

    // Добавление сообщения в поток
    var messageId = db.StreamAdd("notifications:stream", 
        new NameValueEntry[] {
            new NameValueEntry("type", "email"),
            new NameValueEntry("recipient", "user@example.com")
        });
    

Особенности хранения данных

In-Memory природа:

  • Все данные хранятся в оперативной памяти для максимальной скорости доступа (микросекундные задержки)
  • Поддержка persistence через RDB (снимки) и AOF (лог операций)
  • Возможность настройки политик вытеснения (LRU, LFU, random)

Atomicity и транзакции:

// Атомарные операции
db.StringIncrement("page:views:counter");
db.StringDecrement("inventory:item:1000");

// Транзакции
ITransaction transaction = db.CreateTransaction();
transaction.StringSetAsync("key1", "value1");
transaction.StringSetAsync("key2", "value2");
bool committed = transaction.Execute();

Ключевые паттерны использования:

  • Кэширование - наиболее распространенный use case

    // Кэширование результата сложного запроса
    string cacheKey = $"products:category:{categoryId}";
    string cachedData = db.StringGet(cacheKey);
    
    if (cachedData == null)
    {
        var data = GetProductsFromDatabase(categoryId);
        db.StringSet(cacheKey, JsonConvert.SerializeObject(data), TimeSpan.FromMinutes(5));
    }
    
  • Сессии - хранение сессионных данных пользователей

  • Очереди сообщений - через Lists или Streams

  • Рейтинги и лидерборды - через Sorted Sets

  • Геопространственные данные - через Geo команды (основаны на Sorted Sets)

  • Блокировки и синхронизация - через SETNX команды

Практические аспекты для Backend разработки

Сериализация данных:

// Пример сериализации объектов
public class UserSession
{
    public int UserId { get; set; }
    public string Username { get; set; }
    public DateTime LastActivity { get; set; }
}

// Сохранение
var session = new UserSession { UserId = 1000, Username = "ivanov" };
db.StringSet($"session:{sessionId}", 
    JsonConvert.SerializeObject(session), 
    TimeSpan.FromHours(2));

// Получение
var json = db.StringGet($"session:{sessionId}");
var restoredSession = JsonConvert.DeserializeObject<UserSession>(json);

Производительность и оптимизация:

  • Использование pipeline для группировки команд
  • Применение Lua-скриптов для сложных атомарных операций
  • Правильный выбор структур данных под конкретные задачи

Redis является универсальным инструментом в арсенале backend-разработчика, который выходит за рамки простого кэширования, предоставляя богатый набор структур данных для решения разнообразных задач — от простого хранения строк до сложных систем реального времени с миллионами операций в секунду.

Что хранит Redis? | PrepBro