بانکهای اطلاعاتی کلید/مقدار

یک مثال عملی با ردیس و پی اچ پی

اين مطلب يكي از مقالات ويژه نامه جنبش NoSQL نشريه ماهنامه شبكه در شماره ۱۳۳ با عنوان پایگاه‌هاي داده NoSQL در عمل مي‌باشد.

یکی از محبوب‌ترین انواع پایگاه‌هاي‌داده NoSQL، پایگاه‌هاي‌ داده‌ ذخیره‌کننده Key-Value هستند و همان‌طور که قبلاً نیز اشاره شده بود، مزیت آن‌ها در مقابل رقبای رابطه‌ای خود، تأخیر کم، توزیع پذیری بالا و جایگزینی‌پذیری بالا است که با استفاده از یک API ساده قابل دسترسی است. در این مقاله به بررسی مرحله به مرحله یک کاربرد نمونه از پایگاه‌داده Redis (که یکی از انواع معروف در زمینه ذخیره به‌صورت Key-Value است) خواهیم پرداخت. در این کاربرد نمونه، با استفاده از PHP و بدون استفاده از هیچ پایگاه داده دیگری، یک شبکه اجتماعی کوچک خواهیم ساخت که در مقابل نمونه‌هاي پیاده‌سازی شده با پایگاه‌های‌داده رابطه‌اي سنتی، عملکردی بسیار عالی دارد. با این حال، استفاده از حالت توزیع شده این برنامه مشکلاتی به دنبال دارد که در ادامه به آن‌ها اشاره خواهد شد.

آغاز کار

در این مقاله، به طراحی و پیاده‌سازی یک شبکه اجتماعی دست ساز با استفاده از PHP و پایگاه داده Redis که یکی از انواع ذخیره‌کننده Key/Value در مجموعه پایگاه‌های داده NoSQL است، خواهیم پرداخت. این برنامه، ساختاری ساده، عملکردی سریع و قابلیت توزیع روي n وب سرور و m سرور Redis را دارد و مثال خوبی برای آشنایی با چنین پایگاه‌های داده‌اي است! زبان PHP به این دلیل انتخاب شده که برای بيشتر افراد قابل درک بوده و ساده است. در صورتی که چنین برنامه‌اي با استفاده از Ruby یا Python یا Erlang نوشته شود، نتایج اجرایی بهتری نیز به دنبال خواهد داشت.

مفاهیم پایه: ذخیره کننده‌هاي Key/Value

همان‌طور که قبلاً نیز گفته‌شده است، در ساده‌ترین بیان ممکن، پایگاه‌های داده key/value امکان ذخیره‌سازی داده‌هايي را که مقدار نامیده مي‌شوند، در مفاهیمی به نام کلید فراهم مي‌سازند. این نوع پایگاه‌های داده را مي‌توان گونه‌اي از دیکشنری‌های مخلوط دانست که به‌صورت باثبات، داده‌هاي عظیم را با روش‌هاي پیچیده و منحصر به فردی ذخیره‌سازی‌کرده، باز‌یابی‌مي‌کنند و مدیریت آن‌ها را بر‌عهده مي‌گیرند. برخلاف پایگاه‌های داده‌سنتی و روش وارد‌کردن‌داده‌ها و به‌روزرسانی آن‌ها، در این پایگاه‌هاي‌داده برای ذخیره‌سازی و بازیابی داده‌ها از دستورات استفاده مي‌شود. به‌عنوان مثال، برای ذخیره یک داده در پایگاه داده، باید از دستوری مشابه زیر استفاده کرد که در آن کلید و مقدار مشخصی برای آن تعیین شده باشد:

SET UserID 1422

در این حالت، پایگاه داده Redis با انجام امور پس‌زمینه در این رابطه، مقدار ۱۴۲۲ را در کلید UserID ذخیره مي‌کند. بازیابی مقادیر ذخیره شده در کلیدها، با استفاده از دستور GET انجام مي‌پذیرد.به عنوان مثال، دستور زیر مقدار ۱۴۲۲ را باز می‌گرداند.

GET UserID =>1422

دستورات دیگری که در چنین پایگاه‌های داده‌ای مورد استفاده قرار مي‌گیرند، عبارتند از DEL برای حذف کلیدها و مقادیر مربوط، SET if not exists (که در Redis با SETNX شناخته مي‌شود) که برای ذخیره مقادیر در کلیدهایی به‌کار مي‌رود که موجود نیستند و INCR که برای افزایش مقدار ذخیره شده در یک کلید منفرد است.
به عنوان مثال:

SET UserID 10
INCR UserID =>11

عملیات افزایش مقدار را مي‌توان به صورت زیر نیز پیاده‌سازی کرد:

SET X 1422
X = X+1
SET UserID X

با این اوصاف، عملیات INCR به این دلیل در این سیستم در نظر گرفته شده که انجام عملیات با استفاده از عملگر جمع تنها در زمانی انجام مي‌پذیرد که فقط یک کلاینت به سیستم وصل باشد. در صورتی که دو کلاینت به‌صورت هم زمان به سیستم دسترسی یابند و کد مربوط را اجرا کنند، نتیجه درستی به دست نخواهد آمد و نتیجه‌اي مشابه كدهاي ليست زیر را در پی خواهد داشت. (فهرست‌۱)

x = GET UserID (1422 را برمی‌گرداند) (۱۴۲۲ را برمی‌گرداند) y = GET UserID x = x + 1 (x is now 1422) y = y + 1 (y is now 1422) SET UserID x (اکنون مقدار ۱۴۲۳ است) SET UserID y (مقدار باز هم ۱۴۲۳ است)

فهرست ۱ – در صورتی که چند کلاینت به داده دسترسی داشته باشند، سیستم عملگر جمع کار نمی‌کند.

به همین دلیل، دستور SET که در پایگاه‌های داده Redis، Memcached و… استفاده مي‌شود، یک عملیات Atomic است که در آن سرور، وظیفه محافظت از داده‌ها و اتفاقاتی نظیر موارد بالا را بر‌عهده مي‌گیرد. یکی از عواملی که پایگاه داده Redis را از دیگر ذخیره‌کننده‌هاي Key-Value متمایز مي‌کند، غنی بودن آن در ارائه دستوراتی نظیر SET است که امکان تولید‌برنامه‌هاي وب بدون نیاز به پایگاه‌های داده SQL و همچنین سردرگمی در مسائل پیچیده را فراهم مي‌سازد.

دستور SET که در پایگاه‌های داده Redis Memcached و… استفاده مي‌شود، یک عملیات اتميك است که در آن سرور، وظیفه محافظت از داده‌ها و اتفاقاتی نظیر موارد بالا رابر‌عهده مي‌گیرد

فراتر از کلید-مقدار

پایگاه‌‌داده Redis، قابلیت‌هاي بسیار پیشرفته‌اي در زمینه‌مدیریت داده‌هاي کلید/مقداری دارد. یکی از این امکانات پیشرفته، امکان ذخیره سازی لیست‌ها و مجموعه‌ها (علاوه بر متغیرهای رشته‌اي ساده) به‌عنوان مقدار در کلیدها و همچنین ارائه عملیات Atomic پیشرفته برای آن‌ها است. کدهای زیر با استفاده از دستور LPUSH یا Left Push، مقادیری را به ابتدای یک لیست با نام UserIDs اضافه می‌کند:

LPUSH UserIDs 1422

هم اکنون لیست مورد نظر حاوی یک المان با مقدار ۱۴۲۲ است

LPUSH UserIDs 1423

هم اکنون لیست ما حاوی مقدارهای روبه‌رو است

‘۱۴۲۲,۱۴۲۳’
LPUSH UserIDs 1424

هم اکنون لیست ما حاوی مقدارهای پایین است

‘۱۴۲۴,۱۴۲۳,۱۴۲۲’

برای کار با لیست‌ها، دستور مشابهی برای انجام عملیات از انتهای لیست با نام RPUSH نیز وجود دارد. این عملیات امکان مناسبی در زمینه تولید برنامه شبکه اجتماعی مورد نظر در اختیار كاربر مي‌گذارد. در این حالت، مي‌توان ليستي را با نام username:updates در نظر گرفت و به‌روزرسانی‌هاي کاربران را در آن ذخیره كرد. برای دسترسی به مقادیر ذخیره شده در هر لیست، مي‌توان از دستوری مشابه زیر استفاده کرد:

LRANGE UserIDs 0 1=>1424,1423

آرگومان‌هاي دستور LRANGE که برای بازیابی استفاده مي‌شود، اندیس‌هاي شروع شونده از صفر برای اشاره به عناصر لیست‌ها است که آرگومان اول، اندیس آغازین و آرگومان دوم، اندیس پایانی است. در این دستور،-۱ به معنای عنصر آخر و-۲ نیز به معنای عنصر یکی مانده به آخر است. مثالی دیگر در این زمینه عبارت است از:

 LRANGE UserIDs 0 -1 =>1424,1423,1422

دستورات سودمند دیگری نیز برای کار با لیست‌ها وجود دارند که از میان آن‌ها مي‌توان به LLEN برای تعیین طول لیست‌ها، LTRIM با آرگومان‌های مشابه LRANGE برای تولید لیست‌هاي زیر مجموعه با استفاده از عملیات Atomic اشاره كرد. مجموعه‌ها از دیگر نوع‌هاي داده‌اي سودمند در Redis هستند که مجموعه‌اي از المان‌هاي غیر‌مرتب‌سازی شده را ذخیره می‌کنند. به مجموعه‌ها مي‌توان عناصر مختلف را اضافه و حذف کرد، وجود آن‌ها را کنترل کرد و اشتراکات مجموعه‌ها را از سیستم درخواست كرد. دستور SADD برای اضافه کردن عناصر، SREM برای حذف آن‌ها، SINTER برای‌بازگردانی اشتراک‌مجموعه‌ها، SCARD برای بازگردانی‌مرتبه یک مجموعه و SMEMBER برای بازگردانی همه اعضای مجموعه به‌کار مي‌رود. توجه‌کنید که مجموعه‌ها، اعضای خود را به‌صورت مرتب نشده ذخیره‌کرده و باز مي‌گردانند و در صورت نیاز به مرتب‌سازی در بخش‌هاي مختلف، باید از لیست‌ها برای ذخیره‌سازی داده‌ها استفاده‌كرد. نکته دیگر این‌که دستور اشتراک‌گیری، محدودیتی در مجموعه‌هاي ورودی ندارد و مي‌توان ۲ یا ۱۰هزار مجموعه را برای اشتراک‌گیری به آن ارجاع داد. در فهرست ۲ نمونه‌اي از روش استفاده از این دستورها را مي‌بینید:

SADD Users a
SADD Users b
SADD Users c
SADD Users d
SCARD Users => 4
SMEMBERS Users => d,a,c,b
SADD Admins b
SADD Admins c
SADD Admins e
SINTER Users Admins =>c,b

فهرست ۲ – استفاده از دستورات کار با مجموعه‌ها در Redis
تاکنون به اندازه کافی با مفاهیم اصلی و دستورات کلیدی Redis آشنا شده‌اید و زمان آن رسیده است که به ساخت شبکه اجتماعی خود بپردازیم.

به دلیل این‌که Redis به‌طور ذاتی روي لینوکس توسعه داده مي‌شود، استفاده از آن روي لینوکس بهتر، ساده‌تر و پر بازده‌تر است.

پیش نیازها

حال که برخی خصوصیات کلی پایگاه داده Redis را بررسی‌کرده‌ایم، نوبت به آغاز‌کار مي‌رسد. همان‌طور که قبلاً نیز گفته‌ایم، برنامه شبکه اجتماعی که مد نظر داریم، بسیار ساده است. مي‌توانید کد این برنامه را از سایت ماهنامه به آدرسwww.shabakeh-mag.com دریافت كنيد. در این برنامه، از کتابخانه redis.php استفاده شده که برای اتصال به پایگاه داده redis از درون کد PHP مورد استفاده قرار مي‌گیرد. این کتابخانه ساده، برای استفاده موقت از Redis است .

داده‌ها در چنین پایگاه‌های‌داده‌اي، با استفاده از کلیدها بازیابی مي‌شوند و نمی‌توان از آن‌ها خواست تا برای مقادیری‌خاص، کلیدهای مربوط را بیابند.

برای نصب و استفاده از Redis، راه‌هاي متفاوتی وجود دارد. این پایگاه داده به‌طور ذاتی روي لینوکس توسعه داده مي‌شود، به همين دليل استفاده از آن روي لینوکس بهتر، ساده‌تر و پر بازده‌تر است. برای استفاده از آن روي لینوکس مي‌توان به سادگی کد مربوط را از سایت Redis دانلود‌کرده و پس از کامپایل در سیستم، از آن استفاده كنيد. در صورتی که مي‌خواهید روي ویندوز از Redis استفاده كنيد، مي‌توانید از نرم‌افزار Cygwin و نسخه لینوکسی Redis استفاده‌کرده یا نسخه ویندوزی شده Redis را (که توسط یک توسعه‌دهنده در زمان تعطیلاتش تولید شده است!) از آدرسhttps://github.com/ServiceStack/redis-windows دانلود کرده و مورد استفاده قرار دهید. با کمی جست‌وجو در وب نحوه کار و راه‌اندازی Redis را خواهید آموخت.

۰

میانگین امتیاز

شما هم امتیاز بدهید‍!

امتیاز کاربران: ۴٫۷۵ ( ۱ رای)
1 2برگهٔ بعدی

مجتبی بنائی

دانشجوی دکترای نرم‌افزار دانشگاه تهران (yun.ir/smbanaie)، مدرس دانشگاه و فعال در حوزه توسعه نرم‌افزار و مهندسی داده که تمرکز کاری خود را در چند سال اخیر بر روی مطالعه و تحقیق در حوزه کلان‌داده و زیرساخت‌های پردازش داده و تولید محتوای تخصصی و کاربردی به زبان فارسی و انتشار آنها در سایت مهندسی داده گذاشته است. مدیریت پروژه‌های نرم‌افزاری و طراحی سامانه‌های مقیاس‌پذیر اطلاعاتی از دیگر فعالیتهای صورت گرفته ایشان در چند سال گذشته است.

۲ دیدگاه

  1. سلام

    قبل از اینکه بخوایم با ردیس کار کنیم باید یه دیتابیس بسازیم درسته ؟

    الان اون دیتابیس رو چجوری ایجاد کنیم
    ——
    اگه میشه آموزش کار با ردیس در لوا رو هم بزارید

    1. با سلام
      برای کار با ردیس نیاز به ساخت دیتابیسی نیست و شما هر کلید و مقداری که لازم دارید را در آن وارد کرده و هر زمان به آن نیاز داشتید با دادن کلید، مقدار را از ردیس دریافت می کنید. با لوا هم متاسفانه کار نکرده ام.
      موفق باشید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

دکمه بازگشت به بالا