آنچه در این مقاله میخوانید
نحوه ایجاد و مدیریت مجموعهها (Sets) در Redis
۱۲ مهر ۱۴۰۴
ردیس (Redis) یک ذخیرهساز متنباز و درونحافظهای برای ذخیرهسازی دادهها بهصورت کلید مقدار است. مجموعهها (Sets) در ردیس، ساختاری از دادهها هستند که مجموعهای نامرتب از رشتههای منحصربهفرد را ذخیره میکنند. این مجموعهها از عملیات مجموعهای مانند اشتراک، اتحاد و تفاضل پشتیبانی میکنند. به عبارت دیگر، مجموعهها در Redis مشابه مجموعهها در زبانهای برنامهنویسی مثل پایتون یا جاوا هستند. در این آموزش از لیارا، نحوه ایجاد مجموعهها، بازیابی و حذف مقادیر مختلف در ردیس را توضیح خواهیم داد.
آنچه در این مقاله میخوانید:
- ایجاد مجموعه ها (Sets)
- بازیابی اعضای مجموعهها در Redis
- حذف اعضا از مجموعه ها
- مقایسه مجموعه ها در Redis
- جمع بندی
- سوالات متداول

ایجاد مجموعه ها (Sets)
برای ایجاد یک مجموعه و افزودن اعضا به آن، میتوانید از دستور sadd
استفاده کنید. با این دستور میتوانید همزمان یک یا چند عضو را در مجموعه ذخیره کنید. در مثال زیر، مجموعهای با کلید key_horror
ساخته میشود و اعضای «Frankenstein» و «Godzilla» به آن اضافه خواهند شد:
sadd key_horror "Frankenstein" "Godzilla"
در صورت موفقیت، دستور sadd
یک عدد صحیح برمیگرداند که نشان میدهد چه تعداد عضو جدید به مجموعه اضافه شده است:
Output
(integer) 2
اگر تلاش کنید اعضایی را به یک کلید اضافه کنید که از قبل حاوی مقداری غیر از مجموعه باشد، Redis یک خطا برمیگرداند. در مثال زیر، دستور اول یک لیست با نام key_action
و یک عنصر با مقدار "Shaft"
ایجاد میکند.
rpush key_action "Shaft"
دستور بعدی تلاش میکند عضو “Shane"
را بهعنوان یک عضو مجموعه (Set) به لیست اضافه کند، اما به دلیل تعارض نوع دادهها (clashing data types) این عملیات با خطا مواجه میشود.
sadd key_action "Shane"
Output
(error) WRONGTYPE Operation against a key holding the wrong kind of value
توجه داشته باشید که مجموعهها امکان وجود بیش از یک نسخه از یک عضو وجود ندارد و اعضای تکراری ذخیره نمیشوند.
sadd key_comedy "It's" "A" "Mad" "Mad" "Mad" "Mad" "Mad" "World"
Output
(integer) 4
با اینکه دستور sadd هشت عضو را مشخص کرده است، چهار عضو تکراری "Mad"
را نادیده میگیرد و در نهایت اندازه مجموعه برابر با چهار عضو منحصربهفرد خواهد بود.
Redis چیست؟
Redis
بازیابی اعضای مجموعه ها در Redis
در این بخش، چندین دستور Redis را بررسی میکنیم که اطلاعاتی درباره اعضای موجود در یک مجموعه برمیگردانند. برای تمرین دستوراتی که در ادامه معرفی میشوند، ابتدا دستور زیر را اجرا کنید تا مجموعهای با شش عضو و کلید key_stooges
ایجاد شود:
sadd key_stooges "Moe" "Larry" "Curly" "Shemp" "Joe" "Curly Joe"
اکنون برای برگرداندن تمام اعضای یک مجموعه، دستور sismember
را اجرا کنید و بعد از آن نام کلیدی را که میخواهید بررسی کنید وارد نمایید:
smembers key_stooges
Output
1) "Curly"
2) "Moe"
3) "Larry"
4) "Shemp"
5) "Curly Joe"
6) "Joe"
پس از آن، برای بررسی اینکه آیا مقدار مشخص عضو یک مجموعه هست یا نه، از دستور sismember
استفاده کنید:
sismember key_stooges "Harpo"
اگر عنصر "Harpo"
عضوی از مجموعه key_stooges
باشد، دستور sismember
مقدار 1
را برمیگرداند؛ در غیر این صورت مقدار 0
بازگردانده میشود:
Output
(integer) 0
برای بررسی تعداد اعضای یک مجموعه مشخص (یا به عبارت دیگر، یافتن کاردینالیتی یک مجموعه)، دستور scard
را اجرا کنید:
scard key_stooges
Output
(integer) 6
سپس برای بازگرداندن یک عضو تصادفی از یک مجموعه، دستور srandmember
را اجرا کنید:
srandmember key_stooges
Output
"Larry"
همچنین، برای بازگرداندن چند عضو تصادفی و منحصربهفرد از یک مجموعه، میتوانید پس از دستور srandmember
تعداد اعضایی را که میخواهید دریافت کنید مشخص کنید:
srandmember key_stooges 3
Output
1) "Larry"
2) "Moe"
3) "Curly Joe"
بعد از اجرای دستور بالا، اگر یک عدد منفی به دستور srandmember
بدهید، امکان دارد که همان عضو چندین بار در خروجی ظاهر شود و تکراری باشد.
srandmember key_stooges -3
Output
1) "Shemp"
2) "Curly Joe"
3) "Curly Joe"
چگونه هشها را در Redis مدیریت کنیم؟
هشها را در Redis
حذف اعضا از مجموعه ها
Redis سه دستور قدرتمند برای حذف اعضا از مجموعهها در اختیار شما قرار میدهد:
spop، srem و smove.
دستور spop
بهصورت تصادفی تعداد مشخصی عضو را از مجموعه انتخاب کرده و آنها را هم بازمیگرداند و هم از مجموعه حذف میکند، درست مثل srandmember
، با این تفاوت که عناصر حذف هم میشوند. این دستور نام کلیدی که مجموعه در آن قرار دارد و تعداد اعضایی که میخواهید حذف شوند را بهعنوان آرگومان دریافت میکند. اگر تعداد مشخص نشود، بهطور پیشفرض فقط یک عضو را بازمیگرداند و حذف میکند.
مثال زیر نشان میدهد که چگونه میتوانید دو عنصر تصادفی را از مجموعه key_stooges
(ایجاد شده در بخش قبل) حذف و دریافت کنید:
spop key_stooges 2
Output
1) "Shemp"
2) "Larry"
دستور srem
این امکان را میدهد که یک یا چند عضو خاص را از یک مجموعه حذف کنید، به جای اینکه اعضا بهصورت تصادفی حذف شوند.
srem key_stooges "Joe" "Curly Joe"
با اجرای این دستور، به جای بازگرداندن اعضایی که از مجموعه حذف شدهاند، دستور srem
یک عدد صحیح (integer) برمیگرداند که نشاندهنده تعداد اعضای حذفشده است.
Output(integer) 2
برای جابجایی یک عضو از یک مجموعه به مجموعه دیگر، از دستور smove
استفاده کنید. این دستور سه آرگومان میگیرد: مجموعه مبدا، مجموعه مقصد و عضوی که باید منتقل شود، به همین ترتیب. توجه داشته باشید که smove
فقط اجازه انتقال یک عضو در هر بار اجرا را میدهد، به صورت زیر:
smove key_stooges key_jambands "Moe"
اگر دستور با موفقیت عضو را منتقل کند ،مقدار (integer) 1
را برمیگرداند:
Output
(integer) 1
در غیر این صورت، اگر دستور smove
با شکست مواجه شود، مقدار (integer) 0
را برمیگرداند. توجه داشته باشید که اگر کلید مقصد از قبل وجود نداشته باشد، smove
ابتدا آن را ایجاد کرده و سپس عضو را به مجموعه مقصد منتقل میکند.
نصب و راه اندازی Redis در ویندوز
نصب Redis
مقایسه مجموعه ها در Redis
Redis همچنین چندین دستور کاربردی برای یافتن اشتراکها و تفاوتها بین مجموعهها ارائه میدهد. برای نشان دادن نحوه عملکرد این دستورات، در این بخش به سه مجموعه با نامهای presidents
، kings
و beatles
اشاره میکنیم.
اگر میخواهید خودتان این دستورات را امتحان کنید، ابتدا این سه مجموعه را با استفاده از دستورات sadd
زیر ایجاد کرده و اعضای آنها را اضافه کنید:
sadd presidents "George" "John" "Thomas" "James"
sadd kings "Edward" "Henry" "John" "James" "George"
sadd beatles "John" "George" "Paul" "Ringo"
دستور sinter
مجموعههای مختلف را مقایسه میکند و اشتراک مجموعهها را برمیگرداند، یعنی مقادیری که در تمام مجموعهها وجود دارند.
sinter presidents kings beatles
Output
1) "John"
2) "George"
دستور sinterstore
عملکردی مشابه دارد، با این تفاوت که به جای بازگرداندن اعضای مشترک، یک مجموعه جدید در مقصد مشخصشده ایجاد میکند که شامل این اعضای مشترک است. توجه داشته باشید که اگر کلید مقصد از قبل وجود داشته باشد، sinterstore
محتوای آن را بازنویسی میکند.
sinterstore new_set presidents kings beatles
smembers new_set
Output
1) "John"
2) "George"
همانطور که در خروجی زیر مشاهده میکنید، دستور sdiff
تفاوت مجموعهها را برمیگرداند، یعنی اعضایی که از مجموعه اول نسبت به هر یک از مجموعههای بعدی باقی میمانند. مانند خروجی زیر:
Output
1) "Thomas"
دستور sdiff
هر عضو موجود در مجموعه اول را بررسی میکند و آنها را با اعضای هر مجموعه بعدی مقایسه میکند. هر عضوی که در مجموعه اول وجود داشته باشد و در مجموعههای بعدی هم ظاهر شود، حذف میشود و sdiff
اعضای باقیمانده را برمیگرداند. میتوان آن را بهعنوان حذف اعضای مجموعههای بعدی از مجموعه اول تصور کرد.
دستور sdiffstore
عملکردی مشابه sdiff
دارد، با این تفاوت که به جای بازگرداندن تفاوت مجموعهها، یک مجموعه جدید در مقصد مشخصشده ایجاد میکند که شامل تفاوت مجموعهها است.
sdiffstore new_set beatles kings presidents
smembers new_set
Output
1) "Paul"
2) "Ringo"
مانند sinterstore، دستور sdiffstore
نیز اگر کلید مقصد از قبل وجود داشته باشد، محتوای آن را بازنویسی میکند.
دستور sunion
اتحاد مجموعهها را برمیگرداند، یعنی مجموعهای شامل تمام اعضای تمام مجموعههایی که مشخص کردهاید:
sunion presidents kings beatles
Output
1) "Thomas"
2) "George"
3) "Paul"
4) "Henry"
5) "James"
6) "Edward"
7) "John"
8) "Ringo"
دستور sunion
نتایج را مانند یک مجموعه جدید در نظر میگیرد، به این معنی که هر عضو فقط یک بار ظاهر میشود و تکراریها حذف میشوند.
دستور sunionstore
عملکرد مشابهی دارد، با این تفاوت که به جای بازگرداندن اتحاد مجموعهها، یک مجموعه جدید در مقصد مشخصشده ایجاد میکند که شامل اتحاد مجموعهها است.
sunionstore new_set presidents kings beatles
Output
(integer) 8
مانند sinterstore
و sdiffstore، دستور sunionstore
نیز اگر کلید مقصد از قبل وجود داشته باشد، محتوای آن را بازنویسی میکند.
با هاست ابری Redis لیارا، ذخیرهسازی دادههای موقت رو با سرعت و عملکرد بالا انجام بده.
✅ نصب آنی و خودکار ✅ منابع اختصاصی ✅ مناسب کش، صف و Session
خرید و راهاندازی دیتابیس Redis
جمع بندی
در این مطلب از لیارا، مجموعهای از دستورات مورد استفاده برای ایجاد و مدیریت مجموعهها در Redis را بهطور کامل توضیح دادیم. شما با نحوه اضافه کردن اعضا به مجموعهها با دستور sadd
، بازیابی اعضا با دستورات smembers
، sismember
، scard
و srandmember
، حذف اعضا با دستورات spop
، srem
و smove
و همچنین مقایسه مجموعهها با دستورات sinter
، sinterstore
، sdiff
، sdiffstore
، sunion
و sunionstore
آشنا شدید.
علاوه بر این، نکات مهمی درباره رفتار مجموعهها در Redis، مانند جلوگیری از افزودن اعضای تکراری، بازگرداندن مقادیر تصادفی و مدیریت کلیدهای مقصد در عملیات ذخیرهسازی نتیجه دستورات مقایسهای، بررسی شد.
سوالات متداول
۱. مجموعهها (Sets) در Redis چه تفاوتی با لیستها دارند؟
مجموعهها در Redis مجموعهای نامرتب از رشتههای منحصربهفرد هستند و اجازه تکرار عضو را نمیدهند، در حالی که لیستها ترتیب اعضا را حفظ میکنند و میتوانند اعضای تکراری داشته باشند.
۲. چگونه میتوان بررسی کرد که یک عضو در مجموعه وجود دارد؟
برای بررسی عضویت یک مقدار در مجموعه از دستور sismember
استفاده میکنیم. اگر عضو وجود داشته باشد عدد ۱ و در غیر این صورت ۰ برمیگردد.
۳. چه دستوری برای حذف اعضای تصادفی از یک مجموعه وجود دارد؟
برای حذف و همزمان بازگرداندن یک یا چند عضو تصادفی از مجموعه از دستور spop
استفاده میکنیم.
۴. تفاوت بین sinter و sinterstore چیست؟
دستور sinter
اشتراک مجموعهها را برمیگرداند، در حالی که sinterstore
اشتراک مجموعهها را در یک کلید مقصد ذخیره میکند و در صورت وجود کلید مقصد، محتوای آن بازنویسی میشود.
۵. آیا میتوان اعضای یک مجموعه را به مجموعه دیگری منتقل کرد؟
بله، با استفاده از دستور smove
میتوان یک عضو را از یک مجموعه به مجموعه دیگر منتقل کرد.