خوب بذار مساله رو برات بازتر کنم.
دیتابیس (Database) مجموعهای از داده هاست که با قاعدهی خاصی گرد هم قرار گرفتن.
چیزهایی مثل MySQL یا Postgres یک دیتابیس نیستن! اینها «نرم افزارهای مدیریت دیتابیس» هستن (DBMS) که اکثر اوقات برای
راحتی کار نویسنده و مخاطب اون ها رو دیتابیس هم خطاب میکنن. اما در اصل Database و DBMS دو مفهوم مستقل هستن.
امثال MySQL و Postgres به عنوان یک DBMS، دیتابیس های شما رو در دیسک ذخیره میکنن. البته نوع ذخیره سازی و یا جستجو در
دیتابیس میتونه از هر DBMS به DBMS بعدی متفاوت باشه. چند سال اخیر DBMS هایی تحت جنبش NoSQL فعال شدن که فرق اساسی اون
ها با امثال MySQL و Postgres در همین قواعد ذخیره سازی و جستجو هست، مثل MongoDB
اما هیچ قانونی وجود نداره که یک DBMS حتما باید دیتابیس شما رو در دیسک ذخیره کنه. دیتابیس شما میتونه در RAM ذخیره بشه.
Redis یکی از این DBMS هاست که دیتابیس رو در رم ذخیره میکنه. البته Redis به طور کل یک DBMS نیست، بلکه صرفا مهیا کننده
یک سرور برای کار با «ساختمان داده» های مستقل ار زبان هست. مهم ترین ساختمان داده در Redis جداول هش هستن که به صورت
key/value ذخیره میشن و بسیار کاربردی هستن. خوب ممکنه بپرسید که من هش ها رو در پایتون دارم (dict)، و در Go هم دارم (map)
پس چرا اصلا باید از همچین چیزی استفاده کنم؟
اینجاست که اون قسمت «مستقل از زبان بودن» وارد بازی میشه. به این حالت اگر شما در Redis یک جدول هش درست کنید، میتونید
از تمام زبان هایی که از Redis پشتیبانی میکنن به اون جدول هش دسترسی داشته باشید. شرکت های بزرگ چون قسمت های مختلف سیستم
هاشون در زبان های مختلف نوشته میشه، همچین چیزی براشون خیلی حیاتی هست. مثلا توی قسمتی از سیستم که با پایتون نوشته شده یک
جدول هش در Redis قرار میدید و در همون حین جای دیگه ای از سیستم که با جاوا نوشته شده میتونه از اون جدول هش استفاده کنه.
از طرفی چون تمام این داده ها در رم ذخیره میشن، سرعت بسیار بالایی به نسبت دیسک دارن و خوندن و نوشتن روی این داده ها با
تاخیر پایینی انجام میشه (گاها صد تا هزار برابر!). ناگفته نمونه همین دلیل (که همه چیز در رم هست) باعث میشه شما نتونید
داده های خودتون رو به صورت همیشگی ذخیره کنید چون رم داده ها به طور موقتی نگه داری میکنه. پس اگه فرضا قصدتون اینه که
اطلاعات یک شرکت رو ذخیره سازی کنید، Redis و امثال اون گزینهی مناسیب نیستن.
یکی از مورد هایی که میتونه نمونهی خوبی برای کاربرد چیزی مثل Redis باشه همونی هست که جادی مثال زد. ذخیره کوکی ها در سمت
سرور، ذخیره session ها، کنترل ورود و خروج کاربر،... از همه مهمتر اشتراک داده ها (توسط ساختمان های دادهي فراهم شده در Redis)
با دیگر قسمت های سیستم که هر کدوم ممکنه در زبان های مختلفی نوشته شده باشن.
کلا هر داده ایی که نیازی نیست به صورت دائم ذخیره بشه، بهتره با Redis مدیریت بشه چون سرعت خواندن و نوشتن این داده ها بسیار
بالاتر میره. داده هایی هم که باید به صورت دائم ذخیره بشن، بهتره از امثال MySQL یا Postgres استفاده کنن.
چون شما میخواید از Go استفاده کنید، Postgres ساپورت خیلی خوبی داره و یه گزینهی عالی هست. و MongoDB رو حتی یکی از اعضای تیمشون
هم در جایی گفته بود که خودشون هم در 10gen میدونن که بهترین رابط برنامه نویسی MongoDB رو Go در اختیار داره (که از طرف کنونیکال توسعه داده میشه!)
در حال حاظر فکر میکنم Postgres یکی از قدرتمندترین و پایدارترین و سریعترین DBMS های موجود باشه که تقریبا رقابت باهاش برای
بقیه خیلی دشوار هست! مخصوصا در نسخههای جدیدش که قابلیت های DBMS های NoSQL رو هم اضافه کرده و تو این زمینه هم شاید از MongoDB
چیزی کم نداشته باشه. حتی شاید بتونیم بگیم که یکی از بهترین DBMS های NoSQL هست!
اگر احیانا در جایی میشنوید که NoSQL ها سریع تر از DBMS های کلاسیک هستند، اول از همه باید بدونید که در موقعیت های مختلف عنصر
سرعت بسیار متغیر هست. و دوم هم اینکه از خودتون سوال کنید که چرا سرعتشون ممکنه بالاتر باشه؟ آیا از تکنیک خاصی استفاده کردن؟ آیا
ممکنه که قابلیت هایی رو فدای سرعت کرده باشن؟ آیا من میتونم همون تکنیک ها رو در DBMSهای کلاسیک داشته باشم؟ بعد از مدتی تحقیق
به این نتیجه خواهید رسید که NoSQL ها شاید دقیقا اون چیزی نباشن که تبلیغ میکنن!
این بحث البته خارج از حوصله این مطلب، و خود
من هست D: