سلاسل Redis (الجزء 1)

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

أمر SET بالتفصيل

يقوم أمر SET بتعيين زوج مفتاح-قيمة وهو أمر Redis الأكثر استخدامًا.

الاستخدام الأساسي

REDIS
SET mykey "Hello Redis"
OK

SET ناجحة تُرجع OK.

معاملات أمر SET

يدعم SET معاملات اختيارية متعددة لاستراتيجيات تعيين مختلفة:

REDIS
# EX: تعيين انتهاء الصلاحية بالثواني
SET session:token "user_data" EX 3600

# PX: تعيين انتهاء الصلاحية بالميلي ثانية
SET cache:key "value" PX 60000

# NX: التعيين فقط إذا كان المفتاح غير موجود
SET lock:resource "locked" NX

# XX: التعيين فقط إذا كان المفتاح موجودًا
SET counter 100 XX

# مدمج: تعيين قفل مع انتهاء صلاحية
SET lock:order:123 "locked" NX EX 10

مرجع المعاملات

المعامل الوصف مثال
EX seconds تعيين انتهاء الصلاحية بالثواني SET key value EX 60
PX milliseconds تعيين انتهاء الصلاحية بالميلي ثانية SET key value PX 60000
EXAT timestamp تعيين انتهاء الصلاحية بطابع زمني Unix (ثوانٍ) SET key value EXAT 1700000000
PXAT timestamp تعيين انتهاء الصلاحية بطابع زمني Unix (ميلي ثانية) SET key value PXAT 1700000000000
NX التعيين فقط إذا كان المفتاح غير موجود SET key value NX
XX التعيين فقط إذا كان المفتاح موجودًا SET key value XX
GET إرجاع القيمة القديمة (Redis 6.2+) SET key value GET
KEEPTTL الحفاظ على TTL الحالي SET key value KEEPTTL
💡 تنفيذ القفل الموزع: SET lock:resource "value" NX EX 10 هو الطريقة الكلاسيكية لتنفيذ الأقفال الموزعة. NX يضمن الذرية، EX يمنع الجمود.

مثال:تنفيذ قفل موزع

BASH
# استحواذ على القفل (تعيين فقط إذا كان القفل غير موجود، تحرير تلقائي بعد 10 ثوانٍ)
SET lock:product:123 "order_process" NX EX 10

# تحرير القفل (حذف المفتاح)
DEL lock:product:123
▶ جرّب الكود

أمر GET بالتفصيل

يسترجع أمر GET قيمة المفتاح.

الاستخدام الأساسي

REDIS
SET mykey "Hello Redis"
GET mykey
"Hello Redis"

المفتاح غير موجود

REDIS
GET notexist
(nil)

يُرجع (nil) عندما لا يكون المفتاح موجودًا.

متغيرات أمر GET

REDIS
# GETSET: الحصول على القيمة القديمة وتعيين قيمة جديدة
SET counter 100
GETSET counter 0
"100"  # يُرجع القيمة القديمة

GET counter
"0"    # تم التحديث إلى القيمة الجديدة

# GETRANGE: الحصول على سلسلة فرعية
SET message "Hello Redis World"
GETRANGE message 0 4
"Hello"

GETRANGE message 6 10
"Redis"
⚠️ ملاحظة: فهارس GETRANGE تبدأ من 0 وتتضمن الموضع النهائي. GETRANGE key 0 4 يحصل على الأحرف في المواضع 0 إلى 4 (5 أحرف إجمالاً).

DEL - حذف المفاتيح

يقوم أمر DEL بحذف مفتاح أو أكثر.

حذف مفتاح واحد

REDIS
SET temp "temporary"
DEL temp
(integer) 1  # يُرجع عدد المفاتيح المحذوفة

حذف مفاتيح متعددة

REDIS
SET key1 "value1"
SET key2 "value2"
SET key3 "value3"

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

حذف مفتاح غير موجود

REDIS
DEL notexist
(integer) 0  # تم حذف 0 مفاتيح
💡 قيمة الإرجاع: DEL يُرجع عدد المفاتيح المحذوفة فعليًا، وليس القيمة المحذوفة.

MSET و MGET عمليات دفعات

يمكن لـ MSET و MGET تعيين أو الحصول على أزواج مفتاح-قيمة متعددة في عملية واحدة، مما يقلل من جولات الشبكة.

MSET تعيين دفعات

REDIS
MSET user:1:name "Alice" user:1:age "25" user:1:city "Beijing"
OK

# مكافئ لـ
SET user:1:name "Alice"
SET user:1:age "25"
SET user:1:city "Beijing"

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

REDIS
MGET user:1:name user:1:age user:1:city
1) "Alice"
2) "25"
3) "Beijing"

# بما في ذلك المفاتيح غير الموجودة
MGET user:1:name user:1:email user:1:age
1) "Alice"
2) (nil)  # المفتاح غير موجود
3) "25"

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

REDIS
# التعيين فقط إذا كانت جميع المفاتيح غير موجودة
MSETNX key1 "value1" key2 "value2"
(integer) 1  # نجاح

# المحاولة مرة أخرى (key1 و key2 موجودان بالفعل)
MSETNX key1 "new1" key3 "value3"
(integer) 0  # فشل، key1 موجود بالفعل

# تحقق: key3 لم يتم تعيينه
GET key3
(nil)
⚠️ ملاحظة: MSETNX ذرية — إما أن تنجح كلها أو تفشل كلها.

STRLEN - الحصول على الطول

STRLEN يُرجع طول قيمة السلسلة (بالبايت).

الاستخدام الأساسي

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

SET text "Hello"
STRLEN text
(integer) 5

المفتاح غير موجود

REDIS
STRLEN notexist
(integer) 0

APPEND - الإلحاق بالسلسلة

يقوم أمر APPEND بإلحاق محتوى بنهاية السلسلة.

الاستخدام الأساسي

REDIS
SET mykey "Hello"
APPEND mykey " Redis"
(integer) 11  # يُرجع الطول الإجمالي بعد الإلحاق

GET mykey
"Hello Redis"

الإلحاق بمفتاح غير موجود

REDIS
APPEND newkey "value"
(integer) 5  # مكافئ لـ SET newkey "value"

GET newkey
"value"
💡 حالة الاستخدام: يمكن استخدام APPEND لبناء السجلات وتجميع عناوين URL، إلخ.

حالات استخدام السلاسل

حالة الاستخدام 1: التخزين المؤقت

REDIS
# تخزين استجابة API مؤقتًا
SET cache:api:user:1 '{"name":"Alice","age":25}' EX 300

# الحصول على البيانات المخزنة مؤقتًا
GET cache:api:user:1

حالة الاستخدام 2: تخزين الجلسات

REDIS
# تخزين جلسة المستخدم (انتهاء صلاحية 30 دقيقة)
SET session:token:abc123 '{"user_id":1,"role":"admin"}' EX 1800

# التحقق من الجلسة
GET session:token:abc123

حالة الاستخدام 3: القفل الموزع

REDIS
# استحواذ على القفل (تحرير تلقائي بعد 10 ثوانٍ)
SET lock:order:process "server1" NX EX 10

# إرجاع OK يعني استحواذ على القفل
# إرجاع nil يعني أن القفل محتجز من قبل عملية أخرى

# تحرير القفل
DEL lock:order:process

حالة الاستخدام 4: رمز التحقق

REDIS
# تخزين رمز التحقق (انتهاء صلاحية 5 دقائق)
SET code:phone:13800138000 "123456" EX 300

# التحقق
GET code:phone:13800138000

حالة الاستخدام 5: تحديد معدل

REDIS
# تسجيل عدد مرات الوصول إلى API (نافذة دقيقة واحدة)
SET limit:api:user:1 "0" EX 60

# الزيادة عند كل وصول (يحتاج إلى استخدام مع INCR)

تحسين ترميز السلاسل

يختار Redis تلقائيًا الترميز الأمثل بناءً على محتوى السلسلة:

الترميز الشرط الوصف
int قيمة عدد صحيح ضمن نطاق long ترميز عدد صحيح، يوفر الذاكرة
embstr طول السلسلة <= 44 بايت سلسلة مضمنة، تخزين مضغوط
raw طول السلسلة > 44 بايت سلسلة عادية، تستخدم SDS

التحقق من نوع الترميز

REDIS
SET intkey 12345
OBJECT ENCODING intkey
"int"

SET shortkey "Hello"
OBJECT ENCODING shortkey
"embstr"

SET longkey "This is a very long string that exceeds 44 bytes limit"
OBJECT ENCODING longkey
"raw"
ℹ️ ملاحظة: يتم اختيار الترميز تلقائيًا بواسطة Redis — لا حاجة للتدخل اليدوي. فهم الترميز يساعد في تحسين استخدام الذاكرة.

❓ أسئلة شائعة

س هل SET يستبدل مفتاحًا موجودًا؟
ج نعم. افتراضيًا، SET يستبدل المفتاح الموجود. استخدم المعامل NX للتعيين فقط إذا كان المفتاح غير موجود。
س كيف أنفذ "تحديث فقط إذا كان المفتاح موجودًا"؟
ج استخدم المعامل XX لأمر SET: SET key value XX. يعيّن القيمة الجديدة فقط إذا كان المفتاح موجودًا بالفعل。
س ما الفرق بين MSET و SET المتعددة؟
ج MSET هي عملية ذرية تكمل إعدادات متعددة في جولة شبكة واحدة، مما يجعلها أكثر كفاءة. SETs المتعددة تتطلب جولات متعددة。
س ما هو الحد الأقصى لحجم السلسلة؟
ج الحد الأقصى 512MB. ومع ذلك، لا يُوصى بتخزين سلاسل كبيرة جدًا لأنها تؤثر على الأداء والذاكرة。
س كيف أخزن بيانات ثنائية (مثل الصور)؟
ج سلاسل Redis آمنة ثنائيًا ويمكن تخزينها مباشرة. ومع ذلك، يُوصى بتخزين عناوين URL للصور أو استخدام خدمات تخزين ملفات مخصصة。

📖 ملخص

📝 تمارين

  1. العمليات الأساسية: استخدم SET لتخزين اسمك وعمرك ومدينتك، ثم استرجعهم جميعًا مرة واحدة باستخدام MGET
  2. تمرين انتهاء الصلاحية: عيّن مفتاحًا مع TTL وتحقق من الوقت المتبقي باستخدام TTL
  3. قفل موزع: نفذ قفلًا موزعًا بسيطًا باستخدام SET NX EX، حاول الاستحواذ عليه وتحريره
  4. العمليات الدفعية: استخدم MSET لتعيين 10 مفاتيح، ثم استخدم MGET للحصول على 5 منها

الدرس التالي

في الدرس التالي، سنتعلم سلاسل Redis (الجزء 2)، والتي تغطي العمليات الرقمية وعمليات البت.

100%