Redis: چیست و چرا باید از ردیس استفاده کنیم؟

Redis
avatar Pouya Dustdar
پنج‌شنبه، 18 ژانویه 2024
0 نظر

Redis چیست؟

کلمه Redis مخفف عبارت Remote Dictionary Server است. به بیان ساده‌تر، دیتابیس ردیس نوعی ساختمان داده‌ای است که اطلاعات را در RAM نگهداری می‌کند. این کار باعث می‌شود که سرعت دسترسی به اطلاعات بسیار بالاتر رود. بالا بودن سرعت، بزرگترین مزیت و تفاوت اصلی دیتابیس Redis با دیگر پایگاه‌داده ها است. با توجه به اینکه اطلاعات در ردیس داخل RAM‌ نگهداری می‌شود، آن را In-Memory Database می‌نامند.

سرویس Redis چطوری کار میکنه؟

ذخیره سازی:

تصور کنید شما یک شناسه و اطلاعاتی را برای ردیس ارسال کردید. ردیس اطلاعات شما را داخل یک انتضاعی به نام اسلات ذخیره سازی میکند. به صورت پیشفرض Redis اطلاعات شما را بین 16384 اسلات بر اساس الگوریتم زیر پخش خواهد کرد:

HASH_SLOT = CRC16(key) mod 16384

Redis توسط الگوریتم CRC16/XMODEM برای شناسه، عددی ۱۶ بیت را تولید میکند. ۱۴ بیت از ۱۶ بیت خروجی الگوریتم را انتخاب کرده و باقیمانده تقسیم به عدد ۱۶۳۸۴ (تعداد کل اسلات ها) را گرفته و اطلاعات شما را داخل آن اسلات ذخیره میکند.
این الگوریتم باعث میشود که اطلاعات شما تقریبا به صورت یکسانی داخل اسلات های Redis پخش شوند. یعنی اگر اسلات 1 شامل 50 شناسه و مقدار مربوطه هست اسلات های دیگر هم به احتمال خیلی زیاد 45 تا 55 کلید را شامل میشوند.

الگوریتم CRC16 :

الگوریتم CRC16 همیشه یک عدد یکسانی را برای شناسه شما تولید خواهد کرد. زمانی که شما به اطلاعات یک شناسه نیاز داشته باشید، توسط این الگوریتم میتوانید آدرس اسلات مربوط به آن اطلاعات را محاسبه کنید.
نمونه ای از پیاده سازی این الگوریتم داخل Redis را توی این لینک میتوانید ببینید لینک .( شما میتوانید برای پخش اطلاعات در اسلات ها، الگوریتم های شخصی بنویسید(قابلیت تنظیم دارد)).
آدرس اسلاتی که Redis اطلاعات را ذخیره میکند به شناسه وابسته است. پس همیشه یک شناسه داخل یک اسلاتی از Redis ذخیره خواهد شد.
برای مثال اگر شما داخل Redis یک کلید به نام test با هر مقداری تعریف کردید، داخل اسلات 6918 ذخیره خواهد شد. برای تست این مسئله میتوانید کد زیر را اجرا کنید:

x.x.x.x:yyyy> SET test test2
x.x.x.x:yyyy> CLUSTER KEYSLOT test

عددی که دریافت میکنید 6918 خواهد بود.
و یا اگر کد زیر را اجرا کنید:

x.x.x.x:yyyy> SET somekey test
x.x.x.x:yyyy> CLUSTER KEYSLOT somekey

عددی که دریافت میکنید 11058 خواهد بود.
پس میتوانیم نتیجه بگیریم که به بر اساس الگوریتم پیشفرض Redis (اگر الگوریتم پخش اسلات ها را تغییر نداده باشید) کلید های test و somekey و هر کلید دیگری در همه سرویس های Redis داخل اسلات های مشخصی ذخیره خواهد شد.
نکته (مهم): در صورتی که از دستور HSET استفاده بکنید تمام اطلاعات شما بر اساس کلید پخش خواهد شد. نه بر اساس فیلد مثال زیر را ببینید:

x.x.x.x:yyyy> HSET hsettest test 1
x.x.x.x:yyyy> CLUSTER KEYSLOT hsettest

در این صورت عدد 7198 را دریافت خواهید کرد.
پس در نتیجه بهتر است از HSET های خیلی بزرگ استفاده نکنید تا پخش اطلاعات شما بر روی اسلات های Redis به درستی انجام شوند.

مزایایی دیتابیس های In-Memory

دیتابیس های In-Memory به صورت عمومی مزایایی دارند که در ادامه میاریم:

1- مشکل هایی سخت افزاری که موقع استفاده از دیتابیس هایی On-Disk میتونیم بهش بر بخوریم رو توی In-Memory دیتابیس ها مشاهده نمیکنیم، و یا خیلی کمتر هستش. ( مثلا: پر شدن io هارد ، وابستگی پرفرمنس دیتابیس به سرعت کارکرد هارد یا بار پردازشی بالا و … )
2- در دیتابیس های In-Memory با توجه به استفاده از Ram به عنوان ذخیره‌ساز کاری و بالا بودن سرعت کاری ( کلاک) دیتا ها سریع ترین زمان ممکن ذخیره و برگردونده میشن.
3- دیتابیس های In-Memory برای پیدا کردن مکان اطلاعات معمولا از الگوریتم های هش تیبل استفاده میکنند که تقریبا پیچیدگی زمانی شبیه به O(1) رو میبینید.

مزایای دیتابیس Redis

دیتابیس Redis امکانات جالبی نسبت به بقیه دیتابیس های In-Memory بهمون ارایه میده که در ادامه میاریم:

1- امکان ذخیره‌سازی دیتا با حجم حداکثر 512 مگابایت
2- امکان ذخیره‌سازی دیتا به صورت Map:

Map<String, String> user = new HashMap<>();
user.put("username", "john123");
user.put("firstName", "John"); // use Jedis client
jedis.hmset("user:john123", user); 
// منبع کد DZone

3- امکان تکثیر و پخش دیتا بر روی نود ها (‌‌‌ Sharding/Replication )
4- تقریبا برای تمامی زبان های برنامه نویسی و پلتفرم ها، کتابخانه های کامل‌ی ارایه داده
5- امکان ایجاد چنل Pub/Sub. ( کاربردی مانند Message Broker )
6- سرویس سبکی بوده و منابع زیادی مصرف نمیکند (بسته به ساختار دیتا، میتواند متفاوت باشد)
7- از Transactions پشتیبانی میکند (اجرای همزمان چند دستور در یک درخواست)
8- امکان پخش دیتا بر روی اسلات های رم بر اساس الگوریتم شخصی
9- ابزار های کامل برای تست ، ترابلشوتینگ و بهینه سازی

منتظر نظرات سازنده شما هستیم ❤️


avatar
Pouya Dustdar

عاشق برنامه نویسی و مهندسی DevOps. تقریبا 8 ساله که برنامه نویسی میکنم و حدود 2 سال هم هست که به حوزه زیر ساخت و DevOps شدیدا علاقه مند شدم :)