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

معرفی 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 موضوعی است که به صورت کامل مشخص نیست.

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

Redis یک دیتابیس غیررابطه ای  بر اساس معماری کلید-مقدار

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

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

 1-3- String 

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

 String دیتا تایپی برای ذخیره اطلاعات رشته ای

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

دستور

نحوه کار

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 

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

دستور

نحوه کار

SADD

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

SMEMBERS

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

SISMEMBER

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

SREM

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

 

4-3- Sorted Set) Zset)‌ 

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

دیتا تایپ Sorted Set

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

دستور

نحوه کار

ZADD

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

ZRANGE

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

ZRANGEBYSCORE

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

ZREM

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

 

5-3- Hash 

نگهداری اطلاعات در قالب Hash که نگاشتی بین کلیدهای از نوع رشته به مقادیری از نوع رشته است و بهترین نوع داده برای ذخیره Object ها در Redis است. برای هر Hash می‌توان بیش از 4 بیلیون کلید-مقدار ذخیره کرد. در عمل، هش‌های شما فقط توسط حافظه کلی روی ماشین‌های مجازی که استقرار Redis شما را میزبانی می‌کنند، محدود می‌شود. شمای این نوع داده مطابق شکل زیر است.

 دیتا تایپ Hash برای نگهداری اطلاعات

دستورهای قابل‌اجرا  روی این نوع از داده مطابق جدول زیر است که این قابلیت را ایجاد کرده که نوع داده 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 استفاده شود.

online-support-icon