RediStack: عميل Redis غير متزامن لتطبيقات Swift (iOS/macOS)
\n\nRediStack هو عميل حديث وغير متزامن بالكامل لـ Redis، مكتوب بلغة Swift. تم بناؤه على أساس إطار العمل عالي الأداء SwiftNIO، مما يسمح بالعمل بكفاءة مع طلبات الشبكة دون حظر الخيط الرئيسي. المكتبة مثالية لتطبيقات iOS وmacOS التي تتطلب التخزين المؤقت، أو إدارة قوائم الانتظار، أو Pub/Sub.
\n\nيدعم RediStack جميع إمكانيات Redis الأساسية: السلاسل النصية، التجزئة (Hashes)، القوائم، المجموعات، المعاملات، الخطوط الأنابيب (pipeline)، والنشر/الاشتراك (Pub/Sub). المكتبة قيد التطوير النشط ويتم دعمها من قبل مجتمع Swift.
\n\nالتثبيت
\nأضف RediStack إلى مشروعك عبر 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\nلـ CocoaPods استخدم:
\npod 'RediStack', '~> 1.0'\n\n\nالاتصال الأساسي
\nأنشئ اتصالاً بخادم Redis باستخدام 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\nالعمل مع البيانات
\nأمثلة على العمليات الأساسية:
\n// تعيين قيمة\ntry await connection.set("user:1:name", to: "أليكسي")\ntry await connection.set("user:1:age", to: 30)\n\n// الحصول على قيمة\nlet name: String? = try await connection.get("user:1:name")\nprint(name ?? "غير موجود") // سيطبع: أليكسي\n\n// العمل مع التجزئة (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// الزيادة (Increment)\nlet newCount = try await connection.increment("page:views")\nprint("عدد المشاهدات: \\(newCount)")\n\n\nالمعاملات والخطوط الأنابيب
\nيدعم RediStack الخطوط الأنابيب (pipeline) لإرسال أوامر متعددة دفعة واحدة:
\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 – مصفوفة من الردود بترتيب الأوامر\n\n\nللمعاملات استخدم 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 (النشر والاشتراك)
\nيدعم RediStack الاشتراكات غير المتزامنة في القنوات:
\n// الاشتراك في قناة\nlet subscriber = connection.subscribe(to: "updates") { event in\n switch event {\n case .message(let channel, let message):\n print("تم الاستلام من \\(channel): \\(message)")\n default:\n break\n }\n}\n\n// نشر رسالة\ntry await connection.publish("مرحباً بالجميع!", to: "updates")\n\n\nمعالجة الأخطاء وإعادة الاتصال
\nلتطبيقات الإنتاج، من المهم معالجة انقطاع الاتصال. يوفر RediStack آليات إعادة الاتصال عبر 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// استخدم pool كاتصال عادي\ntry await pool.set("session:token", to: "abc123")\n\n\nالأداء
\nبفضل SwiftNIO، يضمن RediStack تشغيلاً غير محظور لجميع العمليات. هذا مهم بشكل خاص لتطبيقات iOS/mac