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) از این نوع داده استفاده می شود. شمای کلی این نوع داده در شکل زیر قابلمشاهده است. مقادیر می توانند از هر نوع (از جمله داده های باینری) باشند. به عنوان مثال میتوانید یک تصویر jpeg را در یک مقدار ذخیره کنید. توجه داشته باشید که به طور پیش فرض، یک رشته Redis می تواند حداکثر 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 میتوان بیش از 4 بیلیون کلید-مقدار ذخیره کرد. در عمل، هشهای شما فقط توسط حافظه کلی روی ماشینهای مجازی که استقرار Redis شما را میزبانی میکنند، محدود میشود. شمای این نوع داده مطابق شکل زیر است.
دستورهای قابلاجرا روی این نوع از داده مطابق جدول زیر است که این قابلیت را ایجاد کرده که نوع داده 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 استفاده شود.