RediStack: Cliente Redis asíncrono para Swift (iOS/macOS)
\n\nRediStack es un cliente moderno, completamente asíncrono para Redis, escrito en Swift. Está construido sobre el framework de alto rendimiento SwiftNIO, lo que permite trabajar eficientemente con solicitudes de red sin bloquear el hilo principal. La biblioteca es ideal para aplicaciones iOS y macOS que requieren almacenamiento en caché, gestión de colas o Pub/Sub.
\n\nRediStack soporta todas las funcionalidades principales de Redis: strings, hashes, listas, conjuntos, transacciones, pipelines y publicación/suscripción (Pub/Sub). La biblioteca se desarrolla activamente y cuenta con el respaldo de la comunidad Swift.
\n\nInstalación
\nAñada RediStack a su proyecto a través de 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\nConexión básica
\nCree una conexión al 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\nTrabajo con datos
\nEjemplos de operaciones básicas:
\n// Establecer valor\ntry await connection.set("user:1:name", to: "Алексей")\ntry await connection.set("user:1:age", to: 30)\n\n// Obtener valor\nlet name: String? = try await connection.get("user:1:name")\nprint(name ?? "no encontrado") // Muestra: Алексей\n\n// Trabajo con 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("Vistas: \\(newCount)")\n\n\nTransacciones y pipelines
\nRediStack soporta pipelines para enviar múltiples comandos a la 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 — arreglo de respuestas en el orden de los comandos\n\n\nPara transacciones 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 (Publicación y suscripción)
\nRediStack soporta suscripciones asíncronas a canales:
\n// Suscripción a un canal\nlet subscriber = connection.subscribe(to: "updates") { event in\n switch event {\n case .message(let channel, let message):\n print("Recibido de \\(channel): \\(message)")\n default:\n break\n }\n}\n\n// Publicación de un mensaje\ntry await connection.publish("¡Hola a todos!", to: "updates")\n\n\nManejo de errores y reconexión
\nPara aplicaciones en producción es importante manejar las desconexiones. RediStack proporciona mecanismos de reconexión a travé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 pool como una conexión normal\ntry await pool.set("session:token", to: "abc123")\n\n\nRendimiento
\nGracias a SwiftNIO, RediStack garantiza un funcionamiento no bloqueante de todas las operaciones. Esto es especialmente importante para iOS/mac
También en la biblioteca
Planificador de tareas en TypeScript: guía completa sobre bibliotecas cron y temporizadores
Axios
Cliente Redis en Rust: guía completa para trabajar con la biblioteca redis-rs
Trabajo con CSV en Swift (iOS/macOS) — bibliotecas y ejemplos de código