RediStack : Client Redis asynchrone pour Swift (iOS/macOS)
\n\nRediStack est un client moderne, entièrement asynchrone pour Redis, écrit en Swift. Il est construit sur la base du framework haute performance SwiftNIO, ce qui permet de travailler efficacement avec les requêtes réseau sans bloquer le thread principal. La bibliothèque est idéale pour les applications iOS et macOS nécessitant une mise en cache, une gestion de files d'attente ou du Pub/Sub.
\n\nRediStack prend en charge toutes les fonctionnalités principales de Redis : chaînes, hachages, listes, ensembles, transactions, pipelines et publication/abonnement (Pub/Sub). La bibliothèque est activement développée et maintenue par la communauté Swift.
\n\nInstallation
\nAjoutez RediStack à votre projet 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\nPour CocoaPods, utilisez :
\npod 'RediStack', '~> 1.0'\n\n\nConnexion de base
\nCréez une connexion au serveur Redis à l'aide de 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\nManipulation des données
\nExemples d'opérations de base :
\n// Définition d'une valeur\ntry await connection.set("user:1:name", to: "Alexeï")\ntry await connection.set("user:1:age", to: 30)\n\n// Récupération d'une valeur\nlet name: String? = try await connection.get("user:1:name")\nprint(name ?? "non trouvé") // Affiche : Alexeï\n\n// Travail avec les hachages\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// Incrémentation\nlet newCount = try await connection.increment("page:views")\nprint("Vues : \\(newCount)")\n\n\nTransactions et pipelines
\nRediStack prend en charge les pipelines pour envoyer plusieurs commandes en une seule fois :
\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 — tableau de réponses dans l'ordre des commandes\n\n\nPour les transactions, utilisez 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 (Publication et abonnement)
\nRediStack prend en charge les abonnements asynchrones aux canaux :
\n// Abonnement à un canal\nlet subscriber = connection.subscribe(to: "updates") { event in\n switch event {\n case .message(let channel, let message):\n print("Reçu de \\(channel) : \\(message)")\n default:\n break\n }\n}\n\n// Publication d'un message\ntry await connection.publish("Bonjour à tous !", to: "updates")\n\n\nGestion des erreurs et reconnexion
\nPour les applications de production, il est important de gérer les ruptures de connexion. RediStack fournit des mécanismes de reconnexion via 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// Utilisez pool comme une connexion normale\ntry await pool.set("session:token", to: "abc123")\n\n\nPerformances
\nGrâce à SwiftNIO, RediStack assure un fonctionnement non bloquant de toutes les opérations. Cela est particulièrement important pour les applications iOS/mac
Aussi dans la bibliothèque
Journalisation pour JavaScript (Node.js) : meilleures solutions
node-cron : Planificateur de tâches JavaScript
Files d'attente de tâches en Swift : GCD, OperationQueue et Combine pour iOS/macOS
Client HTTP pour PHP : Guzzle
Travailler avec Markdown en Go (Golang) : bibliothèques, analyse et conversion