يفتح زائر صفحة منتج في متجر إلكتروني، فينفّذ الموقع عشرات الاستعلامات على قاعدة البيانات ليعرض السعر والصور والتقييمات والسلة. ثم يفتحها زائر آخر بعد ثانية، فيعيد الموقع الاستعلامات نفسها ليحصل على النتائج نفسها. هذا التكرار هو ما وُجد Redis ليختصره: مخزن بيانات يعمل في ذاكرة الخادم، يحفظ النتائج الجاهزة ويعيدها في أقل من ملّي ثانية غالباً، فيخف الحمل عن قاعدة البيانات ويسرع الموقع. ويستعمله WordPress وLaravel وMagento وكثير غيرها للتخزين المؤقت والجلسات وطوابير المهام. في هذا المقال: ما هو Redis وكيف يعمل، وما الذي يقدّمه لتطبيقك ومتى لا يناسبه، ثم كيف تثبّته على خادم Linux وتضبط أمانه وذاكرته وحفظه على القرص وإعدادات النظام حوله، وكيف تربط به تطبيقك وتراقبه وتحدّثه.
01ما هو Redis وكيف يعمل
اسم Redis اختصار لـ REmote DIctionary Server، أي «خادم القاموس البعيد». بدأه المبرمج الإيطالي Salvatore Sanfilippo ليحمل ضغط أداة كان يبنيها لتحليل السجلات لحظة بلحظة، ثم نشره مشروعاً مفتوح المصدر انتشر في تطبيقات الويب حول العالم. وهو : يحفظ بياناته كلها في ذاكرة الخادم RAM، ويستعمل القرص للحفظ والاستعادة فقط. لذلك يقرأ ويكتب أسرع بكثير من قاعدة بيانات تقرأ من القرص، مقابل أن حجم بياناته محدود بحجم الذاكرة.
كل ما في Redis مفاتيح وقيم: تكتب قيمة باسم، مثل product:1042، ثم تقرؤها بالاسم نفسه. لكن القيمة ليست نصاً فقط، بل بنية بيانات لها أوامرها:
| النوع | ما يحفظه | استخدام نموذجي |
|---|---|---|
| String | نص أو رقم أو بيانات مسلسلة | نتيجة استعلام جاهزة، عدّاد |
| Hash | حقول وقيمها تحت مفتاح واحد | بيانات مستخدم أو منتج |
| List | قائمة مرتبة تضيف إلى طرفيها | طابور مهام بسيط |
| Set | عناصر فريدة بلا ترتيب | وسوم، زوار فريدون |
| Sorted Set | عناصر فريدة لكل منها درجة | الأكثر مبيعاً |
| Stream | سجل أحداث تقرؤه مجموعات من العمّال | طوابير موثوقة وإشعارات |
ومنذ Redis 8 صارت أنواع أخرى جزءاً من النسخة المفتوحة نفسها، منها JSON والسلاسل الزمنية والبحث ومجموعات المتجهات التي تحتاجها تطبيقات الذكاء الاصطناعي.
ولكل مفتاح أن يحمل : تحدد له عدد الثواني، فيحذفه Redis وحده حين تنتهي. وعلى هذا يقوم التخزين المؤقت كله: نسخة جاهزة تعيش دقائق ثم تختفي، فيجلب التطبيق نسخة جديدة من قاعدة البيانات.
وينفّذ Redis الأوامر واحداً بعد الآخر على خيط رئيسي واحد، فلا يتداخل أمران أبداً: إن زاد عميلان العدّاد نفسه في اللحظة نفسها بالأمر INCR، زاد مرتين لا مرة. ولا يبطئه ذلك كما قد يُظن، لأن عمله في الذاكرة لا ينتظر القرص، ويقول توثيقه إن نسخة واحدة على خادم Linux عادي تخدم نحو مليون طلب في الثانية حين تُرسل الأوامر دفعات. والذاكرة التي يحتاجها أقل مما يتوقع كثيرون: مليون مفتاح صغير بقيم نصية يشغل نحو 85 ميغابايت.
02ماذا يقدّم Redis لتطبيقك
أكثر ما يُستعمل Redis له تخفيف الحمل عن قاعدة البيانات الرئيسية، MariaDB أو MySQL أو PostgreSQL، لكنه يقدّم أكثر من ذلك:
- تخزين نتائج الاستعلامات: يبحث التطبيق عن النتيجة في Redis أولاً، فإن لم يجدها سأل قاعدة البيانات وحفظ الجواب بمدة صلاحية. هذا ، وهو أبسط طريقة لتسريع الصفحات الثقيلة.
- التخزين المؤقت للكائنات في WordPress: تخزين الصفحات لا يفيد الزائر المسجل ولا السلة ولا لوحة التحكم، فيحفظ WordPress نتائج استعلاماته وإعداداته في Redis بدل أن يكررها مع كل طلب، كما شرحنا في دليل استضافة WordPress المحسّنة.
- جلسات المستخدمين: تُحفظ جلسة الدخول والسلة في Redis، فتبقى إن أُعيد تشغيل التطبيق، وتعمل على أكثر من خادم تطبيق معاً، وتنتهي وحدها بمدة صلاحيتها.
- طوابير المهام: إرسال البريد وتصغير الصور وإنشاء الفواتير تنتقل إلى طابور في Redis، فيرد الموقع على الزائر فوراً، وينجز عامل في الخلفية المهمة بعد لحظات. على هذا تعمل طوابير Laravel وأدوات مثل Sidekiq وBullMQ.
- العدّادات وحدود الطلبات: الأمر INCR يزيد العدّاد في خطوة واحدة لا تتداخل، فتعدّ به محاولات الدخول الفاشلة من كل عنوان IP وتوقفها بعد حد معين، أو تحد عدد طلبات واجهتك البرمجية في الدقيقة.
- لوحات الترتيب: المجموعة المرتبة تُبقي عناصرها مرتبة بدرجاتها دائماً، فتعرض «الأكثر مبيعاً هذا الأسبوع» دون أن تحسبها قاعدة البيانات مع كل زيارة.
- الرسائل الفورية: بالنشر والاشتراك (Pub/Sub) أو بالـ Streams تنقل الإشعارات بين أجزاء تطبيقك، كرسالة «طلب جديد» تظهر في لوحة المتجر لحظة الدفع.
- الأقفال بين العمليات: الأمر SET مع الخيار NX لا يكتب إلا إن كان المفتاح غير موجود، فيمنع عاملين من تنفيذ المهمة نفسها مرتين.
وهذا كله بأوامر قصيرة. هذه جلسة في redis-cli لمتجر حلويات في عمّان، يحفظ صفحة منتج عشر دقائق، ويعدّ محاولات الدخول الفاشلة، ويرتب منتجاته بمبيعاتها:
# صفحة منتج جاهزة، تبقى عشر دقائق ثم تُحذف وحدهاSET page:product:1042 "<html>…</html>" EX 600TTL page:product:1042# (integer) 600# محاولة دخول فاشلة من عنوان، والعدّاد يُصفَّر بعد ربع ساعةINCR login:fail:198.51.100.7EXPIRE login:fail:198.51.100.7 900 NX# المنتجات الأكثر مبيعاً هذا الأسبوعZINCRBY top:week 3 "product:1042"ZREVRANGE top:week 0 4 WITHSCORES
التخزين المؤقت الجانبي في PHP
هكذا يبدو النمط في شيفرة PHP بإضافة phpredis، ومثله في كل لغة:
$redis = new Redis();$redis->connect("127.0.0.1", 6379);$redis->auth(["app", getenv("REDIS_PASSWORD")]);$key = "product:1042";$product = $redis->get($key);if ($product === false) { // ليس في Redis: اسأل قاعدة البيانات واحفظ الجواب عشر دقائق $product = json_encode(loadProductFromDatabase(1042)); $redis->setex($key, 600, $product);}
والجزء الذي يُنسى: حين يتغير السعر في قاعدة البيانات، احذف المفتاح بالأمر DEL product:1042، أو اقبل أن يرى الزوار السعر القديم حتى تنتهي صلاحيته. واختر مدة الصلاحية بحسب ما يحتمله كل نوع من البيانات: ثوانٍ للمخزون، وساعات لصفحة «من نحن».
03متى لا يناسبك Redis
Redis أداة قوية، لكنه ليس الجواب عن كل شيء:
- بيانات أكبر من الذاكرة: كل بيانات Redis في RAM، فإن كانت بياناتك عشرات الغيغابايتات، فستكلفك الذاكرة أكثر بكثير من القرص.
- مصدر وحيد لبيانات لا تحتمل الضياع: Redis يكمّل قاعدة بياناتك ولا يحل محلها. الطلبات والفواتير وحسابات المستخدمين مكانها MariaDB أو PostgreSQL، وفي Redis نسخ منها أو بيانات يمكن إعادة بنائها.
- الاستعلامات المعقدة والتقارير: لا جداول في Redis ولا ربط بينها ولا SQL. التقارير التي تجمع وتصفّي وتربط مكانها قاعدة بيانات علائقية.
- موقع صغير يكفيه تخزين الصفحات: إن كان موقعك صفحات شبه ثابتة يخدمها LiteSpeed Cache، فقد لا يضيف Redis فرقاً يُذكر. قِس أولاً، ثم أضفه حيث يبطؤ الموقع.
04تثبيت Redis على خادم Linux
إن كان تطبيقك على خادم تديره بنفسك، مثل خادم VPS، فتثبيت Redis مسألة دقائق.
على Ubuntu وDebian
في مستودعات التوزيعة نسخة من Redis، لكنها قد تكون أقدم من آخر إصدار. ولآخر نسخة، أضف مستودع Redis الرسمي:
sudo apt-get install lsb-release curl gpgcurl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpgsudo chmod 644 /usr/share/keyrings/redis-archive-keyring.gpgecho "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.listsudo apt-get updatesudo apt-get install redis# يبدأ Redis وحده بعد التثبيت، فتأكد أنه يردredis-cli ping
يجب أن يرد الأمر الأخير بـ PONG. واسم الخدمة redis-server، وملف إعدادها /etc/redis/redis.conf.
على AlmaLinux وRocky Linux
في الإصدار 9 تجد Redis في مستودع AppStream. أما الإصدار 10، ومثله Red Hat Enterprise Linux 10، فيأتي بـ Valkey بدل Redis، وهو متوافق معه:
# AlmaLinux أو Rocky 9sudo dnf install redissudo systemctl enable --now redisredis-cli ping# AlmaLinux أو Rocky 10: الأداة valkey-cli، والإعداد في /etc/valkey/valkey.confsudo dnf install valkeysudo systemctl enable --now valkeyvalkey-cli ping
وتحقق من النسخة بالأمر redis-server --version. النسخة التي تأتي بها التوزيعة قد تكون أقدم من آخر إصدار، فتأكد أن التوزيعة ما زالت ترسل لها الإصلاحات الأمنية.
05اضبطه بأمان قبل أي شيء
صُمم Redis ليتحدث إليه عملاء موثوقون في شبكة موثوقة، لا ليُفتح للإنترنت. ومع ذلك وجدت شركة Wiz في 10/2025 نحو 330 ألف نسخة Redis مكشوفة على الإنترنت، منها نحو 60 ألفاً بلا أي كلمة مرور. ومن يصل إلى Redis مفتوح يستطيع أن يمسح بياناته كلها بأمر واحد، أو أن يستغل ثغرة فيه ليشغّل شيفرة على الخادم.
والخبر الجيد أن ملف redis.conf الذي يأتي مع Redis آمن نسبياً: يستمع على 127.0.0.1 وحده، و«الوضع المحمي» مفعّل فيه، فيرفض الاتصال من خارج الخادم ما دام بلا كلمة مرور. والخطر يبدأ حين يغيّر أحد ذلك ليتصل من خادم آخر. فثبّت هذه الأسطر:
# /etc/redis/redis.conf# لا تستمع إلا على الخادم نفسهbind 127.0.0.1 -::1protected-mode yesport 6379# إن كان التطبيق على الخادم نفسه، فالمقبس أسرع ويغلق الشبكة كلها:# port 0# unixsocket /run/redis/redis.sock# unixsocketperm 770
ومع المقبس، أضف مستخدم خادم الويب إلى مجموعة redis ليستطيع الاتصال، مثل: sudo usermod -aG redis www-data.
كلمات المرور والصلاحيات
منذ Redis 6 تُدار كلمات المرور بـ : مستخدمون بأسماء، لكل منهم كلمة مرور وأوامر ومفاتيح مسموح بها. أنشئ كلمة مرور قوية بالأمر ACL GENPASS، فهو يعطيك 64 حرفاً عشوائياً، ثم عرّف المستخدمين في ملف الإعداد:
# كلمة مرور عشوائية طويلة. شغّله مرتين، وضع الناتجين مكان APP_PASSWORD وADMIN_PASSWORDredis-cli ACL GENPASS# في /etc/redis/redis.conf:# المستخدم الافتراضي يدخل بلا كلمة مرور، فعطّلهuser default off# التطبيق: كل الأوامر إلا أوامر الإدارة ومسح القواعد كلهاuser app on >APP_PASSWORD ~* &* +@all -@admin -flushall# المدير: لك وحدك، من الطرفيةuser admin on >ADMIN_PASSWORD ~* &* +@all
ثم أعد تشغيل Redis، وادخل بعدها باسم المستخدم: redis-cli --user admin --askpass. وإن كان تطبيقك لا يرسل اسم مستخدم، فاترك المستخدم default مفعّلاً وضع له كلمة مرور بالسطر القديم requirepass، فهو يكفي لتطبيق واحد.
وثلاث قواعد أخرى:
- لا تشغّله بصلاحيات root: الحزم الرسمية تشغّله بمستخدم redis، فأبقِه كذلك.
- لا تفتح المنفذ 6379 للعالم: إن احتاج خادم آخر أن يصل إليه، فاجعله يستمع على عنوان الشبكة الخاصة، واسمح في الجدار الناري لعنوان ذلك الخادم وحده، وفعّل TLS إن مرّت البيانات على شبكة لا تثق بها.
- أبقِ الإعدادات المحمية مغلقة: منذ Redis 7 يمنع الإعداد enable-protected-configs، وهو معطّل افتراضياً، تغيير مجلد الحفظ واسم ملفه أثناء التشغيل. وهي الحيلة التي استعملها المهاجمون قديماً ليكتبوا مفاتيح SSH على الخادم، فلا تفتحه.
وتأكد من النتيجة: الأمر الأول يجب أن يُظهر Redis يستمع على 127.0.0.1 وحده، والثاني يجب أن يُرفض بخطأ NOAUTH:
# على أي عنوان يستمع Redis؟sudo ss -ltnp | grep 6379# بلا مستخدم وكلمة مرور يجب أن يُرفضredis-cli ping
06حدّد الذاكرة وسياسة الإخلاء
إن لم تحدد لـ Redis سقفاً، فسيأخذ من الذاكرة ما يشاء: على أنظمة 64 بت لا سقف افتراضياً، حتى يقتله النظام حين تنفد الذاكرة. فحدد له سقفاً بالإعداد maxmemory، واترك تحته هامشاً: يقول توثيق Redis إن كانت لديك 10 غيغابايت حرة فاجعل السقف 8 أو 9، لأن Redis يحتاج ذاكرة فوق بياناته، وقد تتضاعف حاجته أثناء الحفظ على القرص في تطبيق كثير الكتابة.
ثم اختر ، أي ما يفعله Redis حين يبلغ السقف:
| السياسة | ما تفعله | متى تختارها |
|---|---|---|
| noeviction | لا تحذف شيئاً، وترفض كل كتابة جديدة بخطأ | الافتراضية. للجلسات والطوابير التي لا تحتمل الضياع |
| allkeys-lru | تحذف المفاتيح التي لم تُطلب منذ أطول وقت | تخزين مؤقت خالص، وهي الخيار الآمن إن لم تكن متأكداً |
| allkeys-lfu | تحذف المفاتيح الأقل طلباً | حين تبقى قلة من البيانات مطلوبة دائماً |
| volatile-lru | مثل allkeys-lru، بين المفاتيح التي لها مدة صلاحية فقط | نسخة تجمع تخزيناً مؤقتاً وبيانات دائمة |
| volatile-ttl | تحذف المفاتيح الأقرب إلى انتهاء صلاحيتها | حين يحدد تطبيقك بنفسه ما يُستغنى عنه أولاً |
| allkeys-lrm | تحذف المفاتيح التي لم تُعدَّل منذ أطول وقت، ولو قُرئت | جديدة في Redis 8.6، لبيانات تُقرأ كثيراً وتتقادم |
وسياسات volatile لا تحذف إلا مفتاحاً له مدة صلاحية، فإن لم يكن في Redis مفتاح كهذا، تصرفت مثل noeviction ورفضت الكتابة.
# في redis.confmaxmemory 512mbmaxmemory-policy allkeys-lru# أو أثناء التشغيل، ثم احفظ التغيير في ملف الإعدادredis-cli --user admin --askpass CONFIG SET maxmemory 512mbredis-cli --user admin --askpass CONFIG REWRITE
والقاعدة العملية: لا تخلط التخزين المؤقت ببيانات لا تحتمل الضياع في نسخة واحدة. شغّل نسخة للتخزين المؤقت بسياسة allkeys-lru، ونسخة للجلسات والطوابير بسياسة noeviction، فلا يحذف الإخلاء جلسة زبون ليفسح لصفحة مخزنة.
07هل يحفظ Redis بياناته على القرص
بيانات Redis في الذاكرة، لكنه يستطيع أن يحفظها على القرص ليستعيدها بعد إعادة التشغيل، بطريقتين:
- لقطات RDB: يكتب نسخة كاملة من بياناته في ملف واحد مضغوط كل فترة. والإعداد المقترح في redis.conf يحفظ بعد ساعة إن تغيّر مفتاح واحد، وبعد 5 دقائق إن تغيّر 100، وبعد دقيقة إن تغيّر 10,000، فقد تضيع آخر الدقائق إن توقف فجأة. وملفها ممتاز للنسخ الاحتياطي.
- سجل AOF: يكتب كل أمر يغيّر البيانات في سجل يعيد تنفيذه عند التشغيل. وبالإعداد appendfsync everysec، وهو المقترح، لا تخسر أكثر من ثانية من الكتابات.
ويمكن الجمع بينهما، أو إيقاف الحفظ كله لتخزين مؤقت خالص يُبنى من جديد. اختر بحسب ما تخزنه:
| ما تخزنه | الحفظ المقترح |
|---|---|
| صفحات أو استعلامات أو كائنات مخزنة مؤقتاً | بلا حفظ، أو RDB لتبدأ ممتلئة بعد إعادة التشغيل |
| جلسات المستخدمين | RDB، أو AOF إن كان خروج الزوار من حساباتهم مزعجاً |
| طوابير المهام | AOF مع RDB، فالمهمة الضائعة بريد لم يُرسل |
| بيانات لا تحتمل الضياع | مكانها قاعدة بياناتك الرئيسية، لا Redis وحده |
# تخزين مؤقت خالص: لا لقطات ولا سجلsave ""appendonly no# جلسات وطوابير: لقطات، وسجل يُكتب على القرص كل ثانيةsave 3600 1 300 100 60 10000appendonly yesappendfsync everysec
وملف RDB آمن للنسخ أثناء عمل Redis، لأنه يُكتب باسم مؤقت ثم يحل محل القديم دفعة واحدة، فانسخه كل يوم إلى خارج الخادم. ومنذ Redis 8.10 تأخذ أوامر BACKUP نسخة كاملة تشمل آخر الكتابات دون أن تتوقف الكتابة.
08اضبط النظام حول Redis
ثلاثة إعدادات في Linux يوصي بها توثيق Redis، ويكتب Redis في سجله تحذيراً حين يجد ما يخالف بعضها:
- vm.overcommit_memory = 1: ليحفظ في الخلفية ينسخ Redis نفسه في عملية فرعية. ومع الإعداد الافتراضي قد يرفض Linux النسخ إن لم تكفِ الذاكرة الحرة لنسخة كاملة، فيفشل الحفظ. والقيمة 1 تحل ذلك.
- Transparent Huge Pages: ميزة في النواة تزيد زمن الاستجابة واستهلاك الذاكرة. يعطّلها Redis الحديث لعمليته وحدها بالإعداد disable-thp، ويوصي توثيقه بتعطيلها للنظام إن ظهر تحذيرها.
- ذاكرة swap: يوصي التوثيق بأن تكون موجودة، فإن تجاوز Redis الذاكرة بطؤ بدل أن يقتله النظام، فتنتبه وتعالج.
# دائماً، ويبقى بعد إعادة تشغيل الخادمecho "vm.overcommit_memory = 1" | sudo tee /etc/sysctl.d/90-redis.confsudo sysctl --system# إن ظهر تحذير THP في السجل (يعود بعد إعادة تشغيل الخادم)echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled# ثم أعد تشغيل Redis وراجع سجلهsudo systemctl restart redis-serversudo tail -n 30 /var/log/redis/redis-server.log
09اربط تطبيقك بـ Redis
تحتاج لغة تطبيقك إلى مكتبة تتحدث إلى Redis. في PHP هي إضافة phpredis، واسمها redis في قائمة الإضافات، فتأكد أنها مفعّلة لنسخة PHP التي يعمل بها موقعك.
WordPress
ثبّت إضافة Redis Object Cache، ثم أضف إعدادات الاتصال إلى ملف wp-config.php، قبل السطر الذي فيه stop editing:
define( "WP_REDIS_HOST", "127.0.0.1" );define( "WP_REDIS_PORT", 6379 );// اسم المستخدم وكلمة المرور من إعداد ACLdefine( "WP_REDIS_PASSWORD", [ "app", "APP_PASSWORD" ] );define( "WP_REDIS_DATABASE", 0 );// بادئة تميّز مفاتيح هذا الموقع إن شاركته مواقع أخرى في Redisdefine( "WP_REDIS_PREFIX", "knafeh-amman:" );
ثم فعّله من صفحة الإضافة في لوحة التحكم، أو بالأمرين wp redis enable وwp redis status من WP-CLI.
Laravel
في ملف .env:
REDIS_CLIENT=phpredisREDIS_HOST=127.0.0.1REDIS_PORT=6379REDIS_USERNAME=appREDIS_PASSWORD=APP_PASSWORD# التخزين المؤقت والجلسات والطوابير كلها على RedisCACHE_STORE=redisSESSION_DRIVER=redisQUEUE_CONNECTION=redis
ثم امسح الإعدادات المخزنة بالأمر php artisan config:clear. ويضع Laravel مفاتيح التخزين المؤقت في القاعدة 1، بعيداً عن الطوابير في القاعدة 0، فلا يمسح الأمر php artisan cache:clear مهامك المنتظرة. ومع مقبس Unix، اجعل REDIS_HOST مسار المقبس وREDIS_PORT صفراً.
Node.js
import { createClient } from "redis";// مثل redis://app:[email protected]:6379/0const redis = createClient({ url: process.env.REDIS_URL });redis.on("error", (err) => console.error("Redis:", err));await redis.connect();await redis.set("visits:today", "0", { EX: 86400 });await redis.incr("visits:today");
10راقب Redis وقِس أثره
أهم رقم في Redis المستعمل للتخزين المؤقت هو نسبة الإصابة: كم مرة وجد التطبيق ما طلبه في Redis من كل مئة محاولة. تحسبها من INFO stats بقسمة keyspace_hits على مجموع keyspace_hits وkeyspace_misses. والأوامر التالية تكفي لمعظم الفحوص:
redis-cli --user admin --askpass# الذاكرة المستعملة والسقف ونسبة التجزئةINFO memory# الإصابات والإخفاقات، والمفاتيح المحذوفة بالإخلاء والمنتهية صلاحيتهاINFO stats# أبطأ عشرة أوامر (كل ما تجاوز 10 ملّي ثوانٍ افتراضياً)SLOWLOG GET 10# تشخيص زمن الاستجابة والذاكرة بكلام مفهومLATENCY DOCTORMEMORY DOCTOR
ومن الطرفية يبحث redis-cli --bigkeys عن أكبر المفاتيح، ويقيس redis-cli --latency زمن الرد باستمرار. فإن كانت نسبة الإصابة أقل مما تتوقع، فانظر إلى evicted_keys: رقم كبير يعني أن الذاكرة لا تكفي أو أن السياسة لا تناسب طريقة القراءة. وإن كان صغيراً وexpired_keys كبيراً، فمدة الصلاحية أقصر من اللازم.
- المشكلةOOM command not allowed when used memory > maxmemory
- الحلبلغ Redis سقفه وسياسته noeviction. ارفع السقف، أو اختر allkeys-lru إن كانت النسخة للتخزين المؤقت، وابحث عن المفاتيح الكبيرة بـ --bigkeys.
- المشكلةMISCONF Redis is configured to save RDB snapshots…
- الحلفشل الحفظ على القرص، فأوقف Redis الكتابة حمايةً لبياناتك. راجع سجله: قرص ممتلئ، أو صلاحيات مجلد الحفظ، أو vm.overcommit_memory.
- المشكلةNOAUTH Authentication required أو WRONGPASS
- الحلالتطبيق لا يرسل كلمة المرور، أو يرسلها دون اسم المستخدم. راجع إعداد الاتصال في التطبيق.
- المشكلةRedis يبطؤ فجأة بين حين وآخر
- الحلالأمر KEYS على قاعدة كبيرة يوقف كل شيء حتى ينتهي، فاستعمل SCAN بدلاً منه. وراجع SLOWLOG، وأوقات الحفظ في الخلفية.
- المشكلةPermission denied على مقبس Unix
- الحلمستخدم خادم الويب ليس في مجموعة redis، أو صلاحيات المقبس في unixsocketperm أضيق من اللازم.
11حدّث Redis وتابع ثغراته
في 3/10/2025 أصلح Redis ثغرة سمّاها مكتشفوها في Wiz «RediShell»، رقمها CVE-2025-49844: خلل في محرك Lua عمره نحو 13 عاماً، قُيّم 10 من 10، يسمح لمن يستطيع تشغيل سكربت Lua بأن يشغّل شيفرة على الخادم. والإصلاح في النسخ 8.2.2 و8.0.4 و7.4.6 و7.2.11 و6.2.20، وأصدر Valkey إصلاحه في اليوم نفسه. ولم تتوقف الإصلاحات بعدها: في 5/2026 سدّت النسخة 8.6.3 خمس ثغرات قد تؤدي إلى تشغيل شيفرة عن بعد، منها CVE-2026-23631 في Lua أيضاً، وتبعتها إصلاحات أمنية أخرى في 7/2026 و8/2026.
أغلب هذه الثغرات يحتاج من المهاجم أن يتصل بـ Redis أولاً، ولهذا يحميك إعداد الشبكة وكلمات المرور في هذا المقال من معظمها. لكنه لا يغني عن التحديث:
- اعرف نسختك: بالأمر redis-server --version، أو INFO server من داخل redis-cli.
- حدّث من مصدرك: sudo apt-get update ثم sudo apt-get upgrade على Ubuntu وDebian، أو sudo dnf upgrade على AlmaLinux وRocky، ثم أعد تشغيل الخدمة.
- ابقَ على فرع مدعوم: أحدث إصدار مستقر اليوم 8.10 من 7/2026، وما زالت فروع 8.2 حتى 8.8 تتلقى الإصلاحات. أما نسخ التوزيعات فتصلها إصلاحاتها من التوزيعة نفسها.
12قائمة مختصرة قبل أن تبدأ
- 01قِس أولاً: اعرف أبطأ صفحاتك واستعلاماتك قبل أن تضيف Redis، لتعرف ما الذي ستسرّعه.
- 02أغلقه على الخادم: bind على 127.0.0.1 أو مقبس Unix، والوضع المحمي مفعّل.
- 03مستخدم وكلمة مرور: عطّل المستخدم الافتراضي، وأعطِ تطبيقك مستخدماً بلا أوامر إدارة.
- 04سقف للذاكرة: maxmemory مع هامش، وسياسة إخلاء تناسب ما تخزنه.
- 05حفظ بحسب الحاجة: لا حفظ للتخزين المؤقت الخالص، وAOF للطوابير والجلسات.
- 06راقب وحدّث: نسبة الإصابة والمفاتيح المحذوفة كل فترة، وكل إصدار أمني فور صدوره.
13Redis مجاناً مع استضافة إليفانتي المشتركة
كل ما سبق تحتاجه حين تدير خادمك بنفسك. أما إن كان موقعك على الاستضافة المشتركة لدى إليفانتي، فـ Redis مضمّن مجاناً في كل خطط استضافة cPanel، نسخةً خاصة بحسابك تديرها من cPanel دون أن تكتب سطر إعداد واحداً:
- تشغيل بنقرة: تفعّل Redis وتشغّله وتوقفه من cPanel، وترى حالته في لمحة: يعمل، أو متوقف، أو ذاكرته مرتفعة.
- نسخة معزولة لحسابك: لكل حساب نسخة Redis منفصلة بكلمة مرور خاصة، تبقى مخفية حتى تطلب إظهارها، ويتصل بها موقعك من الخادم نفسه.
- إعدادات جاهزة بنقرة: لـ WordPress وLaravel وMagento ولجلسات المستخدمين، أو إعداد عام. كل منها يضبط سياسة الذاكرة والخيارات المناسبة لاستخدامه.
- ضبط متقدم: سقف الذاكرة وسياسة الإخلاء وعدد قواعد البيانات ومهلة الاتصال وعدد الاتصالات والحفظ على القرص، ضمن حدود خطتك.
- يتعرف على تطبيقك: يفحص مجلد موقعك فيكتشف WordPress، ومعه LiteSpeed Cache، وLaravel وMagento، ويعطيك إعدادات الاتصال بحسابك جاهزة للصق في WordPress وLaravel وMagento وPHP وNode.js وPython وLiteSpeed Cache.
- درجة صحة وقائمة تحقق: درجة من 100 تلخّص حالة Redis، وقائمة تتأكد أنه مفعّل ويعمل وبكلمة مرور، ومع كل بند إرشاد لإصلاحه.
- مراقبة لحظة بلحظة: رسوم بيانية للذاكرة وذروتها والاتصالات ونسبة الإصابة وزمن الاستجابة ونشاط الأوامر، مع سجل لآخر 24 ساعة وآخر 7 أيام.
- نسخ احتياطية واستعادة: تأخذ نسخة من بيانات Redis متى شئت وتستعيدها من cPanel، ويحفظ النظام لقطة من البيانات الحالية قبل أي استعادة.
- تقرير تشخيص للدعم: تصدره بصيغة JSON وكلمات المرور فيه مخفية، فترفقه بتذكرتك بأمان.
ولأن خادم الويب في استضافتنا LiteSpeed، تجد LiteSpeed Cache وRedis معاً في الخطط الثلاث: الأول يخزن الصفحات كاملة، والثاني يحفظ الكائنات ونتائج الاستعلامات لما لا يُخزَّن من الصفحات. وتذكّر أن تفعّل إضافة redis لنسخة PHP من Select PHP Version في cPanel. وإن كان تطبيقك على CoreVPS، فلك صلاحيات root كاملة، فاضبط Redis كما في هذا المقال. وفريق الدعم الفني معك على مدار الساعة إن احتجت مساعدة في ربط موقعك بـ Redis.




