عميل Redis لجافا: نظرة عامة على المكتبات الشائعة
\n\nRedis هو مخزن بيانات عالي الأداء من نوع "مفتاح-قيمة"، يُستخدم على نطاق واسع للتخزين المؤقت، الجلسات، قوائم الانتظار، والتحليلات في الوقت الفعلي. للعمل مع Redis من جافا، توجد عدة مكتبات عميل ناضجة. في هذه المقالة، سنستعرض الثلاثة الأكثر شهرة: Jedis وLettuce وRedisson. لكل منها ميزاتها، مزاياها، وسيناريوهات استخدامها.
\n\n1. Jedis — عميل بسيط وخفيف الوزن
\n\nJedis هو عميل متزامن (Synchronous) بسيط لـ Redis. سهل التعلم، ومناسب تمامًا للمشاريع الصغيرة والخدمات المصغرة التي لا تتطلب عدم التزامن (Asynchronous).
\n\nميزات Jedis:
\n- \n
- واجهة برمجة تطبيقات متزامنة (استدعاءات محظورة). \n
- دعم تجمع الاتصالات (JedisPool). \n
- دعم كامل لأوامر Redis. \n
- لا يدعم العمليات غير المتزامنة أو التفاعلية (Reactive). \n
مثال على الاتصال والعمليات الأساسية:
\nimport redis.clients.jedis.Jedis;\nimport redis.clients.jedis.JedisPool;\n\npublic class JedisExample {\n public static void main(String[] args) {\n // إنشاء تجمع اتصالات\n try (JedisPool pool = new JedisPool("localhost", 6379);\n Jedis jedis = pool.getResource()) {\n\n // تعيين قيمة والحصول عليها\n jedis.set("user:100", "Alice");\n String value = jedis.get("user:100");\n System.out.println("القيمة: " + value); // الإخراج: Alice\n\n // العمل مع القوائم\n jedis.lpush("queue", "task1");\n jedis.lpush("queue", "task2");\n String task = jedis.rpop("queue");\n System.out.println("المهمة من قائمة الانتظار: " + task); // الإخراج: task1\n }\n }\n}\n\nمتى تختار Jedis:
\n- \n
- مشروع بسيط بدون متطلبات تفاعلية (Reactive). \n
- الحاجة إلى أقل تبعية (ملف jar واحد). \n
- العمليات المحظورة التقليدية. \n
2. Lettuce — عميل غير متزامن وتفاعلي
\n\nLettuce هو عميل حديث مبني على Netty. يدعم واجهات برمجة تطبيقات متزامنة، غير متزامنة، وتفاعلية (Reactive Streams). مناسب تمامًا للأنظمة عالية التحميل.
\n\nميزات Lettuce:
\n- \n
- واجهة برمجة تطبيقات غير متزامنة وتفاعلية (مبنية على Project Reactor). \n
- دعم عناقيد Redis، Sentinel، SSL. \n
- عمليات غير محظورة — إنتاجية عالية. \n
- دعم Redis Pub/Sub، Streams، المعاملات (Transactions). \n
مثال على الاستخدام غير المتزامن:
\nimport io.lettuce.core.RedisClient;\nimport io.lettuce.core.api.StatefulRedisConnection;\nimport io.lettuce.core.api.async.RedisAsyncCommands;\n\npublic class LettuceAsyncExample {\n public static void main(String[] args) {\n RedisClient client = RedisClient.create("redis://localhost:6379");\n try (StatefulRedisConnection<String, String> connection = client.connect()) {\n RedisAsyncCommands<String, String> async = connection.async();\n\n // تعيين قيمة بشكل غير متزامن\n async.set("key:1", "Hello, Lettuce!");\n\n // الحصول على قيمة بشكل غير متزامن مع رد اتصال (callback)\n async.get("key:1").thenAccept(value -> \n System.out.println("تم الاستلام: " + value)\n );\n\n // تأخير بسيط لإكمال العملية غير المتزامنة\n try { Thread.sleep(100); } catch (InterruptedException e) { }\n }\n client.shutdown();\n }\n}\n\nمتى تختار Lettuce:
\n- \n
- الأنظمة عالية التحميل مع عدد كبير من الطلبات. \n
- الحاجة إلى عدم التزامن أو البرمجة التفاعلية. \n
- العمل مع عنقود Redis أو Sentinel. \n
3. Redisson — عميل بإمكانيات موسعة
\n\nRedisson ليس مجرد عميل، بل هو إطار عمل متكامل (Framework)