RediStack: Cliente Redis Assíncrono para Swift (iOS/macOS)
\n\nRediStack é um cliente moderno e totalmente assíncrono para Redis, escrito em Swift. Ele é construído sobre o framework de alto desempenho SwiftNIO, permitindo trabalhar eficientemente com requisições de rede sem bloquear a thread principal. A biblioteca é ideal para aplicações iOS e macOS que exigem cache, gerenciamento de filas ou Pub/Sub.
\n\nRediStack suporta todos os principais recursos do Redis: strings, hashes, listas, conjuntos, transações, pipelines e publicação/assinatura (Pub/Sub). A biblioteca é ativamente desenvolvida e mantida pela comunidade Swift.
\n\nInstalação
\nAdicione RediStack ao seu projeto via Swift Package Manager:
\n// Package.swift\ndependencies: [\n .package(url: "https://github.com/swift-server/RediStack.git", from: "1.0.0")\n],\ntargets: [\n .target(name: "MyApp", dependencies: ["RediStack"])\n]\n\nPara CocoaPods, use:
\npod 'RediStack', '~> 1.0'\n\n\nConexão Básica
\nCrie uma conexão com o servidor Redis usando RedisConnection:
import RediStack\nimport NIOCore\nimport NIOPosix\n\nlet eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)\nlet eventLoop = eventLoopGroup.next()\n\nlet connection = try await RedisConnection.connect(\n to: try .init(hostname: "localhost", port: 6379),\n on: eventLoop\n)\n\n\nTrabalhando com Dados
\nExemplos de operações básicas:
\n// Definir valor\ntry await connection.set("user:1:name", to: "Alexei")\ntry await connection.set("user:1:age", to: 30)\n\n// Obter valor\nlet name: String? = try await connection.get("user:1:name")\nprint(name ?? "não encontrado") // Exibe: Alexei\n\n// Trabalhando com hashes\ntry await connection.hset("user:1", field: "email", to: "alex@example.com")\nlet email: String? = try await connection.hget("user:1", field: "email")\n\n// Incremento\nlet newCount = try await connection.increment("page:views")\nprint("Visualizações: \\(newCount)")\n\n\nTransações e Pipelines
\nRediStack suporta pipelines para enviar múltiplos comandos de uma só vez:
\nlet pipeline = connection.pipeline()\npipeline.set("key1", to: "value1")\npipeline.set("key2", to: "value2")\npipeline.get("key1")\nlet results = try await pipeline.execute()\n// results — array de respostas na ordem dos comandos\n\n\nPara transações, use MULTI/EXEC:
try await connection.sendCommandsImmediately(false)\ntry await connection.set("balance", to: 100)\ntry await connection.decrement("balance")\ntry await connection.sendCommandsImmediately(true)\n\n\nPub/Sub (Publicação e Assinatura)
\nRediStack suporta assinaturas assíncronas em canais:
\n// Assinar um canal\nlet subscriber = connection.subscribe(to: "updates") { event in\n switch event {\n case .message(let channel, let message):\n print("Recebido de \\(channel): \\(message)")\n default:\n break\n }\n}\n\n// Publicar uma mensagem\ntry await connection.publish("Olá a todos!", to: "updates")\n\n\nTratamento de Erros e Reconexão
\nPara aplicações em produção, é importante lidar com quedas de conexão. RediStack fornece mecanismos de reconexão através de RedisConnectionPool:
let pool = RedisConnectionPool(\n configuration: .init(\n initialServerConnectionAddresses: [.init(hostname: "localhost", port: 6379)],\n maximumConnectionCount: .maximum(5)\n ),\n eventLoopGroup: eventLoopGroup\n)\n\n// Use o pool como uma conexão normal\ntry await pool.set("session:token", to: "abc123")\n\n\nDesempenho
\nGraças ao SwiftNIO, RediStack garante operações não bloqueantes em todas as ações. Isso é especialmente importante para iOS/mac