عميل Redis Swift: RediStack لنظامي iOS/macOS

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

RediStack: عميل Redis غير متزامن لـ Swift (iOS/macOS)

RediStack هو عميل حديث وغير متزامن بالكامل للعمل مع Redis، مكتوب بلغة Swift. تم بناء المكتبة على أساس إطار العمل SwiftNIO، مما يضمن أداءً عاليًا واستهلاكًا منخفضًا للذاكرة. يعتبر RediStack مثاليًا لتطبيقات iOS و macOS التي تتطلب تخزينًا مؤقتًا سريعًا، وإدارة الجلسات، وقوائم انتظار الرسائل، أو وظائف Pub/Sub.



الميزات الرئيسية

  • عدم التزامن الكامل القائم على Swift Concurrency (async/await) و Combine
  • دعم جميع أنواع بيانات Redis الأساسية: السلاسل النصية، القوائم، المجموعات، التجزئات، التدفقات
  • دعم مدمج لـ Pub/Sub مع إعادة اتصال تلقائية
  • تجميع الاتصالات التلقائي (Connection Pool)
  • دعم Redis Cluster و Sentinel
  • تشفير SSL/TLS للاتصال الآمن
  • أوامر آمنة من حيث النوع مع الإكمال التلقائي في Xcode


التثبيت باستخدام Swift Package Manager

أضف RediStack إلى ملف Package.swift الخاص بك أو عبر Xcode:

// Package.swiftdependencies: [    .package(url: "https://github.com/RediStack/RediStack.git", from: "1.6.0")],targets: [    .target(name: "YourApp", dependencies: ["RediStack"])]


بداية سريعة: الاتصال بـ Redis

للبدء، قم بإنشاء مجموعة اتصالات وتنفيذ أوامر بسيطة:

import RediStackimport NIO

// إنشاء EventLoopGrouplet eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)

// تكوين مجموعة الاتصالاتlet pool = RedisConnectionPool( configuration: .init( initialServerConnectionAddresses: [try .init(hostname: "localhost", port: 6379)], maximumConnectionCount: .maximumActiveConnections(5) ), boundEventLoop: eventLoopGroup.next())

// العمل غير المتزامن مع RedisTask { do { // تعيين واسترجاع سلسلة نصية try await pool.set("greeting", to: "Hello from Swift!") let value = try await pool.get("greeting", as: String.self) print("تم الاستلام: \\(value ?? "nil")") // "تم الاستلام: Hello from Swift!" // العمل مع القوائم 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)") // ["cherry", "banana", "apple"] } catch { print("خطأ Redis: \\(error)") }}


مثال: Pub/Sub (ناشر-مشترك)

يدعم RediStack Pub/Sub كامل مع استعادة تلقائية للاشتراك:

import RediStackimport NIO

let eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 2)let pool = RedisConnectionPool(...)

// المشتركTask { let subscriber = pool.makeSubscriber(eventLoop: eventLoopGroup.next()) // الاشتراك في قناة await subscriber.subscribe(to: "notifications") { channel, message in print("تم الاستلام على القناة \\(channel): \\(message.string ?? "")") } // معالجة أخطاء الاشتراك subscriber.onError = { error in print("خطأ Pub/Sub: \\(error)") }}

// الناشر (إرسال رسالة)Task { try await pool.publish("إشعار جديد", to: "notifications")}


العمل مع التجزئات والمعاملات

مثال على استخدام التجزئات والعمليات الذرية باستخدام المعاملات:

// تعيين حقول التجزئةtry await pool.hmset("user:1001", with: [    "name": "إيفان بيتروف",    "email": "ivan@example.com",    "age": "30"])

// استرجاع جميع الحقولlet user = try await pool.hgetall(from: "user:1001")print("الاسم: \\(user["name"]?.string ?? "")") // "الاسم: إيفان بيتروف"

// معاملة (تنفيذ ذري)try await pool.transaction { transaction in transaction.inc

توصيات