Redis چیست؟
۱۷ تیر ۱۳۹۹
Redis یک دیتابیس در حافظه موقت (in-memory) است (به عبارتی دیتا را بجای این که مانند سایر دیتابیسها بر روی دیسک نگه دارد، آنها را در حافظه نگه میدارد که به مراتب باعث افزایش سرعت به هنگام دسترسی به این دادهها میشود.) که بر اساس ساختار کلید و مقدار (key-value) اطلاعات را ذخیره میکند. Redis مخفف REmote DIctionary Server است و معمولا به عنوان دیتابیسی برای انواع ساختار داده شناخته میشود. یکی از تفاوتهای اساسی میان Redis و سایر دیتابیسهایی که بر اساس key-value هستند، این است که Redis میتواند ساختار دادههای سطح بالا را ذخیره و یا ویرایش کند. این نوع ساختار دادهها، همان ساختارهای اساسی مانند listها، mapها، setها و همچنین setهای مرتب شده، که اکثر توسعهدهندگان با آنها آشنا هستند است.
ویژگیهایی نظیر سادگی، کارایی استثنایی و خاصیت atomic در ویرایش دادهها در Redis باعث میشود که حل کردن مسائلی که در دیتابیسهای متداول رابطهای نظیر MySQL مشکل بود، در Redis به راحتی انجام شود.
استفادههای متداول:
- Caching: به دلیل کارایی بالای Redis در این که حجم و سرعت خواندن و نوشتن در Redis از دیتابیسهای رابطهای بسیار بالاتر و بیشتر است، اکثر توسعه دهندگان سراغ Redis میروند. با توجه به قابلیتهای Redis در اینکه میتوان تمام دادهها را بر روی دیسکها ذخیره کرد (redis persistence)، جایگزین memcached در کشکردن نیز است.
- Publish and Subscribe: بعد از نسخه 2.0، Redis قابلیتی تحت عنوان الگوی پیامرسانی Public/Subscribe معرفی کرد که برای توزیع دادهها استفاده میشود. برخی از سازمانها به دلیل سادگی و کارایی بالای Redis، از سایر سیستمهای توزیع پیام نظیر RabbitMQ و Zeromq به Redis مهاجرت کردند.
- Queues: پروژههایی نظیر Resque از Redis برای ایجاد صف background job استفاده میکنند.
- Counters: دستورات atomic مانند HINCRBY، اجازه پیادهسازی ساده و به صرفه شمارندهها را میدهند. ایجاد یک شمارنده به سادگی تعیین یک نام برای کلید و یا فیلد و اجرای دستور HINCRBY است. هیچ نیازی به خواندن دیتا قبل از افزایش شمارنده و در واقع طرح و اساسی برای بروزرسانی آن نیست. از آنجایی که این نوع دستورات، دستورات atomic هستند، شمارندهها پایداری خود را به هنگامی که توسط چندین سرور تغییر مییابند، حفظ میکنند.
ویژگیهای اساسی:
- ساختار دادههای سطح بالا: از ساختار دادههایی نظیر: listها، stringها، setها، hashها و setهای مرتب شده به عنوان مقادیر پشتیبانی میکند. همچنین تمام عملیاتی که منحصر به هر کدام از این نوع از ساختار دادهها هستند نیز پشتیبانی میشوند که در این لینک میتوانید آنها را مشاهده کنید.
- کارایی بالا: به دلیل قابلیت در حافظه بودن Redis، باعث میشود تا توسعهدهندگان یک پروژه پیچیدگی را در پایینتر سطح ممکن نگه دارند و بنا به مدل برنامهنویسی براساس eventها، Redis کارایی استثنایی و فوقالعاده خود را در خواندن و نوشتن بر روی دادهها نشان میدهد.
- سبکبودن و عدم نیاز به سایر پکیجها: با ANSI C نوشته شده است و هیچ وابستگی یا dependency خارجی ندارد. به خوبی در محیطهایی POSIX پشتیبانی میشود، اما به طور رسمی در ویندوز پشتیبانی ندارد. در ضمن نسخه آزمایشی توسط مایکروسافت ساخته شده است.
- دسترسی پذیری بسیار بالا: به دلیل ویژگیهایی نظیر asynchronous و non-blocking و قابلیت master/slave replication، میتوان دسترسی پذیری و یا در دسترسبودن بسیار بالای دادهها را تضمین کرد. در حال حاضر راه حلی تحت عنوان Redis Sentinel وجود دارد که میتوان از آن استفاده کرد، اما هنوز درحال توسعه و پیشرفت است.
شرکتهایی که از Redis استفاده میکنند:
- Twitter: یک کلاستر از Redis را به جهت ذخیره سازی جدول زمانی کاربران ایجاد کردهاند. با استفاده از ساختار داده list، توییتر ۸۰۰ توییت جدید برای یک کاربر خاص را ذخیره میکند. میتوانید کنفرانس Twitter در رابطه با اینکه چگونه جداول زمانی را توزیع کردند را از این لینک مشاهده کنید.
- Pinterest: نمودارهای مربوط به دنبالکنندگان یک کاربر را در کلاستری از Redis، به نحوی که این دادهها میان نمونههای مختلفی به اشتراک گذاشته شده است، ذخیره میکند.
- Github: یکی از اولین حامیان Redis است. Github پروژه متنباز Resque را به جهت بهبود اجرای jobهایی که در صف پسزمینه قرار داشتند، توسعه داده است. توسعهدهندگان Github به این که Redis خیلی از مشکلها و دشواریهای صف و یا queue را حل میکند و همچنین مزایای آن پی بردهاند، به عبارتی توسعهدهندگان در صورت عدم استفاده از Redis همچنان باید زمان زیادی را بر روی مشکلها و دشواریهای برنامهریزی workerها صرف میکردند.
Redis در مقابل Memcached:
هر دو پروژه متنباز هستند و در عین حال دیتا را در حافظه اصلی ذخیره میکنند. اما تفاوت این دو جایی معلوم میشود که به سراغ ویژگیها و قابلیتهای آنها میرویم. Memcached اغلب برای پروژههای ساده که حافظه Ram کمی مصرف میکنند عالی است، اما در همین حین در مواجه با دادههای مرتب شده و یا serialize شده نامناسب است. به دلیل پشتیبانی Redis از اکثر ساختار دادههای مختلف، قدرت و کارایی بیشتری در برخورد با مجموعه دادههای بسیار زیاد دارد. همچنین توانایی بیشتری در بهبود cache و راندمان در برنامههای مخصوص دارد.
Redis در مقابل MongoDB:
تفاوت این دو در این است که یکی به صورت دیتابیسی در حافظه، دیگری دیتابیسی بر روی دیسک است و هر کدام برای هدف خاصی طراحی شدهاند اما اغلب در کنار هم با هدف افزایش سرعت پردازش و کارایی دیتابیسهای NoSQL استفاده میشوند. به دلیل قابلیت cache که در Redis وجود دارد، خیلی سریعتر میتوان به دادهها دسترسی پیدا کرد. در نتیجه میتوانیم از این قابلیت بهره ببریم و Redis را به عنوان رابطی برای MongoDB استفاده کنیم تا بتوانیم سریعتر و موثرتر دادههای بیشتر و بزرگتری را real-time تر بروزرسانی و ویرایش کنیم. به دلیل این که MongoDB میتواند حجم قابل توجهی از دادهها را ذخیره کند و از طرف دیگر با توجه به سرعت بسیار بالای Redis در پردازش آنها، استفاده از این دو درکنار یکدیگر میتواند راه حلی برای مسائل مختلفی که در آنها سرعت و کارایی حرف اول را میزند، باشد.
ترکیب ساختار دادههای سطح بالا، عملکرد وصف نشدنی و بسیار عالی Redis و سایر مسایلی که مطرح کردیم باعث میشود که Redis نقش آچار فرانسه در ذخیرهسازی دادهها را برای توسعهدهندگان داشته باشد.
Redis برای حل چالشهایی که به هنگام ساخت سیستمهای بلادرنگ یا real-time، به دلیل برخورداری از عملیاتی که برای دیتاها در دیتابیس نیاز است، مناسب است.
Redis بیشتر کارایی و تمرکز خود را بر روی این میگذارد که دادهها در حافظه هستند. در عین حال دادههای Redis قابلیت ذخیرهسازی بر روی دیسک را نیز دارند، اما به این نکته توجه کنید که اگر تنظیمات Redis به صورت اشتباه انجام شود، موجب از دست دادن بخش بزرگی از دادهها، به هنگام خاموش کردن و یا پایین آمدن ناگهانی Redis میشود.
منبع: https://www.credera.com/blog/technology-insights/java/redis-explained-5-minutes-less