Cliente Redis para Swift (iOS/macOS) – RediStack

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

RediStack: Cliente Redis Assíncrono para Swift (iOS/macOS)

\n\n

RediStack é 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\n

RediStack 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\n

Instalação

\n

Adicione 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
\n

Para CocoaPods, use:

\n
pod 'RediStack', '~> 1.0'\n
\n\n

Conexão Básica

\n

Crie uma conexão com o servidor Redis usando RedisConnection:

\n
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\n

Trabalhando com Dados

\n

Exemplos 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\n

Transações e Pipelines

\n

RediStack suporta pipelines para enviar múltiplos comandos de uma só vez:

\n
let 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\n

Para transações, use MULTI/EXEC:

\n
try await connection.sendCommandsImmediately(false)\ntry await connection.set("balance", to: 100)\ntry await connection.decrement("balance")\ntry await connection.sendCommandsImmediately(true)\n
\n\n

Pub/Sub (Publicação e Assinatura)

\n

RediStack 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\n

Tratamento de Erros e Reconexão

\n

Para aplicações em produção, é importante lidar com quedas de conexão. RediStack fornece mecanismos de reconexão através de RedisConnectionPool:

\n
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\n

Desempenho

\n

Graças ao SwiftNIO, RediStack garante operações não bloqueantes em todas as ações. Isso é especialmente importante para iOS/mac

Recommendations