RediStack: Асинхронный Redis клиент для Swift (iOS/macOS)
RediStack — это современный, полностью асинхронный клиент для Redis, написанный на Swift. Он построен на базе высокопроизводительного фреймворка SwiftNIO, что позволяет эффективно работать с сетевыми запросами без блокировки основного потока. Библиотека идеально подходит для iOS и macOS приложений, где требуется кэширование, управление очередями или Pub/Sub.
RediStack поддерживает все основные возможности Redis: строки, хеши, списки, множества, транзакции, конвейеры (pipeline) и публикацию/подписку (Pub/Sub). Библиотека активно развивается и поддерживается сообществом Swift.
Установка
Добавьте RediStack в ваш проект через Swift Package Manager:
// Package.swift
dependencies: [
.package(url: "https://github.com/swift-server/RediStack.git", from: "1.0.0")
],
targets: [
.target(name: "MyApp", dependencies: ["RediStack"])
]
Для CocoaPods используйте:
pod 'RediStack', '~> 1.0'
Базовое подключение
Создайте подключение к Redis серверу с помощью RedisConnection:
import RediStack
import NIOCore
import NIOPosix
let eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)
let eventLoop = eventLoopGroup.next()
let connection = try await RedisConnection.connect(
to: try .init(hostname: "localhost", port: 6379),
on: eventLoop
)
Работа с данными
Примеры основных операций:
// Установка значения
try await connection.set("user:1:name", to: "Алексей")
try await connection.set("user:1:age", to: 30)
// Получение значения
let name: String? = try await connection.get("user:1:name")
print(name ?? "не найдено") // Выведет: Алексей
// Работа с хешами
try await connection.hset("user:1", field: "email", to: "alex@example.com")
let email: String? = try await connection.hget("user:1", field: "email")
// Инкремент
let newCount = try await connection.increment("page:views")
print("Просмотров: \(newCount)")
Транзакции и конвейеры
RediStack поддерживает конвейеры для отправки нескольких команд за один раз:
let pipeline = connection.pipeline()
pipeline.set("key1", to: "value1")
pipeline.set("key2", to: "value2")
pipeline.get("key1")
let results = try await pipeline.execute()
// results — массив ответов в порядке команд
Для транзакций используйте MULTI/EXEC:
try await connection.sendCommandsImmediately(false)
try await connection.set("balance", to: 100)
try await connection.decrement("balance")
try await connection.sendCommandsImmediately(true)
Pub/Sub (Публикация и подписка)
RediStack поддерживает асинхронные подписки на каналы:
// Подписка на канал
let subscriber = connection.subscribe(to: "updates") { event in
switch event {
case .message(let channel, let message):
print("Получено из \(channel): \(message)")
default:
break
}
}
// Публикация сообщения
try await connection.publish("Привет всем!", to: "updates")
Обработка ошибок и переподключение
Для production-приложений важно обрабатывать обрывы соединения. RediStack предоставляет механизмы повторного подключения через RedisConnectionPool:
let pool = RedisConnectionPool(
configuration: .init(
initialServerConnectionAddresses: [.init(hostname: "localhost", port: 6379)],
maximumConnectionCount: .maximum(5)
),
eventLoopGroup: eventLoopGroup
)
// Используйте pool как обычное подключение
try await pool.set("session:token", to: "abc123")
Производительность
Благодаря SwiftNIO, RediStack обеспечивает неблокирующую работу всех операций. Это особенно важно для iOS/macOS приложений, где UI не должен зависать при сетевых запросах. Библиотека поддерживает:
- Асинхронные вызовы через async/await (Swift 5.5+)
- Потокобезопасные пулы соединений
- Автоматическое восстановление после ошибок
- Поддержку TLS/SSL для безопасного подключения
Заключение
RediStack — это зрелая и надежная библиотека для работы с Redis из Swift. Она отлично подходит для:
- Кэширования данных в iOS/macOS приложениях
- Реализации