RediStack : Client Redis asynchrone pour Swift (iOS/macOS)
RediStack est un client moderne, entièrement asynchrone pour travailler avec Redis, écrit en Swift. La bibliothèque est construite sur la base du framework SwiftNIO, ce qui garantit des performances élevées et une faible consommation de mémoire. RediStack est idéal pour les applications iOS et macOS nécessitant une mise en cache rapide, une gestion des sessions, des files d'attente de messages ou des fonctionnalités Pub/Sub.
Fonctionnalités principales
- Asynchronisme complet basé sur Swift Concurrency (async/await) et Combine
- Prise en charge de tous les principaux types de données Redis : chaînes, listes, ensembles, hachages, flux
- Prise en charge intégrée de Pub/Sub avec reconnexion automatique
- Mise en pool automatique des connexions (Connection Pool)
- Prise en charge de Redis Cluster et Sentinel
- Chiffrement SSL/TLS pour une connexion sécurisée
- Commandes typées avec autocomplétion dans Xcode
Installation avec Swift Package Manager
Ajoutez RediStack à votre 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"])]Démarrage rapide : connexion à Redis
Pour commencer, créez un pool de connexions et exécutez des commandes simples :
import RediStackimport NIO
// Créer un EventLoopGrouplet eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)
// Configurer le pool de connexionslet pool = RedisConnectionPool( configuration: .init( initialServerConnectionAddresses: [try .init(hostname: "localhost", port: 6379)], maximumConnectionCount: .maximumActiveConnections(5) ), boundEventLoop: eventLoopGroup.next())
// Travail asynchrone avec RedisTask { do { // Définir et obtenir une chaîne try await pool.set("greeting", to: "Hello from Swift!") let value = try await pool.get("greeting", as: String.self) print("Reçu : \\(value ?? "nil")") // "Reçu : Hello from Swift!" // Travailler avec les listes 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("Fruits : \\(fruits)") // ["cherry", "banana", "apple"] } catch { print("Erreur Redis : \\(error)") }}Exemple : Pub/Sub (éditeur-abonné)
RediStack prend en charge le Pub/Sub complet avec restauration automatique de l'abonnement :
import RediStackimport NIO
let eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 2)let pool = RedisConnectionPool(...)
// AbonnéTask { let subscriber = pool.makeSubscriber(eventLoop: eventLoopGroup.next()) // Abonnement à un canal await subscriber.subscribe(to: "notifications") { channel, message in print("Reçu sur le canal \\(channel) : \\(message.string ?? "")") } // Gestion des erreurs d'abonnement subscriber.onError = { error in print("Erreur Pub/Sub : \\(error)") }}
// Éditeur (envoi d'un message)Task { try await pool.publish("Nouvelle notification", to: "notifications")}Travail avec les hachages et les transactions
Exemple d'utilisation des hachages et des opérations atomiques avec les transactions :
// Définir les champs d'un hachagetry await pool.hmset("user:1001", with: [ "name": "Ivan Petrov", "email": "ivan@example.com", "age": "30"])
// Obtenir tous les champslet user = try await pool.hgetall(from: "user:1001")print("Nom : \\(user["name"]?.string ?? "")") // "Nom : Ivan Petrov"
// Transaction (exécution atomique)try await pool.transaction { transaction in transaction.inc