نظرة عامة على أنواع بيانات Redis
تدعم Redis 5 أنواع بيانات أساسية، لكل منها خصائص وحالات استخدام فريدة. يقدم هذا الدرس نظرة عامة على جميع أنواع البيانات.
نظرة عامة على أنواع بيانات Redis
| نوع البيانات | الوصف | التطبيق الداخلي | حالات الاستخدام |
|---|---|---|---|
| String | النوع الأساسي، يخزن سلاسل وأعداد صحيحة وبيانات ثنائية | SDS (Simple Dynamic String) | تخزين مؤقت، عدادات، أقفال موزعة |
| Hash | مجموعة مفتاح-قيمة، تشبه Map/Object | جدول تجزئة + ziplist | تخزين الكائنات، عربات التسوق |
| List | قائمة مرتبة وقابلة للتكرار من السلاسل | قائمة مزدوجة الربط + ziplist | قوائم انتظار رسائل، قوائم حديثة |
| Set | مجموعة غير مرتبة وفريدة من السلاسل | جدول تجزئة + intset | علامات، علاقات اجتماعية |
| Sorted Set | مجموعة مرتبة وفريدة مع درجات لكل عنصر | قائمة تخطي + جدول تجزئة | لوحات متصدرين، مجموعات مرجحة |
💡 لماذا Redis سريعة؟ جميع البيانات في الذاكرة، وتستخدم هياكل بيانات فعالة (جداول تجزئة، قوائم تخطي، إلخ).
String
السلاسل هي أكثر أنواع بيانات Redis الأساسية. يمكنها تخزين:
- سلاسل (نص)
- أعداد صحيحة (رقمية)
- بيانات ثنائية (صور، كائنات مسلسلة)
الميزات
- آمنة ثنائيًا: يمكن تخزين أي بيانات (بما في ذلك الصور والفيديو)
- الحد الأقصى للحجم: 512MB
- تدعم العمليات الرقمية: INCR، DECR، INCRBY، إلخ
- تدعم عمليات البت: SETBIT، GETBIT، BITCOUNT، إلخ
الأوامر الأساسية
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 في لغات البرمجة.
الميزات
- مثالية لتخزين الكائنات (معلومات المستخدم، معلومات المنتج، إلخ)
- يمكن تعديل حقول فردية دون قراءة الكائن بأكمله
- فعالة من حيث الذاكرة (تستخدم ziplist للبيانات الصغيرة)
الأوامر الأساسية
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
القائمة هي تسلسل مرتب من السلاسل، تسمح بتكرار العناصر.
الميزات
- مرتبة: العناصر تحافظ على ترتيب الإدراج
- قابلة للتكرار: يمكن أن تظهر نفس القيمة عدة مرات
- عمليات ثنائية الطرف: يمكن الدفع والإخراج من كلا الطرفين
- أقصى طول: 2^32 - 1 (حوالي 4.2 مليار)
الأوامر الأساسية
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 أعدادًا عشرية؟
ج نعم، الدرجات هي أعداد عائمة مزدوجة الدقة。
📖 ملخص
- لدى Redis 5 أنواع بيانات أساسية: String، Hash، List، Set، Sorted Set
- String: الأكثر أساسية، يخزن سلاسل وأعدادًا صحيحة وبيانات ثنائية
- Hash: مجموعة مفتاح-قيمة، مثالية للكائنات
- List: قائمة مرتبة، مناسبة لقوائم انتظار الرسائل والقوائم الحديثة
- Set: مجموعة غير مرتبة، تدعم عمليات المجموعات
- Sorted Set: مجموعة مرتبة، مثالية للوحات المتصدرين
- اختر نوع البيانات المناسب بناءً على حالة الاستخدام الخاصة بك
📝 تمارين
- إنشاء بيانات: أنشئ بيانات نموذجية لكل نوع بيانات
- أمر TYPE: استخدم TYPE للتحقق من أنواع البيانات التي أنشأتها
- تفكير سيناريو: لموقع تجارة إلكترونية، ما أنواع البيانات التي ستستخدمها لمعلومات المنتج وعربة التسوق وقائمة الطلبات؟
- عمليات المجموعات: أنشئ قائمتي متابعة لمستخدمين واحسب المتابعات المشتركة بينهما
الدرس التالي
في الدرس التالي، سنتعلم إدارة مفاتيح Redis، والتعمق في عمليات وإدارة المفاتيح.



