Redis یک in-memory database متنباز است که بهعنوان پایگاهداده، حافظه پنهان و یک واسطه پیام استفاده میشود. این سیستم از انواع ساختارهای داده؛ مانند هشها، رشتهها، لیستها، مجموعهها، بیت مپها، هایپرلاگها، مجموعههای مرتب شده با کوئریها، شاخصهای جغرافیایی مکانی و همچنین استریمها پشتیبانی میکند. بهعلاوه دارای تخلیه LRU، اسکریپتنویسی Lua، تکثیر داخلی، تراکنشها و همچنین مراحل مختلف ماندگاری بر روی دیسک است که امکان دسترسی بالایی از طریق Redis Sentinel و پارتیشنبندی اتوماتیک با کمک Redis Cluster را فراهم میکند.
فردی که میداند چگونه از Redis استفاده کند، میتواند تعدادی عملیات مانند افزایش مقدار، الحاق به رشته، محاسبه تقاطع مجموعه، اتحاد و اختلاف، افزودن یک عنصر به لیست یا جمعآوری عضو با بیشترین رتبهبندی در یک مجموعه مرتب شده در یک هش را اجرا کند.
برای دستیابی به عملکردی برجسته، Redis با یک مجموعهداده داخلی در حافظه کار میکند.
بر اساس موارد استفاده میتوان با ریختن یک مجموعهداده هرچند وقت یکبار روی دیسک یا با ضمیمهکردن هر یک از دستورات به یک ورودی، همان حالت را ادامه داد. در صورت نیاز به حافظه پنهان شبکهای سرشار از ویژگی، پایداری بهراحتی غیرفعال میشود.
Redis حتی از تکثیر ناهمگن master-slave، در کنار همگامسازی بسیار سریع و غیر مسدودکننده، اتصال مجدد بهصورت خودکار با یکپارچهسازی مجدد جزئی در شبکه نیز پشتیبانی میکند.
ویژگیهای Redis
Redis به زبان ANSI C نوشته شده است و در اکثر سیستمهای POSIX مانندBSD ،Linux و OS X بدون هیچگونه وابستگی خارجی کار میکند. OS X و Linux دو سیستمعاملی در نظر گرفته شدهاند که Redis بیشترین پیشرفت را در آنها داشته و آزمایش شده است، هرچند که از لینوکس برای استقرار سیستم مشابه نیز استفاده میشود. Redis ممکن است در سیستمهای مشتق شده از Solaris مانند SmartOS همکار کند، اما پشتیبانی اهمیت دارد. متأسفانه هیچ پشتیبانی رسمی برای ویندوز ارائه نشده، اما مایکروسافت پورت Win-64 را برای Redis توسعه و نگهداری کرده است. در سال ۲۰۱۹، Redis دهمین سالگرد خود را جشن گرفت و سایر ویژگیهای قابلتوجه آن به شرح زیر است:
سطح بالای ساختارهای داده
Redis پنج گزینه داده احتمالی را برای مقادیر ارائه میدهد که شامل هشها، لیستها، مجموعهها، رشتهها و مجموعههای مرتب شده است. عملیاتی که منحصر به این نوع دادهها است، ارائه میشود و همراه با پیچیدگی زمانی کاملاً مستند (نماد Big O) میباشد.
Performance
به دلیل ماهیت درون حافظه بودن و تعهد دادن یک مدیر پروژه برای اطمینان از حداقل پیچیدگی و همچنین مدل برنامهنویسی مبتنی بر رویداد، این برنامه دارای یک عملکرد استثنایی برای خواندن و نوشتن عملیات است.
بسیار سبکوزن و بدون وابستگی
Redis به زبان ANSI C نوشته شده است و به هیچ وابستگی خارجی محدود نمیشود. این برنامه در تمام محیطهای POSIX بهخوبی کار میکند. سیستمعامل ویندوز به طور رسمی برای Redis پشتیبانی نمیشود، اما یک نسخه آزمایشی توسط مایکروسافت برای آن در نظر گرفته شده است.
High Availability
Redis برای اطمینان از دردسترسبودن دادههای سطح بالا، از پشتیبانی داخلی برای تکرار غیر مسدودکننده، ناهمگامی و پاسخگویی master/slave پشتیبانی میکند. در حال حاضر یک راهحل با قابلیت دسترسی بالا به نام Redis Sentinel وجود دارد که در حال حاضر قابلاستفاده است، اما هنوز هم بهعنوان یک پروژه در حال انجام در نظر گرفته شده است.
چرا ردیس؟
اکنون که به استفاده از Redis رسیدهایم، میتوان سؤال کرد که چرا باید از Redis استفاده کرد یا اینکه با استفاده از Redis در مقایسه با دیگر نمونههای آن چه چیزی به دست میآوریم؟ خوب، شکی نیست که Redis یک کلاس جدا از سایر رقبا است. اما آنچه آن را منحصربهفرد میکند خلاقیت و کارایی آن است. در زیر برخی از مهمترین دلایلی که باید حداقل یکبار Redis را امتحان کنید ذکر شده است.
سرعت فوقالعاده بالا
Redis فوقالعاده سریع است و این امر به دلیل نگارش آن به زبان C میباشد.
پایگاهداده NoSQL
Redis یک پایگاهداده NoSQL است.
محبوبیت
در حال حاضر ردیس توسط تعدادی از غولهای فناوری مانند Pinterest ، Snapchat، GitHub،Weibo ،Digg ،StackOverflow ، Craigslist و Flickr مورداستفاده قرار میگیرد.
برای Caching مفید است
بهمنظور محافظت از فراخوانیهای پایگاهداده ابری و در نتیجه صرفهجویی در هزینههای اضافی، میتوان از طریق Redis گزینه caching را انتخاب کرد.
4. تعامل بالا با توسعهدهنده
Redis توسعهدهنده پسند است. در حال حاضر توسط اکثر زبانها پشتیبانی میشود که این یک مزیت بزرگ استفاده از این فناوری متنباز است. زبانهایی مانند C ،C ++ ،C# ،JavaScript ،Java ،Go ،Objective-C ،Python ، PHP و تقریباً همه زبانهای مشهور موجود از Redis پشتیبانی میکنند.
کاربردهای Redis
سادگی، عملکرد فوقالعاده سریع و همچنین دستکاری اتمی در ساختار دادهها آن را برای حل مشکلاتی که در صورت پیادهسازی همراه با پایگاههای داده سنتی رابطهای، دشوارند یا عملکرد ضعیفی دارند، پیشنهاد میدهد. برخی از کاربردهای محبوب ردیس به دلیل ماهیت متنوع آن به شرح زیر است:
صفها
پروژههایی مانند Rescue از Redis در backend برای کارهای صف پیشزمینه استفاده میکنند.
انتشار و اشتراک
از زمان راهاندازی نسخه ۲.0، Redis قابلیت توزیع دادهها را با استفاده از الگوی انتشار / اشتراک ارائه میدهد. برخی از سازمانها فقط به دلیل عملکرد قابلاعتماد Redis و سادگی آن تغییر مسیر دادهاند و از سیستمهای دیگر کار با صف (مانند RabbitMQ ، zerm و …) دور شدهاند.
حافظه پنهان
به دلیل عملکرد بالا، تعدادی از توسعهدهندگان در زمانی که حجم عملیات خواندن و نوشتن بیش از توانایی پایگاههای داده سنتی است، به Redis مراجعه کردهاند. باتوجهبه توانایی آن برای ماندگاری دادهها بر روی دیسک در مقایسه با راهحلهای سنتی برای ذخیرهسازی، Redis بهعنوان یک گزینه برتر در نظر گرفته میشود.
شمارندهها
دستورات اتمی مانند HINCRBY امکان اجرای ساده و بدون نخ شمارندههای مختلف را فراهم میکند. تشکیل یک شمارنده بهراحتی تعیین نام برای یک کلید و سپس صدور دستور HINCRBY است. حتی خواندن دادهها قبل از افزایش آنها هیچ فایدهای نداشته و حتی هیچ طرح دادهای برای بهروزرسانی وجود ندارد. ازآنجاکه این عملیات بهصورت اتمی انجام میگیرند، شمارندهها در صورت دستیابی به سرورهای برنامههای متعدد به حفظ ثبات کمک میکنند.
سازمانهای مشهوری که از REDIS استفاده میکنند
Redis نیازهای کاربران متعدد خود را جلب و تأمین کرده است. برخی از ویژگیهای مهمی که Redis را از سایر پایگاههای داده باارزش کلیدی جدا میکند این است که ردیس توانایی ذخیره و همچنین دستکاری انواع دادههای سطح بالا را دارد. این نوع دادهها شامل ساختارهای اساسی مانند نقشهها، لیستها و همچنین مجموعههای مختلف هستند. اینها برخی از انواع دادههاییاند که بیشتر توسعهدهندگان با آنها آشنا هستند. به دلیل چنین سهولت استفادهای، Redis جای خود را در سیستمعاملهای سازمانهای محبوب پیدا کرده است. جزئیات نحوه استفاده از Redis در یک سازمان خاص در زیر ذکر شده است.
۱. GitHub
گیتهاب یک سرویس میزبانی تحت وب برای اهداف پروژههای توسعه نرمافزار است که از سیستم کنترل Git استفاده میکند. این برنامه مخازن خصوصی و همچنین حسابهای رایگان برای پروژههای متنباز، سرویسهایی را ارائه میدهد. در حال حاضر گیتهاب مشهورترین سایت مخزن کد برای پروژههای متنباز در نظر گرفته شده است. گیتهاب اوایل پروژه Redis محسوب میشد. این سیستم بهمنظور سهولت در اجرای فرایندهای پسزمینهای که در یک صف قرار گرفتهاند، کتابخانهای به نام Rescue را ایجاد کرد. توسعهدهندگان گیتهاب از این واقعیت استفاده کردند که ردیس توانست بسیاری از مشکلات دشوار موجود در صف را حل کند؛ بنابراین توسعهدهندگان میتوانستند بر روی وظایف دشوار زمانبندی کارگران متمرکز شوند.
۲. Pinterest
پینترست یک وبسایت تصویری محبوب است که دارای تصاویر مبتنی بر مضامین مختلف میباشد و کاربران مجاز به مشاهده، اشتراکگذاری و همچنین بارگیری تصاویر باکیفیت بالا هستند. پینترست نمودارهای دنبالکننده کاربر را در یک خوشه Redis ذخیره میکند، جایی که دادهها با صدها نمونه مختلف به اشتراک گذاشته میشوند. پینترست شروع به استفاده از Redis کرد؛ زیرا متوجه شد که روش قبلی مثل MySQL و Memcached به حد اشباع رسیده است.
۳. Twitter
توییتر یک سایت شبکه اجتماعی محبوب است که به کاربران امکان میدهد دیدگاهها و نظرات خود را به اشتراک بگذارند. توییتر بهمنظور ذخیره جدول زمانی همه کاربران وبسایت، یک خوشه بزرگ Redis را مستقر کرده است. با استفاده از لیستی از ساختار دادهها، توییتر قادر است ۸۰۰ مورد از جدیدترین توییتهای ورودی جدید کاربر را ذخیره کند.
محدودیتهای Redis
جدا از مزایا و کاربردهایی که Redis ارائه داده است، مانند هر سیستم دیگری Redis نیز دارای اشکالاتی هست. بیایید نگاهی به برخی از چالشهای اساسی که ممکن است در هنگام استفاده از Redis با آنها روبهرو شوید، داشته باشیم.
۱. سطح امنیت
Redis فقط امنیت پایه (مانند حق دسترسی) را ارائه میدهد. اما RDBMS لیستهای کنترل دسترسی دقیق هر شی را فراهم میکند (همچنین بهعنوان مدیریت نقش شناخته میشود).
۲. سرور ساختار داده
در Redis هیچ زبان کوئری وجود ندارد و فقط دستورات هستند. همچنین هیچ پشتیبانی از جبر رابطهای وجود ندارد و نمیتوان کوئریهای موقت ارائه داد. تمام دسترسیهای داده باید توسط یک توسعهدهنده پیشبینی شود و مسیرهای دسترسی مناسب به دادهها طراحی شود. به همین دلیل اعتقاد بر این است که انعطافپذیری از بین میرود.
۳. ذخیرهسازی در حافظه داخلی
همه دادهها باید در حافظه قرار بگیرند. RDBMS عموماً اطلاعات موجود در دیسکها و حافظه پنهان دادهها را در خود ذخیره میکند. با استفاده از RDBMS میتوان دادههای بیشتری را نسبت به حافظه موجود مدیریت کرد. اما این کار با Redis امکانپذیر نیست
با این حال، برای بسیاری از موارد استفاده، Redis تضمین های کافی را ارائه می دهد که می تواند به عنوان یک پایگاه داده اولیه کامل استفاده شود. همراه با پلاگین های Redis و تنظیمات مختلف آن با دسترسی بالا (HA)، Redis به عنوان یک پایگاه داده برای سناریوها و بارهای کاری خاص بسیار مفید است.
یکی دیگر از جنبه های مهم این است که Redis خطوط بین حافظه پنهان و ذخیره اطلاعات را محو می کند. نکته مهمی که در اینجا باید بدانید این است که خواندن و دستکاری داده ها در حافظه بسیار سریعتر از هر چیزی که در دیتا استورهای سنتی با استفاده از SSD یا HDD ممکن است انجام می شود.
مقایسه Memcached با Redis
Memcached | Redis | |
---|---|---|
Sub-millisecond latency | Yes | Yes |
Developer ease of use | Yes | Yes |
Data partitioning | Yes | Yes |
Support for a broad set of programming languages | Yes | Yes |
Advanced data structures | – | Yes |
Multithreaded architecture | Yes | – |
Snapshots | – | Yes |
Replication | – | Yes |
Transactions | – | Yes |
Pub/Sub | – | Yes |
Lua scripting | – | Yes |
Geospatial support | – | Yes |
بررسی معماری Redis
قبل از شروع بحث در مورد داخلی های Redis، اجازه دهید در مورد استقرارهای مختلف Redis و مبادلات آنها صحبت کنیم.
ما عمدتاً بر روی این تنظیمات تمرکز خواهیم کرد:
- Single Redis Instance
- Redis HA
- Redis Sentinel
- Redis Cluster
بسته به مورد استفاده و مقیاس خود، می توانید تصمیم بگیرید که از یک راه اندازی یا دیگری استفاده کنید.
Single Redis Instance
Single Redis Instance ساده ترین استقرار Redis است. این به کاربران اجازه میدهد نمونههای کوچکی را راهاندازی و اجرا کنند که میتواند به رشد و سرعت بخشیدن به خدماتشان کمک کند. با این حال، این استقرار بدون کاستی نیست. به عنوان مثال، اگر این نمونه از کار بیفتد یا در دسترس نباشد، همه ریکوئست های مشتری با Redis با شکست مواجه میشوند و در نتیجه عملکرد و سرعت کلی سیستم را کاهش میدهند.
با توجه به حافظه کافی و منابع سرور، این نمونه می تواند قدرتمند باشد. سناریویی که در درجه اول برای ذخیره سازی استفاده می شود، می تواند منجر به افزایش عملکرد قابل توجه با حداقل تنظیمات شود. با توجه به منابع کافی سیستم، میتوانید این سرویس Redis را در همان کادری که برنامه در حال اجرا است، مستقر کنید.
درک چند مفهوم Redis در مدیریت داده ها در سیستم ضروری است. دستورات ارسال شده به Redis ابتدا در حافظه پردازش می شوند. سپس، اگر تداوم روی این نمونهها تنظیم شود، در برخی بازهها یک فرآیند دوشاخهای وجود دارد که تداوم دادهها را تسهیل میکند RDB (نمایش بسیار فشرده در زمان دادههای Redis) یا AOF.
این دو جریان به Redis اجازه می دهد تا ذخیره طولانی مدت داشته باشد، از استراتژی های تکراری مختلف پشتیبانی کند و توپولوژی های پیچیده تری را فعال کند. اگر Redis برای ماندگاری داده ها تنظیم نشده باشد، در صورت راه اندازی مجدد یا شکست، داده ها از بین می روند. اگر تداوم در راه اندازی مجدد فعال شود، تمام داده های موجود در عکس فوری RDB یا AOF را دوباره در حافظه بارگیری می کند و سپس نمونه می تواند درخواست های مشتری جدید را پشتیبانی کند.
با این گفته، اجازه دهید تنظیمات Redis توزیع شده بیشتری را که ممکن است بخواهید از آن استفاده کنید، بررسی کنیم.
Redis HA
یکی دیگر از راهاندازیهای محبوب با Redis، استقرار اصلی با استقرار secondary است که با تکرار همگام میشود. همانطور که داده ها در نمونه اصلی نوشته می شوند، کپی هایی از آن دستورات را برای نمونه های secondary به یک بافر خروجی مشتری replica ارسال می کند که تکرار را تسهیل می کند. نمونه های secondary می توانند یک یا چند نمونه در استقرار شما باشند. این نمونه ها می توانند به مقیاس خواندن از Redis کمک کنند یا در صورت از بین رفتن اصلی، failover را ارائه دهند.
Redis Sentinel
Sentinel مسئول چند چیز است. اول، تضمین می کند که نمونه های اصلی و فرعی فعلی عملکردی و پاسخگو هستند. این امر ضروری است زیرا sentinel (با سایر فرآیندهای sentinel ) می تواند هشدار دهد و در موقعیت هایی که گره های اصلی و/یا ثانویه از بین رفته اند، عمل کند. دوم، نقشی در کشف خدمات دارد، مانند Zookeeper و Consul در سیستمهای دیگر. بنابراین هنگامی که یک کلاینت جدید سعی می کند چیزی برای Redis بنویسد، Sentinel به مشتری می گوید که نمونه اصلی فعلی چیست.
بنابراین sentinel دائماً در دسترس بودن را زیر نظر میگیرند و آن اطلاعات را برای مشتریان ارسال میکنند تا در صورت عدم موفقیت، بتوانند به آنها واکنش نشان دهند.
در اینجا مسئولیت های آن آمده است:
نظارت – حصول اطمینان از اینکه موارد اصلی و فرعی مطابق انتظار کار می کنند.
اعلان – مدیران سیستم را در مورد اتفاقات در نمونه های Redis مطلع کنید.
مدیریت شکست – گرههای Sentinel میتوانند فرآیند شکست را شروع کنند اگر نمونه اولیه در دسترس نباشد و تعداد کافی (نصاب) گرهها موافق باشند که درست است.
مدیریت پیکربندی – گره های Sentinel همچنین به عنوان نقطه ای برای کشف نمونه اصلی Redis فعلی عمل می کنند.
استفاده از Redis Sentinel در این روش امکان تشخیص خرابی را فراهم می کند. این تشخیص شامل چندین فرآیند Sentinel است که توافق می کنند نمونه اصلی فعلی دیگر در دسترس نیست. به این فرآیند توافق، Quorum گفته می شود. این باعث افزایش استحکام و محافظت در برابر عملکرد نادرست یک ماشین و عدم دسترسی به گره اصلی Redis می شود.
این مقاله در حال بروز رسانی می باشد