Redis клиент для C# (.NET): StackExchange.Redis
В современной разработке на платформе .NET часто возникает необходимость использования высокопроизводительных кэширующих систем и брокеров сообщений. Одним из самых популярных решений является Redis — in-memory хранилище данных, работающее по принципу «ключ-значение». Для взаимодействия с Redis из C# (.NET) существует проверенная и мощная библиотека StackExchange.Redis. Она разработана компанией Stack Exchange (авторы Stack Overflow) и поддерживает все основные возможности Redis, включая кластеризацию, репликацию и Pub/Sub.
Что такое StackExchange.Redis?
StackExchange.Redis — это высокопроизводительный, асинхронный клиент для Redis, написанный на C#. Библиотека оптимизирована для работы с большим количеством одновременных подключений и поддерживает мультиплексирование — одно соединение может обслуживать множество параллельных запросов без блокировок. Это делает её идеальным выбором для высоконагруженных приложений на .NET Core, .NET 5/6/7/8 и .NET Framework.
Установка библиотеки
Установка StackExchange.Redis выполняется через NuGet Package Manager. Самый простой способ — использовать консоль диспетчера пакетов в Visual Studio или dotnet CLI.
dotnet add package StackExchange.Redis
Или через NuGet:
Install-Package StackExchange.Redis
После успешной установки в проекте появляется ссылка на сборку, и можно начинать работу с Redis.
Подключение к серверу Redis
Основной класс для взаимодействия — ConnectionMultiplexer. Он управляет подключениями к Redis и автоматически обрабатывает повторные соединения, ошибки сети и переключение на реплики.
Пример создания подключения:
using StackExchange.Redis;
class Program
{
static async Task Main(string[] args)
{
// Строка подключения к локальному Redis
string connectionString = "localhost:6379";
// Создание мультиплексора
using var redis = await ConnectionMultiplexer.ConnectAsync(connectionString);
// Получение базы данных (по умолчанию db=0)
IDatabase db = redis.GetDatabase();
// Проверка соединения
bool isConnected = db.Ping().TotalSeconds < 2;
Console.WriteLine($"Connected: {isConnected}");
}
}
Строка подключения может содержать пароль, порт, параметры SSL и другие опции. Например, для подключения к Redis на удалённом сервере с паролем:
"myredis.cloud.com:6380,password=secret123,ssl=true"
Основные операции с данными
После получения экземпляра IDatabase можно выполнять все стандартные операции Redis.
Работа со строками
// Запись строки
await db.StringSetAsync("user:1:name", "Алексей");
// Чтение строки
string name = await db.StringGetAsync("user:1:name");
Console.WriteLine(name); // Выведет: Алексей
// Инкремент счётчика
await db.StringIncrementAsync("page:visits", 1);
Работа с хэшами
// Установка полей хэша
HashEntry[] userData = {
new HashEntry("name", "Мария"),
new HashEntry("age", 28),
new HashEntry("city", "Москва")
};
await db.HashSetAsync("user:2", userData);
// Получение одного поля
string city = await db.HashGetAsync("user:2", "city");
Console.WriteLine(city); // Москва
// Получить все поля хэша
var allFields = await db.HashGetAllAsync("user:2");
foreach (var field in allFields)
{
Console.WriteLine($"{field.Name}: {field.Value}");
}
Работа со списками
// Добавление элементов в список (слева)
await db.ListLeftPushAsync("notifications", "Первое уведомление");
await db.ListLeftPushAsync("notifications", "Второе уведомление");
// Получение всех элементов списка
var items = await db.ListRangeAsync("notifications");
foreach (var item in items)
{
Console.WriteLine(item);
}
// Удаление и получение последнего элемента (справа)
string last = await db.ListRightPopAsync("notifications");
Использование Pub/Sub (издатель-подписчик)
StackExchange.Redis полностью поддерживает механизм Pub/Sub, что позволяет строить асинхронные системы обмена сообщениями.
Пример подписчика:
var subscriber = redis.GetSubscriber();
// Подписка на канал "events"
await subscriber.SubscribeAsync("events", (channel, message) =>
{
Console.WriteLine($"Получено сообщение: {message}");
});
Console.WriteLine("Ожидание сообщений. Нажмите Enter для выхода.");
Console.ReadLine();
Пример издателя:
var subscriber = redis.GetSubscriber();
// Публи