RediStack: Cliente Redis asíncrono para Swift (iOS/macOS)
RediStack es un cliente moderno y completamente asíncrono para trabajar con Redis, escrito en Swift. La biblioteca está construida sobre el framework SwiftNIO, lo que garantiza un alto rendimiento y un bajo consumo de memoria. RediStack es ideal para aplicaciones iOS y macOS que requieren almacenamiento en caché rápido, gestión de sesiones, colas de mensajes o funcionalidad Pub/Sub.
Características principales
- Asincronía completa basada en Swift Concurrency (async/await) y Combine
- Soporte para todos los tipos de datos principales de Redis: cadenas, listas, conjuntos, hashes, flujos
- Soporte integrado para Pub/Sub con reconexión automática
- Pooling de conexiones automático (Connection Pool)
- Soporte para Redis Cluster y Sentinel
- Cifrado SSL/TLS para conexiones seguras
- Comandos type-safe con autocompletado en Xcode
Instalación con Swift Package Manager
Añade RediStack a tu Package.swift o a través de Xcode:
// Package.swiftdependencies: [ .package(url: "https://github.com/RediStack/RediStack.git", from: "1.6.0")],targets: [ .target(name: "YourApp", dependencies: ["RediStack"])]Inicio rápido: conexión a Redis
Para empezar, crea un pool de conexiones y ejecuta comandos simples:
import RediStackimport NIO
// Creamos un EventLoopGrouplet eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)
// Configuramos el pool de conexioneslet pool = RedisConnectionPool( configuration: .init( initialServerConnectionAddresses: [try .init(hostname: "localhost", port: 6379)], maximumConnectionCount: .maximumActiveConnections(5) ), boundEventLoop: eventLoopGroup.next())
// Trabajo asíncrono con RedisTask { do { // Establecer y obtener una cadena try await pool.set("greeting", to: "Hello from Swift!") let value = try await pool.get("greeting", as: String.self) print("Recibido: \\(value ?? "nil")") // "Recibido: Hello from Swift!" // Trabajo con 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("Error de Redis: \\(error)") }}Ejemplo: Pub/Sub (publicador-suscriptor)
RediStack soporta Pub/Sub completo con recuperación automática de suscripciones:
import RediStackimport NIO
let eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 2)let pool = RedisConnectionPool(...)
// SuscriptorTask { let subscriber = pool.makeSubscriber(eventLoop: eventLoopGroup.next()) // Suscripción a un canal await subscriber.subscribe(to: "notifications") { channel, message in print("Recibido en el canal \\(channel): \\(message.string ?? "")") } // Manejo de errores de suscripción subscriber.onError = { error in print("Error de Pub/Sub: \\(error)") }}
// Publicador (envío de mensaje)Task { try await pool.publish("Nueva notificación", to: "notifications")}Trabajo con hashes y transacciones
Ejemplo de uso de hashes y operaciones atómicas con transacciones:
// Establecer campos de un hashtry await pool.hmset("user:1001", with: [ "name": "Iván Petrov", "email": "ivan@example.com", "age": "30"])
// Obtener todos los camposlet user = try await pool.hgetall(from: "user:1001")print("Nombre: \\(user["name"]?.string ?? "")") // "Nombre: Iván Petrov"
// Transacción (ejecución atómica)try await pool.transaction { transaction in transaction.inc También en la biblioteca
Generación de PDF en JavaScript (Node.js): bibliotecas y herramientas
Procesamiento de imágenes en Node.js: resize, crop con Sharp y Jimp
Generación de Swagger/OpenAPI para Node.js (JavaScript): herramientas y ejemplos
NestJS para JavaScript (Node.js): guía completa con ejemplos
ORM para Java: comparación de Hibernate, MyBatis, JPA y Spring Data