عميل Redis لـ Node.js: ioredis
Redis هو مخزن بيانات عالي الأداء في الذاكرة، يُستخدم غالبًا كقاعدة بيانات وذاكرة تخزين مؤقت ووسيط رسائل. للتفاعل مع Redis من Node.js، توجد عدة مكتبات، لكن واحدة من أشهرها وأكثرها وظيفية هي ioredis. توفر هذه المكتبة واجهة برمجة تطبيقات كاملة وعالية الأداء وسهلة الاستخدام للعمل مع Redis، مع دعم جميع الإمكانيات الحديثة بما في ذلك التجميع وpub/sub والمعاملات ونصوص Lua.
في هذه المقالة، سنستعرض ioredis بالتفصيل، وكيفية تثبيته، وإمكانياته الأساسية، وسنقدم أمثلة عملية على كود JavaScript (Node.js).
التثبيت والاتصال
تثبيت ioredis عبر npm أو yarn لا يسبب أي صعوبات:
npm install ioredis# أوyarn add ioredisبعد التثبيت، قم بإنشاء نسخة من العميل:
const Redis = require('ioredis');const redis = new Redis(); // افتراضيًا localhost:6379
// أو مع معلمات صريحةconst redis = new Redis({ host: 'localhost', port: 6379, password: 'your_password', // إذا تم تعيين كلمة مرور db: 0});تدعم المكتبة Promise وasync/await، مما يجعل الكود نظيفًا وسهل القراءة.
العمليات الأساسية على البيانات
تتيح ioredis تنفيذ جميع أوامر Redis القياسية. دعنا نستعرض أمثلة على العمل مع السلاسل والقوائم والتجزئات.
العمل مع السلاسل
async function stringExample() { await redis.set('user:1:name', 'أليكسي'); const name = await redis.get('user:1:name'); console.log(name); // أليكسي
// تعيين مع وقت انتهاء الصلاحية (TTL) await redis.setex('temp:code', 60, '123456'); // يعيش لمدة 60 ثانية}العمل مع القوائم
async function listExample() { await redis.lpush('queue:tasks', 'task1', 'task2'); await redis.rpush('queue:tasks', 'task3'); const tasks = await redis.lrange('queue:tasks', 0, -1); console.log(tasks); // ['task2', 'task1', 'task3']}العمل مع التجزئات
async function hashExample() { await redis.hset('user:1', { name: 'ماريا', age: 28, city: 'موسكو' }); const age = await redis.hget('user:1', 'age'); console.log(age); // 28
const allData = await redis.hgetall('user:1'); console.log(allData); // { name: 'ماريا', age: '28', city: 'موسكو' }}Pub/Sub (ناشر-مشترك)
يدعم Redis نمط pub/sub، وتوفر ioredis واجهة مريحة لذلك. مهم: يجب أن يستخدم المشترك اتصالاً منفصلاً.
// المشتركconst subscriber = new Redis();subscriber.subscribe('news', 'updates', (err, count) => { console.log(`مشترك في ${count} قناة`);});
subscriber.on('message', (channel, message) => { console.log(`تم الاستلام من ${channel}: ${message}`);});
// الناشر (يمكن أن يكون في عملية أخرى)const publisher = new Redis();publisher.publish('news', 'مرحبًا بالعالم!');publisher.publish('updates', 'الإصدار 2.0 صدر');العمل مع مجموعة Redis
تدعم ioredis التجميع بشكل ممتاز. كل ما عليك فعله هو تمرير قائمة عقد المجموعة:
const cluster = new Redis.Cluster([ { host: 'node1.example.com', port: 6379 }, { host: 'node2.example.com', port: 6379 }, { host: 'node3.example.com', port: 6379 }]);
async function clusterExample() { await cluster.set('key', 'value'); const val = await cluster.get('key'); console.log(val); // value}تتعامل المكتبة تلقائيًا مع إعادة توجيه الأوامر بين العقد (MOVED, ASK) وتدعم الفتحات.
المعاملات وخطوط الأنابيب
لتنفيذ عدة أوامر بشكل ذري، استخدم المعاملات (MULTI/EXEC). لتحسين الأداء، استخدم خطوط الأنابيب (pipeline).
المعاملات
async function transaction