Приведи пример работы с Redis на C#.

Ответ

Для работы с Redis в C# чаще всего используется клиентская библиотека StackExchange.Redis. Ниже приведён базовый пример подключения и операций.

using StackExchange.Redis;
using System;

class RedisExample
{
    static void Main()
    {
        // 1. Установка соединения (синглтон на всё приложение)
        ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379");
        IDatabase db = redis.GetDatabase();

        // 2. Операции со строковыми значениями (String)
        bool setSuccess = db.StringSet("myKey", "Hello, Redis!");
        string cachedValue = db.StringGet("myKey");
        Console.WriteLine($"StringGet: {cachedValue}"); // Hello, Redis!

        // 3. Работа с хешами (Hash) для хранения объектов
        db.HashSet("user:1000", new HashEntry[] 
        {
            new HashEntry("name", "Alice"),
            new HashEntry("email", "alice@example.com"),
            new HashEntry("score", 1250)
        });

        string userName = db.HashGet("user:1000", "name");
        Console.WriteLine($"HashGet name: {userName}"); // Alice

        // 4. Установка времени жизни ключа (TTL)
        db.KeyExpire("myKey", TimeSpan.FromMinutes(5));
    }
}

Практические рекомендации:

  • ConnectionMultiplexer — потокобезопасный и предназначен для многократного использования. Создавайте один экземпляр и используйте его на протяжении всего жизненного цикла приложения.
  • Асинхронные методы (например, StringSetAsync, StringGetAsync) предпочтительны для неблокирующих операций в веб-приложениях.
  • Все данные в Redis хранятся в виде байтовых строк. Библиотека автоматически сериализует строки и числа, но для сложных объектов потребуется ручная сериализация (например, в JSON).
  • Для структурированного хранения данных, помимо String и Hash, Redis предоставляет типы List, Set, Sorted Set и Stream.

Ответ 18+ 🔞

Ну, вот смотри, как обычно бывает: сидишь ты такой, пишешь на C#, и вдруг понимаешь, что тебе нужен кэш или какая-нибудь быстрая штука для данных. Все вокруг орут: «Redis, Redis!». А ты думаешь: «И что это за зверь такой?». А это, оказывается, такая штука, которая данные в памяти держит, и работает, блядь, быстрее, чем ты успеваешь моргнуть.

Ладно, не буду тебя грузить теорией. Берёшь библиотеку StackExchange.Redis — это, можно сказать, стандарт де-факто. Все её используют, и не просто так. Сейчас на пальцах покажу, как с ней не облажаться.

Первое и главное — подключение. Тут важно не накосячить с самого начала.

using StackExchange.Redis;
using System;

class RedisExample
{
    static void Main()
    {
        // 1. Подключаемся к нашему Redis. Обычно он на localhost:6379 торчит.
        ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379");
        IDatabase db = redis.GetDatabase();

Вот этот ConnectionMultiplexer — это твой главный друг и враг одновременно. Запомни раз и навсегда: создаёшь его ОДИН РАЗ на всё приложение и таскаешь за собой, как любимую тапку. Он потокобезопасный, умный, но если ты начнёшь плодить их, как сумасшедший, то Redis тебе такого наговорит... В общем, соединения кончатся, и будет тебе писец, а не производительность.

Дальше, работа с данными. Самый простой тип — строка. Положил, достал.

        // 2. Кладём и достаём простые строки.
        bool setSuccess = db.StringSet("myKey", "Hello, Redis!");
        string cachedValue = db.StringGet("myKey");
        Console.WriteLine($"StringGet: {cachedValue}"); // Выведет: Hello, Redis!

Всё просто, да? Но Redis же не для строк одних. Вот, например, нужно сохранить данные пользователя — имя, почту, там, счёт какой-нибудь. Для этого есть хеши. Очень удобная штука, прямо как маленький словарик внутри ключа.

        // 3. Работаем с хешами. Идеально для объектов.
        db.HashSet("user:1000", new HashEntry[] 
        {
            new HashEntry("name", "Alice"),
            new HashEntry("email", "alice@example.com"),
            new HashEntry("score", 1250)
        });

        string userName = db.HashGet("user:1000", "name");
        Console.WriteLine($"HashGet name: {userName}"); // Alice

Видишь? Мы создали ключ user:1000, а внутри него поля. Красота! Не нужно городить кучу отдельных ключей, всё аккуратно лежит в одном месте.

А теперь важный момент — время жизни. Данные в Redis не должны висеть вечно, как проклятие. Иначе память кончится, и он тебе всё выгрузит в своп, а потом будет тормозить, как черепаха в патоках. Ставим TTL (Time To Live).

        // 4. Ставим ключу время жизни — 5 минут, и он самоуничтожится.
        db.KeyExpire("myKey", TimeSpan.FromMinutes(5));
    }
}

Вот, собственно, и основа. Но это цветочки, чувак. Ягодки начинаются, когда ты лезешь в асинхронность.

Практические советы, которые сэкономят тебе кучу нервов:

  • Про ConnectionMultiplexer я уже сказал. Один. На всё приложение. Запомни это, как «Отче наш».
  • Асинхронные методы — твои лучшие друзья в веб-приложениях. Вместо StringSet и StringGet используй StringSetAsync и StringGetAsync. Не блокируй потоки, дай им дышать. Иначе под нагрузкой твое приложение ляжет и будет лежать, как бревно.
  • Redis всё хранит как байты. Строки и числа библиотека сама преобразует. Но если ты захочешь запихнуть туда целый объект своего класса SuperPuperUser, то получишь ошибку. Тебе его нужно сначала сериализовать, например, в JSON, и уже этот JSON класть как строку. А когда достаёшь — обратно десериализовать. Стандартная история.
  • Типов данных там, блядь, больше, чем ты думаешь. Помимо String и Hash, есть ещё List (списки), Set (множества), Sorted Set (упорядоченные множества — офигенная штука для рейтингов) и Stream (для всяких событийных штук). Каждый тип — для своей задачи. Не пытайся всё запихнуть в строки, будешь потом выглядеть, как олух.

Вот так, вкратце. Начинай с этого, не накосячь с подключением, используй асинхронные вызовы — и будет тебе счастье. А там, глядишь, и до кластеров и транзакций дорастёшь. Удачи, и да прибудет с тобой низкая задержка!