RediStack: Cliente Redis Assíncrono para Swift (iOS/macOS)
RediStack é um cliente moderno e totalmente assíncrono para trabalhar com Redis, escrito em Swift. A biblioteca é construída sobre o framework SwiftNIO, o que garante alto desempenho e baixo consumo de memória. RediStack é ideal para aplicações iOS e macOS que exigem cache rápido, gerenciamento de sessões, filas de mensagens ou funcionalidade Pub/Sub.
Principais Recursos
- Assincronia total baseada em Swift Concurrency (async/await) e Combine
- Suporte a todos os principais tipos de dados do Redis: strings, listas, conjuntos, hashes, streams
- Suporte nativo a Pub/Sub com reconexão automática
- Pooling automático de conexões (Connection Pool)
- Suporte a Redis Cluster e Sentinel
- Criptografia SSL/TLS para conexão segura
- Comandos type-safe com autocompletar no Xcode
Instalação com Swift Package Manager
Adicione o RediStack ao seu Package.swift ou via Xcode:
// Package.swiftdependencies: [ .package(url: "https://github.com/RediStack/RediStack.git", from: "1.6.0")],targets: [ .target(name: "YourApp", dependencies: ["RediStack"])]Início Rápido: Conectando ao Redis
Para começar, crie um pool de conexões e execute comandos simples:
import RediStackimport NIO
// Criando um EventLoopGrouplet eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)
// Configurando o pool de conexõeslet pool = RedisConnectionPool( configuration: .init( initialServerConnectionAddresses: [try .init(hostname: "localhost", port: 6379)], maximumConnectionCount: .maximumActiveConnections(5) ), boundEventLoop: eventLoopGroup.next())
// Trabalho assíncrono com RedisTask { do { // Definindo e obtendo uma string try await pool.set("greeting", to: "Hello from Swift!") let value = try await pool.get("greeting", as: String.self) print("Recebido: \\(value ?? "nil")") // "Recebido: Hello from Swift!" // Trabalhando com listas try await pool.lpush(["apple", "banana", "cherry"], into: "fruits") let fruits = try await pool.lrange(from: "fruits", firstIndex: 0, lastIndex: -1, as: [String].self) print("Frutas: \\(fruits)") // ["cherry", "banana", "apple"] } catch { print("Erro Redis: \\(error)") }}Exemplo: Pub/Sub (Publicador-Assinante)
RediStack suporta Pub/Sub completo com recuperação automática de assinatura:
import RediStackimport NIO
let eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 2)let pool = RedisConnectionPool(...)
// AssinanteTask { let subscriber = pool.makeSubscriber(eventLoop: eventLoopGroup.next()) // Assinando um canal await subscriber.subscribe(to: "notifications") { channel, message in print("Recebido no canal \\(channel): \\(message.string ?? "")") } // Tratamento de erros de assinatura subscriber.onError = { error in print("Erro Pub/Sub: \\(error)") }}
// Publicador (envio de mensagem)Task { try await pool.publish("Nova notificação", to: "notifications")}Trabalhando com Hashes e Transações
Exemplo de uso de hashes e operações atômicas com transações:
// Definindo campos de hashtry await pool.hmset("user:1001", with: [ "name": "João Silva", "email": "joao@example.com", "age": "30"])
// Obtendo todos os camposlet user = try await pool.hgetall(from: "user:1001")print("Nome: \\(user["name"]?.string ?? "")") // "Nome: João Silva"
// Transação (execução atômica)try await pool.transaction { transaction in transaction.inc