معرفی Redis و انواع روش های ذخیره سازی آن


1- چرا Redis ؟


Redis یک دیتابیس غیر رابطه­ ای و متن­ باز است که توسط آقای سالواتوره با استفاده از زبان برنامه‌نویسی c و در سال 2009 توسعه داده شده است. سالواتوره در نمایش لیست افراد آنلاین در سایت دچار مشکل شده بود  او میخواست با استفاده از ذخیره صفحه ­های مشاهده شده توسط کاربران در دیتابیس­ های رابطه ­ای این کار را انجام دهد. مشکل به این دلیل بود که سرعت پایین این نوع دیتابیس ­ها موجب نتایج اشتباه و همچنین موجب تولید اطلاعات زیاد می­شد که بدون استفاده در دیتابیس باقی می­ماندند. در نتیجه شروع به توسعه اولین نسخه Redis کرد که داده ­ها به صورت کلید-مقدار در حافظه ذخیره می­شدند و هر کلید یک ویژگی خاص به نام Life time  داشت که پس از گذشت زمان خاصی حذف می­گردید. با این ساختار، موفق به بهبود نتایج نمایش کاربران آنلاین سایت شد. در ادامه ی توسعه ی این دیتابیس در سال 2013 به شرکت Vmware فروخته شد و از سال 2015 پشتیبانی آن به RedisLabs که آقای سالواتوره یکی از اعضای آن است سپرده شد.

2- آیا Redis یک دیتابیس است ؟

 Redis یک دیتابیس غیررابطه ای بسیار سریع است که بر اساس معماری کلید-مقدار کار می ­کند و ویژگی­ هایی همچون انتقال داده از حافظه ناپایدار (Memory) به حافظه پایدار (Disk) را داراست. Redis از تکثیر سرور برای ارتقای مقیاس خواندن و از قابلیت client-side sharding برای ارتقای مقیاس نوشتن پشتیبانی می ­کند که موجب می ­شود بتواند صدها گیگ داده را مدیریت کند و میلیون ها درخواست را در ثانیه پاسخ دهد. با همه این تفاسیر انتخاب Redis به عنوان دیتابیس اصلی مناسب نیست و بهتر است از Redis در لایه Cache استفاده شود، زیرا داده­ های دیتابیس اصلی سیستم­ های نرم‌افزاری دارای ارتباط های زیادی با هم هستند که کنترل این ارتباط ها با ساختار کلید-مقدار بسیار سخت و طاقت فرسا است. در نتیجه دیتابیس بودن Redis موضوعی است که به صورت کامل مشخص نیست.

حال سؤال اینجاست از چه دیتابیس­ هایی به عنوان دیتابیس اصلی نرم‌افزار استفاده می ­شود که در جدول زیر به همراه ویژگی‌های آن‌ها گفته شده است.

3- ( انواع داده) Data type

Redis از پنج نوع داده­ پشتیبانی می­ کند که به تفصیل در ادامه بررسی شده است و جهت ذخیره و بازیابی آن‌ها از دستور (command) هایی استفاده می­ شود که تعداد آن‌ها بالغ بر 160 دستور است. لیست کامل دستور  ها را می ­توانید از اینجا ببینید که در ادامه مقاله برخی از آن‌ها را بررسی خواهیم کرد.

 

 1-3- String
برای ذخیره اطلاعات رشته‌ای (String) از این نوع داده استفاده می ­شود. شمای کلی این نوع داده در شکل زیر قابل‌مشاهده است. برای هرکلید می ­توان 232 بیت ذخیره کرده که حدود 512 مگابایت دیتا است و مناسب برای ذخیره مقادیر باینری مانند فایل­ ها ست.

دستورها برای ذخیره و بازیابی این نوع داده مطابق جدول زیر است:

دستور

نحوه کار

GET

استخراج value ذخیره شده با key دریافتی

SET

نگاشت key دریافتی به  value دریافتی و ذخیره آن

DEL

حذف value ذخیره شده با key دریافتی

 

2-3- List

یک لیست پیوندی است که از سمت چپ و راست می ­توان به آن مقدار اضافه کرد که در شکل زیر شمای آن قابل‌مشاهده و بررسی است.

 دستورها برای ذخیره و بازیابی این نوع داده مطابق جدول زیر است:

دستور

نحوه کار

RPUSH

افزودن value از سمت راست به list

LRANGE

استخراج دامنه­ ای از value ها از list

LINDEX

استخراج آیتم با دریافت index آن

LPOP

pop کردن value از لیست و بازگشت آن

3-3- Set
یک مجموعه از آیتم­ ها که بدون ترتیب خاصی در کنار هم قرار گرفته‌اند و برای هر کلید می ­توان 232 بیت که حدود 4 بیلیون عضو است تعریف کرد. این نوع داده از اجتماع و اشتراک و سایر عملیاتی که بر روی مجموعه­ ها در ریاضیات قابل انجام است پشتیبانی می ­کند. شمای این نوع داده مطابق شکل زیر است.

  

دستورها برای ذخیره و بازیابی نوع داده Set مطابق جدول زیر است:

دستور

نحوه کار

SADD

افزودن آیتم به set

SMEMBERS

استخراج کل آیتم­های set

SISMEMBER

بررسی وجود آیتم در set

SREM

حذف آیتم از set به شرطی که آیتم موجود باشد

 

4-3- Sorted Set) Zset)‌
این نوع داده ترتیب بندی شده نوع داده Set است که ترتیب آن بر اساس Score است و از عملگرهایی که بر روی Set اجرا می ­شود پشتیبانی کرده و عملیات مرتب سازی را در هنگام اضافه کردن آیتم انجام می ­دهد. شمای این نوع داده مطابق شکل زیر است.

دستورها برای ذخیره و بازیابی این نوع داده مطابق جدول زیر است:

دستور

نحوه کار

ZADD

افزودن عضو به همراه score در zset

ZRANGE

استخراج آیتم­های zset با دریافت position آن‌ها که مرتب هستند

ZRANGEBYSCORE

استخراج آیتم­ها از zset بر اساس دامنه score

ZREM

حذف آیتم از zset به شرطی که آیتم موجود باشد

5-3- Hash
نگهداری اطلاعات در قالب Hash که نگاشتی بین کلیدهای از نوع رشته به مقادیری از نوع رشته است و بهترین نوع داده برای ذخیره Object ها در Redis است. برای هر Hash می‌توان 232 – 1 کلید-مقدار (field-value) ذخیره کرد. که معادل بیش از 4 بیلیون کلید-مقدار می‌شود شمای این نوع داده مطابق شکل زیر است.

 

دستورهای قابل‌اجرا  روی این نوع از داده مطابق جدول زیر است که این قابلیت را ایجاد کرده که نوع داده Hash را تعریف کنیم و از آن استفاده کنیم.

دستور

نحوه کار

HSET

ذخیره value برای key مورد نظر در hash

HGET

استخراج value  از key داده شده در hash

HGETALL

استخراج کل hash

HDEL

حذف key از hash به شرطی که key موجود باشد

 

4- ماندگاری (Persistence)

با توجه به این که Redis داده­ ها را در ram به عنوان یک حافظه ­ی ناپایدار نگه داری می ­کند در صورت بروز مشکل در سرور، امکان از دست رفتن داده­ ها وجود دارد. برای جلوگیری از دست رفتن داده­ ها می ­بایست داده­ ها را به حافظه پایدار مانند disk انتقال داد. برای انجام این کار دو روش وجود دارد که روی فایل config می ­توان روش مورد نظر را تنظیم کرد.

· Point-in-time-dump:

در دوره‌های معین در حافظه پایدارذخیره می‌شود. برای مثال انتقال داده­ ها به حافظه پایدار هر 20 دقیقه یکبار اتفاق بیافتد. هرچند در موارد اضطراری می ­توان با دستور dump-to-disk داده ­ها را در لحظه به حافظه پایدار انتقال داد.

· Append-only:

هر تغییری در حافظه ناپایدار را در لحظه به روی حافظه پایدار انتقال می ­دهد.

نتيجه

در این مقاله به بررسی دیتابیس Redis پرداختیم و ویژگی­ های آن را بررسی کردیم. هرچند Redis  را می‌توان به عنوان دیتابیس اصلی یک پروژه استفاده کرد ولی بیشتر به عنوان دیتابیس‌های جانبی نظير ذخیره­ session ها، لیست آخرین بازدید کننده ها، صف بندی و از همه مهم‌تر در لایه cache استفاده می ­شود .اکثر شرکت‌ها نظیر توییتر، اینستاگرام و ... از ردیس در لایه­ ی cache استفاده می ­کنند و پیشنهاد می ­شود با توجه به قابلیت‌های خوب آن از ردیس به عنوان Cache استفاده شود.

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
alireza.am885
alireza.am885
۱۳۹۹/۱۰/۱۰
جا داره یه تشکر ویژه داشته باشم از تیم تولید محتوای سکان اکادمی❤👏
چه دوره‌ی خوبی رو استارت زدید
من که مشتاقانه منتظر ادامه ی دوره هستم
راستی قرار بود یه پادکست هم با آقای بهزاد مرادی داشته باشیم ؟ زمانش مشخص نشده هنوز ؟
کاربر میهمان
کاربر میهمانمن یک کاربر مهمان هستم
۱۳۹۹/۱۰/۰۹
بسیار عالی