RediStack: Asynchroner Redis-Client für Swift (iOS/macOS)
\n\nRediStack ist ein moderner, vollständig asynchroner Client für Redis, geschrieben in Swift. Er basiert auf dem leistungsstarken Framework SwiftNIO, was eine effiziente Verarbeitung von Netzwerkanfragen ohne Blockierung des Hauptthreads ermöglicht. Die Bibliothek ist ideal für iOS- und macOS-Anwendungen, die Caching, Warteschlangenverwaltung oder Pub/Sub benötigen.
\n\nRediStack unterstützt alle grundlegenden Redis-Funktionen: Strings, Hashes, Listen, Sets, Transaktionen, Pipelines und Veröffentlichen/Abonnieren (Pub/Sub). Die Bibliothek wird aktiv weiterentwickelt und von der Swift-Community unterstützt.
\n\nInstallation
\nFügen Sie RediStack über den Swift Package Manager zu Ihrem Projekt hinzu:
\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\nFür CocoaPods verwenden Sie:
\npod 'RediStack', '~> 1.0'\n\n\nGrundlegende Verbindung
\nErstellen Sie eine Verbindung zum Redis-Server mit 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\nArbeiten mit Daten
\nBeispiele für grundlegende Operationen:
\n// Wert setzen\ntry await connection.set("user:1:name", to: "Alexej")\ntry await connection.set("user:1:age", to: 30)\n\n// Wert abrufen\nlet name: String? = try await connection.get("user:1:name")\nprint(name ?? "nicht gefunden") // Gibt aus: Alexej\n\n// Arbeiten mit 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// Inkrement\nlet newCount = try await connection.increment("page:views")\nprint("Aufrufe: \\(newCount)")\n\n\nTransaktionen und Pipelines
\nRediStack unterstützt Pipelines zum gleichzeitigen Senden mehrerer Befehle:
\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 — Array der Antworten in der Reihenfolge der Befehle\n\n\nFür Transaktionen verwenden Sie 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 (Veröffentlichen und Abonnieren)
\nRediStack unterstützt asynchrone Abonnements auf Kanäle:
\n// Abonnement auf einen Kanal\nlet subscriber = connection.subscribe(to: "updates") { event in\n switch event {\n case .message(let channel, let message):\n print("Erhalten von \\(channel): \\(message)")\n default:\n break\n }\n}\n\n// Nachricht veröffentlichen\ntry await connection.publish("Hallo zusammen!", to: "updates")\n\n\nFehlerbehandlung und Wiederverbindung
\nFür Produktionsanwendungen ist es wichtig, Verbindungsabbrüche zu behandeln. RediStack bietet Mechanismen zur Wiederverbindung über 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// Verwenden Sie pool wie eine normale Verbindung\ntry await pool.set("session:token", to: "abc123")\n\n\nLeistung
\nDank SwiftNIO gewährleistet RediStack eine nicht-blockierende Ausführung aller Operationen. Dies ist besonders wichtig für iOS/mac
Auch in der Bibliothek
Event Bus und das Observer-Pattern in Go (Golang): pub/sub-Implementierung
WebSocket-Bibliothek für C# (.NET): SignalR und Alternativen
SMS-Versand mit PHP: Überblick über API-Bibliotheken für die Integration
Effect-ts für TypeScript: Komplettguide mit Beispielen