Redis клиент для C# (.NET): StackExchange.Redis
В современной разработке на платформе .NET часто возникает необходимость в быстром кэшировании данных, организации очередей сообщений или управлении сессиями. Одним из лучших решений для этих задач является использование Redis — высокопроизводительного хранилища данных типа "ключ-значение". Для взаимодействия с Redis из C# (.NET) наиболее популярной и надёжной библиотекой является StackExchange.Redis.
Что такое StackExchange.Redis?
StackExchange.Redis — это клиентская библиотека с открытым исходным кодом, разработанная компанией Stack Overflow. Она предоставляет полный набор функций для работы с Redis: от простых операций GET/SET до сложных сценариев с публикацией/подпиской (Pub/Sub), транзакциями и Lua-скриптами. Библиотека оптимизирована для многопоточных приложений и поддерживает асинхронные операции, что делает её идеальным выбором для высоконагруженных сервисов на C#.
Установка
Установить библиотеку можно через NuGet Package Manager. Выполните команду в консоли диспетчера пакетов:
Install-Package StackExchange.Redis
Или через .NET CLI:
dotnet add package StackExchange.Redis
После установки вы можете подключиться к серверу Redis, используя строку подключения:
using StackExchange.Redis;
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379");
IDatabase db = redis.GetDatabase();
Основные возможности и примеры кода
1. Базовые операции с ключами
Самый распространённый сценарий — сохранение и получение значений. Пример работы со строками:
// Запись данных
db.StringSet("user:1:name", "Алексей");
db.StringSet("user:1:email", "alex@example.com");
// Чтение данных
string name = db.StringGet("user:1:name");
string email = db.StringGet("user:1:email");
Console.WriteLine($"Имя: {name}, Email: {email}");
2. Работа с хэшами
Redis поддерживает структуру данных "хэш", что удобно для хранения объектов:
// Запись хэша
HashEntry[] user = new HashEntry[]
{
new HashEntry("name", "Мария"),
new HashEntry("age", 28),
new HashEntry("city", "Москва")
};
db.HashSet("user:2", user);
// Чтение всех полей
HashEntry[] loadedUser = db.HashGetAll("user:2");
foreach (var entry in loadedUser)
{
Console.WriteLine($"{entry.Name}: {entry.Value}");
}
3. Кэширование с временем жизни
Одна из ключевых функций Redis — автоматическое удаление устаревших данных. Установите TTL (Time To Live) для ключа:
// Кэшируем данные на 10 минут
db.StringSet("cache:weather", "солнечно, +22°C", TimeSpan.FromMinutes(10));
// Проверяем время жизни
TimeSpan? ttl = db.KeyTimeToLive("cache:weather");
Console.WriteLine($"Осталось: {ttl?.TotalSeconds} секунд");
4. Публикация и подписка (Pub/Sub)
Реализуйте обмен сообщениями в реальном времени. Пример подписчика:
// Создаём подписчика
ISubscriber subscriber = redis.GetSubscriber();
subscriber.Subscribe("notifications", (channel, message) =>
{
Console.WriteLine($"Получено уведомление: {message}");
});
// Публикуем сообщение
subscriber.Publish("notifications", "Привет, мир!");
5. Транзакции
Выполнение нескольких операций атомарно:
ITransaction transaction = db.CreateTransaction();
transaction.AddCondition(Condition.KeyNotExists("counter:lock"));
transaction.StringSetAsync("counter:lock", "1");
transaction.StringIncrementAsync("counter:value");
// Фиксируем транзакцию
bool committed = transaction.Execute();
Console.WriteLine(committed ? "Транзакция выполнена" : "Отказ");
Преимущества StackExchange.Redis
- Высокая производительность — библиотека использует мультиплексирование соединений, что позволяет обрабатывать тысячи запросов в секунду.
- Асинхронность — полная поддержка async/await для неблокирующих операций.
- Поддержка кластеров — автоматическая маршрутизация запросов в кластерной конфигурации Redis.
- Безопасность — поддержка SSL/TLS и аутентификации.
- Гибкость — работа с любыми типами данных Redis: строки, списки, множества, сортированные множества, геоданные.
- Активное сооб