تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

نحوه ایجاد و مدیریت مجموعه‌ها (Sets) در Redis


۱۲ مهر ۱۴۰۴

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

آنچه در این مقاله می‌خوانید:

  • ایجاد مجموعه ها (Sets)
  • بازیابی اعضای مجموعه‌ها در Redis
  • حذف اعضا از مجموعه ها
  • مقایسه مجموعه ها در Redis
  • جمع بندی
  • سوالات متداول
نحوه ایجاد و مدیریت مجموعه‌ها (Sets) در 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 می‌توان یک عضو را از یک مجموعه به مجموعه دیگر منتقل کرد.

به اشتراک بگذارید