Ответ
Для работы с 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 (для всяких событийных штук). Каждый тип — для своей задачи. Не пытайся всё запихнуть в строки, будешь потом выглядеть, как олух.
Вот так, вкратце. Начинай с этого, не накосячь с подключением, используй асинхронные вызовы — и будет тебе счастье. А там, глядишь, и до кластеров и транзакций дорастёшь. Удачи, и да прибудет с тобой низкая задержка!