إدارة مفاتيح Redis

المفاتيح هي الوحدة الأساسية للبيانات في Redis. يغطي هذا الدرس عمليات إدارة المفاتيح.

عمليات المفاتيح الأساسية

تعيين المفاتيح

REDIS
# تعيين سلسلة
SET user:1 "Alice"

# تعيين تجزئة
HSET user:2 name "Bob" age 30

# تعيين قائمة
LPUSH articles "article1" "article2"

# تعيين مجموعة
SADD tags:article1 "redis" "database"

# تعيين مجموعة مرتبة
ZADD leaderboard 100 "player1"

الحصول على المفاتيح

REDIS
# الحصول على سلسلة
GET user:1

# الحصول على تجزئة
HGETALL user:2

# الحصول على قائمة
LRANGE articles 0 -1

# الحصول على مجموعة
SMEMBERS tags:article1

# الحصول على مجموعة مرتبة
ZRANGE leaderboard 0 -1 WITHSCORES

حذف المفاتيح

REDIS
# حذف مفتاح واحد
DEL user:1
(integer) 1  # يُرجع عدد المفاتيح المحذوفة

# حذف مفاتيح متعددة
DEL user:2 user:3
(integer) 2

# حذف مفتاح غير موجود
DEL notexist
(integer) 0

التحقق من وجود مفتاح

REDIS
SET mykey "hello"

EXISTS mykey
(integer) 1  # موجود

EXISTS notexist
(integer) 0  # غير موجود

# التحقق من مفاتيح متعددة (يُرجع عدد المفاتيح الموجودة)
EXISTS mykey mykey2 mykey3
(integer) 1  # فقط mykey موجود

التحقق من نوع المفتاح

REDIS
SET mystring "hello"
TYPE mystring          # string

HSET myhash field "value"
TYPE myhash            # hash

LPUSH mylist "a"
TYPE mylist            # list

SADD myset "a"
TYPE myset             # set

ZADD myzset 1 "a"
TYPE myzset            # zset

TYPE notexist          # none

اصطلاحات تسمية المفاتيح

التسمية الجيدة للمفاتيح تجعل إدارة البيانات أكثر وضوحًا.

التنسيق الموصى به

business:object:ID[:property]

أمثلة

REDIS
# معلومات المستخدم
user:1                  # معلومات المستخدم 1 الأساسية
user:1:profile          # الملف الشخصي التفصيلي للمستخدم 1
user:1:settings         # إعدادات المستخدم 1

# المقالات
article:123             # محتوى المقالة 123
article:123:comments    # قائمة تعليقات المقالة 123
article:123:views       # عدد مشاهدات المقالة 123

# عربة التسوق
cart:user:1             # عربة تسوق المستخدم 1

# الجلسات
session:token:abc123    # رمز الجلسة

# التخزين المؤقت
cache:api:user:1        # ذاكرة مؤقتة لواجهة API للمستخدم 1
cache:page:home         # ذاكرة مؤقتة للصفحة الرئيسية

# الأقفال
lock:order:123          # قفل للطلب 123

إرشادات التسمية

الإرشاد مثال الوصف
استخدم النقطتين كفواصل user:1:profile تسلسل هرمي واضح
استخدم بادئات ذات معنى cache:، session:، lock: تمييز الأغراض المختلفة
حافظ على الاتساق user:1، user:2 تنسيق موحد
تجنب الطول الزائد u:1:p قصير جدًا غير واضح، طويل جدًا يستهلك ذاكرة
تجنب الأحرف الخاصة user-1 استخدم الواصلات أو النقطتين، تجنب المسافات
💡 طول المفتاح: أسماء المفاتيح تستهلك ذاكرة. وازن بين الوضوح والإيجاز. المفاتيح المستخدمة بكثرة يمكن أن تكون أقصر.

انتهاء الصلاحية

يمكن لـ Redis تعيين TTL (وقت الحياة) للمفاتيح، وحذفها تلقائيًا عند انتهاء صلاحيتها.

تعيين انتهاء الصلاحية

REDIS
SET session:token123 "user_data"

# الطريقة 1: EXPIRE (ثوانٍ)
EXPIRE session:token123 3600    # تنتهي صلاحيته بعد ساعة

# الطريقة 2: EXPIREAT (طابع زمني، ثوانٍ)
EXPIREAT session:token123 1700000000

# الطريقة 3: PEXPIRE (ميلي ثانية)
PEXPIRE session:token123 3600000

# الطريقة 4: PEXPIREAT (طابع زمني، ميلي ثانية)
PEXPIREAT session:token123 1700000000000

# الطريقة 5: تعيين انتهاء الصلاحية مع SET
SET cache:key "value" EX 60     # تنتهي صلاحيته بعد 60 ثانية
SET cache:key "value" PX 60000  # تنتهي صلاحيته بعد 60000 ميلي ثانية

التحقق من انتهاء الصلاحية

REDIS
# TTL: يُرجع الوقت المتبقي (ثوانٍ)
TTL session:token123
(integer) 3500  # 3500 ثانية متبقية

# PTTL: يُرجع الوقت المتبقي (ميلي ثانية)
PTTL session:token123
(integer) 3500000

# قيم الإرجاع الخاصة
TTL noexpire
(integer) -1    # المفتاح موجود لكن ليس له انتهاء صلاحية

TTL notexist
(integer) -2    # المفتاح غير موجود

إزالة انتهاء الصلاحية

REDIS
# PERSIST: إزالة انتهاء الصلاحية، جعل المفتاح دائمًا
PERSIST session:token123
(integer) 1  # تمت الإزالة بنجاح

PERSIST notexist
(integer) 0  # المفتاح غير موجود

حالات استخدام انتهاء الصلاحية

السيناريو TTL مثال
جلسة 30 دقيقة SET session:token "data" EX 1800
رمز تحقق 5 دقائق SET code:phone:138xxxx "123456" EX 300
ذاكرة مؤقتة ساعة SET cache:api:user:1 "data" EX 3600
تحديد معدل دقيقة SET limit:user:1 "10" EX 60
قفل موزع 10 ثوانٍ SET lock:resource "locked" NX EX 10
⚠️ ملاحظة: دقة انتهاء الصلاحية بالميلي ثانية، لكن الحذف الفعلي قد يتأخر (حذف كسول + حذف دوري).

إعادة تسمية المفاتيح

RENAME: إعادة تسمية مفتاح

REDIS
SET oldkey "value"

RENAME oldkey newkey
OK

GET newkey
"value"

GET oldkey
(nil)  # oldkey لم يعد موجودًا
⚠️ ملاحظة: إذا كان newkey موجودًا بالفعل، فإن RENAME ستستبدله!

RENAMENX: إعادة تسمية فقط إذا كان المفتاح الجديد غير موجود

REDIS
SET key1 "value1"
SET key2 "value2"

RENAMENX key1 key2
(integer) 0  # key2 موجود بالفعل، فشلت إعادة التسمية

GET key1
"value1"  # key1 لا يزال موجودًا

GET key2
"value2"  # key2 لم يتم استبداله

ترحيل المفاتيح

MOVE: نقل مفتاح إلى قاعدة بيانات أخرى

REDIS
# في DB 0
SET mykey "value"

# النقل إلى DB 1
MOVE mykey 1
(integer) 1  # نجاح

# التبديل إلى DB 1
SELECT 1
OK

GET mykey
"value"
⚠️ ملاحظة: MOVE غير متاح في وضع المجموعة.

DUMP + RESTORE: التسلسل وإلغاء التسلسل

REDIS
# تسلسل مفتاح
SET mykey "hello"
DUMP mykey
# يُرجع بيانات ثنائية مسلسلة

# الاستعادة إلى مفتاح جديد
RESTORE newkey 0 "\x00\x05hello\t\x00\xf5\xbd\xba\xab\xdc\xa6\xdec"
OK

MIGRATE: ترحيل مفتاح إلى مثيل Redis آخر

REDIS
# ترحيل mykey إلى 192.168.1.100:6379
MIGRATE 192.168.1.100 6379 mykey 0 5000
OK

# شرح المعاملات
# MIGRATE host port key destination-db timeout

فرز المفاتيح

يمكن لأمر SORT فرز القوائم والمجموعات والمجموعات المرتبة.

الفرز الأساسي

REDIS
# فرز قائمة
LPUSH mylist 3 1 4 1 5 9 2 6
SORT mylist
# 1) "1"
# 2) "1"
# 3) "2"
# 4) "3"
# 5) "4"
# 6) "5"
# 7) "6"
# 8) "9"

# فرز تنازلي
SORT mylist DESC
# 1) "9"
# 2) "6"
# 3) "5"
# ...

# فرز مجموعة
SADD myset 5 2 8 1 9
SORT myset
# 1) "1"
# 2) "2"
# 3) "5"
# 4) "8"
# 5) "9"

الفرز بقيم خارجية

REDIS
# قائمة معرفات الطلاب
LPUSH students "student1" "student2" "student3"

# درجات الطلاب
SET student1:score 85
SET student2:score 92
SET student3:score 78

# الفرز حسب الدرجة
SORT students BY *:score
# 1) "student3"  # 78 نقطة
# 2) "student1"  # 85 نقطة
# 3) "student2"  # 92 نقطة

# الحصول على القيم الخارجية
SORT students BY *:score GET *:score
# 1) "78"
# 2) "85"
# 3) "92"

حفظ نتائج الفرز

REDIS
# الفرز والحفظ في مفتاح جديد
SORT mylist DESC STORE sorted_list
(integer) 8

LRANGE sorted_list 0 -1
# 1) "9"
# 2) "6"
# ...

البحث عن المفاتيح

KEYS: البحث عن المفاتيح المطابقة

REDIS
# تعيين بعض بيانات الاختبار
SET user:1 "Alice"
SET user:2 "Bob"
SET user:3 "Charlie"
SET product:1 "iPhone"
SET product:2 "iPad"

# البحث عن جميع المفاتيح
KEYS *
# 1) "user:1"
# 2) "user:2"
# 3) "user:3"
# 4) "product:1"
# 5) "product:2"

# البحث عن المفاتيح المطابقة لنمط
KEYS user:*
# 1) "user:1"
# 2) "user:2"
# 3) "user:3"

KEYS *:1
# 1) "user:1"
# 2) "product:1"

KEYS user:[1-2]
# 1) "user:1"
# 2) "user:2"
⚠️ تحذير: KEYS يمسح قاعدة البيانات بأكملها. إنه بطيء جدًا مع مجموعات البيانات الكبيرة — لا تستخدمه في الإنتاج!

SCAN: التكرار عبر المفاتيح (موصى به)

SCAN هو بديل آمن لـ KEYS، يستخدم التكرار القائم على المؤشر.

REDIS
# بدء التكرار، يُرجع المؤشر وقائمة المفاتيح
SCAN 0
1) "5"          # مؤشر للتكرار التالي
2) 1) "user:1"
   2) "user:2"

# متابعة التكرار
SCAN 5
1) "0"          # مؤشر 0 يعني اكتمال التكرار
2) 1) "user:3"
   2) "product:1"

# نمط المطابقة
SCAN 0 MATCH user:*
1) "3"
2) 1) "user:1"
   2) "user:2"

# تحديد عدد العناصر لكل تكرار
SCAN 0 COUNT 100

أوامر عائلة SCAN

REDIS
# تكرار عناصر المجموعة
SSCAN myset 0

# تكرار حقول التجزئة
HSCAN myhash 0

# تكرار عناصر المجموعة المرتبة
ZSCAN myzset 0
💡 ميزة SCAN: لا يحظر الخادم؛ يمكن معالجة أعداد كبيرة من المفاتيح على دفعات.

إشعارات مساحة المفاتيح

يمكن لـ Redis إخطار العملاء بأحداث تغيير المفاتيح.

تكوين إشعارات مساحة المفاتيح

REDIS
# عرض الإعدادات
CONFIG GET notify-keyspace-events
1) "notify-keyspace-events"
2) ""  # معطل افتراضيًا

# تمكين جميع الإشعارات
CONFIG SET notify-keyspace-events AKE
OK

أنواع الإشعارات

الحرف نوع الإشعار الوصف
K Keyspace إشعار مساحة المفاتيح (keyspace@)
E Keyevent إشعار حدث المفتاح (keyevent@)
A الكل جميع الإشعارات (مكافئ لـ KE$glsh)
$ String أوامر السلسلة
l List أوامر القائمة
s Set أوامر المجموعة
h Hash أوامر التجزئة
z Sorted Set أوامر المجموعة المرتبة
x Expired أحداث انتهاء الصلاحية
e Evicted أحداث الإخلاء (إخلاء الذاكرة)

الاشتراك في الإشعارات

REDIS
# الاشتراك في إشعارات مساحة المفاتيح (جميع الأحداث لمفتاح)
SUBSCRIBE __keyspace@0__:mykey

# الاشتراك في إشعارات حدث المفتاح (حدث محدد لجميع المفاتيح)
SUBSCRIBE __keyevent@0__:set

مثال:مراقبة المفاتيح منتهية الصلاحية

REDIS
# التكوين: تمكين إشعارات انتهاء الصلاحية
CONFIG SET notify-keyspace-events Ex
OK

# العميل 1: الاشتراك في أحداث انتهاء الصلاحية
SUBSCRIBE __keyevent@0__:expired

# العميل 2: تعيين مفتاح مع انتهاء صلاحية
SET temp "value" EX 5

# العميل 1 يستلم:
# 1) "message"
# 2) "__keyevent@0__:expired"
# 3) "temp"  # اسم المفتاح منتهي الصلاحية
▶ جرّب الكود

معلومات المفتاح

أمر OBJECT

REDIS
SET mykey "hello"

# عرض الترميز الداخلي للمفتاح
OBJECT ENCODING mykey
"embstr"

# عرض عدد المراجع
OBJECT REFCOUNT mykey
(integer) 1

# عرض وقت الخمول (ثوانٍ)
OBJECT IDLETIME mykey
(integer) 10

أمر MEMORY (Redis 4.0+)

REDIS
SET mykey "hello world hello world hello world"

# عرض استخدام الذاكرة للمفتاح
MEMORY USAGE mykey
(integer) 56  # بايت

# عرض تفاصيل تخصيص الذاكرة
MEMORY STATS

STRLEN: الحصول على طول السلسلة

REDIS
SET mykey "Hello Redis"
STRLEN mykey
(integer) 11

العمليات الدفعية

تعيين دفعات

REDIS
MSET key1 "value1" key2 "value2" key3 "value3"
OK

الحصول على دفعات

REDIS
MGET key1 key2 key3
1) "value1"
2) "value2"
3) "value3"

# بما في ذلك المفاتيح غير الموجودة
MGET key1 key2 notexist key3
1) "value1"
2) "value2"
3) (nil)
4) "value3"

حذف دفعات

REDIS
# حذف مفاتيح متعددة
DEL key1 key2 key3
(integer) 3

❓ أسئلة شائعة

س لماذا أمر KEYS بطيء؟
ج KEYS يمسح قاعدة البيانات بأكملها بتعقيد O(N). إنه يحظر Redis عندما تكون مجموعة البيانات كبيرة. استخدم SCAN بدلاً من ذلك。
س متى يتم حذف المفاتيح منتهية الصلاحية؟
ج يستخدم Redis حذفًا كسولًا + حذفًا دوريًا. يتحقق من انتهاء الصلاحية عند الوصول إلى مفتاح، ويتحقق دوريًا من عينة عشوائية من المفاتيح في الخلفية。
س كيف أحذف دفعة من المفاتيح المطابقة لنمط؟
ج

BASH
redis-cli --scan --pattern "prefix:*" | xargs redis-cli DEL

س:ما هو أقصى طول لاسم المفتاح؟ ج:نظريًا غير محدود، لكن يُوصى بإبقائها قصيرة (تستهلك ذاكرة).

س كيف أحسب المفاتيح من نوع محدد؟
ج لا يوجد أمر مباشر. تحتاج إلى التكرار باستخدام SCAN والتحقق باستخدام TYPE。

📖 ملخص

  • عمليات المفاتيح الأساسية: SET، GET، DEL، EXISTS، TYPE
  • تسمية المفاتيح: استخدم النقطتين كفواصل مع بادئات ذات معنى
  • انتهاء الصلاحية: EXPIRE، TTL، PERSIST
  • البحث عن المفاتيح: KEYS (استخدم بحذر)، SCAN (موصى به)
  • ترحيل المفاتيح: MOVE، MIGRATE، DUMP/RESTORE
  • فرز المفاتيح: أمر SORT
  • إشعارات مساحة المفاتيح: استمع إلى أحداث تغيير المفاتيح

📝 تمارين

  1. تمرين التسمية: صمم اصطلاحات تسمية المفاتيح لموقع تجارة إلكترونية (المستخدمون، المنتجات، الطلبات، عربات التسوق)
  2. تمرين انتهاء الصلاحية: عيّن مفتاحًا مع TTL، تحقق من الوقت المتبقي باستخدام TTL، وتحقق بعد انتهاء الصلاحية
  3. تمرين SCAN: أنشئ 100 مفتاح واستخدم SCAN للتكرار عبرها جميعًا
  4. العمليات الدفعية: استخدم MSET لتعيين 10 مفاتيح و MGET لاسترجاعها

الدرس التالي

في الدرس التالي، سنتعلم سلاسل Redis (الجزء 1)، والتعمق في عمليات السلاسل الأساسية.

100%