نظرة عامة على أنواع بيانات Redis

تدعم Redis 5 أنواع بيانات أساسية، لكل منها خصائص وحالات استخدام فريدة. يقدم هذا الدرس نظرة عامة على جميع أنواع البيانات.

نظرة عامة على أنواع بيانات Redis

نوع البيانات الوصف التطبيق الداخلي حالات الاستخدام
String النوع الأساسي، يخزن سلاسل وأعداد صحيحة وبيانات ثنائية SDS (Simple Dynamic String) تخزين مؤقت، عدادات، أقفال موزعة
Hash مجموعة مفتاح-قيمة، تشبه Map/Object جدول تجزئة + ziplist تخزين الكائنات، عربات التسوق
List قائمة مرتبة وقابلة للتكرار من السلاسل قائمة مزدوجة الربط + ziplist قوائم انتظار رسائل، قوائم حديثة
Set مجموعة غير مرتبة وفريدة من السلاسل جدول تجزئة + intset علامات، علاقات اجتماعية
Sorted Set مجموعة مرتبة وفريدة مع درجات لكل عنصر قائمة تخطي + جدول تجزئة لوحات متصدرين، مجموعات مرجحة
💡 لماذا Redis سريعة؟ جميع البيانات في الذاكرة، وتستخدم هياكل بيانات فعالة (جداول تجزئة، قوائم تخطي، إلخ).

String

السلاسل هي أكثر أنواع بيانات Redis الأساسية. يمكنها تخزين:

الميزات

الأوامر الأساسية

REDIS
# تعيين واسترجاع
SET key value
GET key

# العمليات الرقمية
INCR key          # زيادة بمقدار 1
INCRBY key 10     # زيادة بمقدار 10
DECR key          # إنقاص بمقدار 1

# عمليات أخرى
APPEND key suffix  # إلحاق
STRLEN key         # الحصول على الطول

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

السيناريو مثال
تخزين مؤقت SET user:1:profile '{"name":"Alice"}'
عداد INCR article:123:views
قفل موزع SET lock:resource "locked" NX EX 10
جلسة SET session:token123 "user_data" EX 3600
💡 مبدأ القفل الموزع: المعامل NX (تعيين فقط إذا كان المفتاح غير موجود) مع EX (انتهاء الصلاحية) لأمر SET يوفر استحواذًا ذريًا على القفل.

Hash

التجزئة هي مجموعة مفتاح-قيمة، تشبه Map أو Dictionary أو Object في لغات البرمجة.

الميزات

الأوامر الأساسية

REDIS
# تعيين واسترجاع الحقول
HSET user:1 name "Alice"
HSET user:1 age 25
HGET user:1 name        # "Alice"

# تعيين حقول متعددة
HMSET user:2 name "Bob" age 30 city "Beijing"

# الحصول على جميع الحقول والقيم
HGETALL user:2
# 1) "name"
# 2) "Bob"
# 3) "age"
# 4) "30"
# 5) "city"
# 6) "Beijing"

# الحصول على حقول متعددة
HMGET user:2 name age
# 1) "Bob"
# 2) "30"

# حذف حقل
HDEL user:2 city

# التحقق من وجود حقل
HEXISTS user:2 name    # 1

# الحصول على جميع أسماء الحقول
HKEYS user:2
# 1) "name"
# 2) "age"

# الحصول على جميع القيم
HVALS user:2
# 1) "Bob"
# 2) "30"

# الحصول على عدد الحقول
HLEN user:2            # 2

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

السيناريو مثال
تخزين الكائنات HSET user:1 name "Alice" age 25 email "alice@example.com"
عربة تسوق HSET cart:user1 product:101 2 product:102 1 (معرف المنتج والكمية)
مجموعة عدادات HINCRBY article:123 likes 1

Hash مقابل String لتخزين الكائنات

الطريقة 1: String مع JSON

REDIS
SET user:1 '{"name":"Alice","age":25,"email":"alice@example.com"}'

الطريقة 2: Hash

REDIS
HSET user:1 name "Alice" age 25 email "alice@example.com"
💡 توصية: استخدم Hash للكائنات البسيطة، استخدم String مع JSON للكائنات المتداخلة المعقدة.

List

القائمة هي تسلسل مرتب من السلاسل، تسمح بتكرار العناصر.

الميزات

الأوامر الأساسية

REDIS
# إدراج من اليسار (الرأس)
LPUSH mylist "a" "b" "c"  # يُرجع طول القائمة

# إدراج من اليمين (الذيل)
RPUSH mylist "d" "e"

# الحصول على طول القائمة
LLEN mylist               # 5

# الحصول على العناصر ضمن نطاق
LRANGE mylist 0 -1        # الحصول على جميع العناصر
# 1) "c"
# 2) "b"
# 3) "a"
# 4) "d"
# 5) "e"

# الحصول على عنصر في فهرس محدد
LINDEX mylist 0           # "c" (العنصر الأول)

# إخراج من اليسار (الرأس)
LPOP mylist               # "c"

# إخراج من اليمين (الذيل)
RPOP mylist               # "e"

# تعيين عنصر في فهرس محدد
LSET mylist 0 "new"

# إزالة عناصر حسب القيمة
LREM mylist 1 "a"         # إزالة عنصر واحد بقيمة "a"

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

السيناريو الوصف
قائمة انتظار رسائل LPUSH + RPOP أو RPUSH + LPOP
قائمة حديثة أحدث المقالات، أحدث التعليقات
خط زمني تغذية المستخدم، خط زمني للمدونات

مثال:قائمة انتظار رسائل

BASH
# المنتج: دفع الرسائل إلى قائمة الانتظار
LPUSH queue:email "send to user1"
LPUSH queue:email "send to user2"

# المستهلك: إخراج الرسائل من قائمة الانتظار
RPOP queue:email
RPOP queue:email

# إخراج محظور (ينتظر عند عدم وجود رسائل)
BRPOP queue:email 10
▶ جرّب الكود
💡 LPUSH + RPOP = قائمة انتظار (FIFO)، LPUSH + LPOP = مكدس (LIFO)

Set

المجموعة هي مجموعة غير مرتبة من السلاسل الفريدة.

الميزات

الأوامر الأساسية

REDIS
# إضافة عناصر
SADD myset "a" "b" "c"

# الحصول على جميع العناصر
SMEMBERS myset
# 1) "a"
# 2) "b"
# 3) "c"

# التحقق من وجود عنصر
SISMEMBER myset "a"      # 1 (موجود)

# إزالة عناصر
SREM myset "a"

# الحصول على حجم المجموعة
SCARD myset              # 2

# الحصول على عنصر عشوائي
SRANDMEMBER myset

# إخراج عنصر عشوائي
SPOP myset

عمليات المجموعات

REDIS
# إنشاء مجموعتين
SADD set1 "a" "b" "c"
SADD set2 "b" "c" "d"

# التقاطع (العناصر في كلتا المجموعتين)
SINTER set1 set2
# 1) "b"
# 2) "c"

# الاتحاد (العناصر في أي من المجموعتين)
SUNION set1 set2
# 1) "a"
# 2) "b"
# 3) "c"
# 4) "d"

# الفرق (العناصر في set1 وليست في set2)
SDIFF set1 set2
# 1) "a"

# تخزين النتيجة في مجموعة جديدة
SINTERSTORE result set1 set2

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

السيناريو الوصف
نظام العلامات علامات المستخدم، علامات المقالات
العلاقات الاجتماعية قوائم الأصدقاء، قوائم المتابعة
الأصدقاء المشتركون تقاطع مجموعتي أصدقاء مستخدمين
نظام التوصيات أشخاص قد تعرفهم = أصدقاء أصدقائي - أصدقائي - أنا

مثال:الأصدقاء المشتركون

BASH
# أصدقاء المستخدم 1
SADD friends:user1 "Alice" "Bob" "Charlie"

# أصدقاء المستخدم 2
SADD friends:user2 "Bob" "Charlie" "David"

# الأصدقاء المشتركون
SINTER friends:user1 friends:user2
▶ جرّب الكود

Sorted Set

المجموعة المرتبة هي مجموعة مع درجات، حيث يتم ترتيب العناصر حسب الدرجة.

الميزات

الأوامر الأساسية

REDIS
# إضافة عناصر (مع درجة)
ZADD leaderboard 100 "Alice"
ZADD leaderboard 95 "Bob"
ZADD leaderboard 98 "Charlie"

# الحصول على درجة عنصر
ZSCORE leaderboard "Alice"    # "100"

# الحصول على ترتيب عنصر (0-أساسي، تصاعدي حسب الدرجة)
ZRANK leaderboard "Alice"     # 2 (المركز الثالث)

# الحصول على ترتيب عنصر (تنازلي حسب الدرجة)
ZREVRANK leaderboard "Alice"  # 0 (المركز الأول)

# الحصول على عناصر حسب نطاق الترتيب (تصاعدي)
ZRANGE leaderboard 0 -1 WITHSCORES
# 1) "Bob"
# 2) "95"
# 3) "Charlie"
# 4) "98"
# 5) "Alice"
# 6) "100"

# الحصول على عناصر حسب نطاق الترتيب (تنازلي)
ZREVRANGE leaderboard 0 -1 WITHSCORES
# 1) "Alice"
# 2) "100"
# 3) "Charlie"
# 4) "98"
# 5) "Bob"
# 6) "95"

# الحصول على عناصر حسب نطاق الدرجة
ZRANGEBYSCORE leaderboard 95 100 WITHSCORES

# زيادة درجة عنصر
ZINCRBY leaderboard 5 "Bob"   # درجة Bob تصبح 100

# إزالة عنصر
ZREM leaderboard "Bob"

# الحصول على حجم المجموعة
ZCARD leaderboard

# عد العناصر ضمن نطاق درجة
ZCOUNT leaderboard 90 100

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

السيناريو الوصف
لوحة متصدرين لوحة متصدرين للألعاب، قائمة رائجة
علامات مرجحة علامات + وزن
قائمة انتظار مؤجلة الدرجة هي طابع زمني للتنفيذ
نافذة منزلقة إحصائيات البيانات ضمن نافذة زمنية

مثال:لوحة متصدرين للألعاب

BASH
# تحديث درجات اللاعبين
ZADD game:leaderboard 1500 "player1"
ZADD game:leaderboard 2300 "player2"
ZADD game:leaderboard 1800 "player3"

# الحصول على أفضل 10
ZREVRANGE game:leaderboard 0 9 WITHSCORES

# الحصول على ترتيب اللاعب
ZREVRANK game:leaderboard "player1"

# الحصول على اللاعبين بدرجات بين 1000-2000
ZRANGEBYSCORE game:leaderboard 1000 2000 WITHSCORES
▶ جرّب الكود

دليل اختيار نوع البيانات

شجرة القرار

ماذا تحتاج لتخزين؟
├─ قيمة مفردة (سلسلة، رقم، بيانات ثنائية)
│  └─ استخدم String
│
├─ كائن (حقول متعددة)
│  ├─ الحقول تُعدّل بشكل فردي غالبًا
│  │  └─ استخدم Hash
│  └─ الحقول نادرًا ما تُعدّل بشكل فردي
│     └─ استخدم String (JSON)
│
├─ قائمة مرتبة
│  ├─ تحتاج عمليات ثنائية الطرف
│  │  └─ استخدم List
│  └─ تحتاج فرزًا حسب الدرجة
│     └─ استخدم Sorted Set
│
└─ مجموعة غير مرتبة
   ├─ تحتاج إزالة تكرار
   │  └─ استخدم Set
   └─ تحتاج إزالة تكرار + فرز
      └─ استخدم Sorted Set

ملخص المقارنة

الميزة String Hash List Set Sorted Set
مرتبة - -
قابلة للتكرار - -
عمليات رقمية
عمليات مجموعة
استعلامات نطاق
تعديل حقل واحد

أمر TYPE

استخدم أمر TYPE للتحقق من نوع بيانات المفتاح:

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

❓ أسئلة شائعة

س كم كمية البيانات التي يمكن لـ String تخزينها؟
ج الحد الأقصى 512MB. ومع ذلك، لا يُوصى بتخزين بيانات كبيرة جدًا لأنها تؤثر على الأداء。
س أيهما أفضل لتخزين الكائنات — Hash أم String؟
ج استخدم Hash للكائنات البسيطة (يمكن تعديل الحقول الفردية)، استخدم String (JSON) للكائنات المتداخلة المعقدة。
س كم عدد العناصر التي يمكن لـ List تخزينها؟
ج حتى 2^32-1 (حوالي 4.2 مليار)، لكن عمليًا محدود بالذاكرة المتاحة。
س ما الفرق بين Set و List؟
ج المجموعات غير مرتبة بعناصر فريدة؛ القوائم مرتبة وتسمح بالتكرار. استخدم Set لإزالة التكرار، List للتسلسلات المرتبة。
س هل يمكن أن تكون درجات Sorted Set أعدادًا عشرية؟
ج نعم، الدرجات هي أعداد عائمة مزدوجة الدقة。

📖 ملخص

📝 تمارين

  1. إنشاء بيانات: أنشئ بيانات نموذجية لكل نوع بيانات
  2. أمر TYPE: استخدم TYPE للتحقق من أنواع البيانات التي أنشأتها
  3. تفكير سيناريو: لموقع تجارة إلكترونية، ما أنواع البيانات التي ستستخدمها لمعلومات المنتج وعربة التسوق وقائمة الطلبات؟
  4. عمليات المجموعات: أنشئ قائمتي متابعة لمستخدمين واحسب المتابعات المشتركة بينهما

الدرس التالي

في الدرس التالي، سنتعلم إدارة مفاتيح Redis، والتعمق في عمليات وإدارة المفاتيح.

100%