Memcached چیست و چرا باید از آن استفاده کنیم؟
#1
به نام خدا؛ 
سلام دوستان امیدوارم حالتون خوب باشه...
تصور کنین پروژه نسبتاً بزرگی دارین که در اون در هر ساعت هزاران درخواست (Request) برای دریافت یا ارسال اطلاعات به دیتابیس ارسال میشه. حالا این سوال پیش میاد که آیا با وجود این حجم از درخواست ها دیتابیس ما میتونه بدون مشکل به کارش ادامه بده و ما میتونیم به نحو شایسته ای به کاربرمون خدمات ارائه کنیم؟ آیا باید با در نظر گرفتن حجم بالای درخواست ها به دیتابیس از انجام درخواست های جدید خودداری کنیم و در کمال احترام از کاربر عذرخواهی کنیم که فعلاً نمیتونیم به درخواست شما پاسخ بدیم؟
با این مقدمه قصد دارم توجه شما رو بر روی امکانی به نام Memcached (مم کشد) معطوف کنم. امکانی که بسیاری از سایت های مشهور دنیا مثل فیسبوک، ویکی پدیا، یوتیوب و ... از اون بهره می برن. قبل از اینکه راجع به مم کشد صحبت کنم باید با حافظه کش (Cache Memory) آشنا باشیم گرچه که میدونم با این اصطلاح آشنا هستین. به طور خیلی خلاصه و مفید در واقع حافظه کش برای این به کار میره که با یک بار بارگیری (دانلود) اطلاعات توسط کاربر نیازی به بارگیری مجدد اطلاعات با هر بار مراجعه کاربر وجود نداشته باشه و فایلهای بارگیری شده در یک مسیر خاص ذخیره بشن و در صورت نیاز برای اجرای اونها فراخوانی بشن. این مسئله میتونه عملکرد برنامه رو بهبود ببخشه و منابع رو صرف کار بیهوده نکنه.
حالا ما میتونیم در برخورد با دریافت یا ارسال اطلاعات به دیتابیس هم چنین مکانیزمی رو پیاده کنیم. گاهی اوقات لازمه اطلاعاتی که در پروژه ما از دیتابیس دریافت میشن برای یک بازه زمانی (مثلاً چند دقیقه یا حتی چند ساعت) بروزرسانی نشن. البته که میشه گفت بیشتر دیتاها در بازی باید هر لحظه بروزرسانی بشن ولی باز هم ممکنه دیتاهایی باشن که نیاز نباشه تا یک بازه زمانی مشخص بروزرسانی بشن. اینجاست که مم کشد به کمک ما میاد. چون بسیاری از شما دوستان زبان اصلی سمت سرورتون PHP هست بنابراین من یک قطعه کد PHP استفاده از مم کشد رو براتون قرار میدم. البته دقت کنین مم کشد معمولاً به طور پیشفرض نصب نیست و باید به کمک SSH و اعمال یکسری دستورات ساده این امکان رو به نحوی نصب یا فعال کنین.
کد php:
<?php 
// تعریف آی پی سرورهای مم کشد در قالب یک آرایه
$MEMCACHE_SERVERS = array(
    
"10.1.1.1"//web1
    
"10.1.1.2"//web2
    
"10.1.1.3"//web3
);
// ایجاد مم کشد جدید
$memcache = new Memcache();
foreach(
$MEMCACHE_SERVERS as $server){
    
$memcache->addServer $server );
}

// اگر از قبل دیتایی با کلید huge_data_for_front_page وجود داشت که از حافظه کش فراخوانی شود در غیر اینصورت به دیتابیس کوئری ارسال شود
$huge_data_for_front_page $memcache->get("huge_data_for_front_page");
if(
$huge_data_for_front_page === false){
    
$huge_data_for_front_page = array();
    
$sql "SELECT * FROM hugetable WHERE timestamp > lastweek ORDER BY timestamp ASC LIMIT 50000";
    
$res mysql_query($sql$mysql_connection);
    while(
$rec mysql_fetch_assoc($res)){
        
$huge_data_for_frong_page[] = $rec;
    }
    
// تنظیم برای ده دقیقه یا همان ششصد ثانیه
    
$memcache->set("huge_data_for_front_page"$huge_data_for_front_page0600);
}

?>
در ابتدا آی پی های مم کشد رو در قالب یک آرایه تعریف کردیم. دقت کنین که رنج آی پی های مم کشد در مرحله راه اندازی عموماً بین 10.0.0.0 تا 10.0.0.4 هست. در مرحله بعدی یک مم کشد جدید ایجاد کردیم. بعد بررسی کردیم که اگر دیتایی با کلید huge_data_for_front_page وجود داشت آنرا از حافظه کش دریافت می کنیم. پس وجود داشتن این کلید یعنی اینکه ما قبلاً این اطلاعات را دریافت کردیم و در کش ذخیره شدن. اما اگر این کلید وجود نداشت یعنی اطلاعات تازه ای باید دریافت بشن پس یک کوئری به دیتابیس تنظیم می کنیم. حالا این کوئری جدید رو بعد از اینکه انجام شد اطلاعاتش رو در حافظه کش به مدت 10 دقیقه (ششصد ثانیه) ذخیره کردیم. میتونین این زمان رو بر حسب ثانیه به هر مقدار دلخواه دیگه تغییر بدیم.
پس فهمیدیم که برای فراخوانی اطلاعاتی که مم کشد ذخیره کرده برای هر کدوم یک کلید تعریف می کنیم و وجود داشتن کلید و همچنین ساختن یک کلید جدید رو با هم بررسی کردیم. 
امنیت مم کشد:
با مزایایی که مم کشد ایجاد میکنه آیا استفاده از این تکنیک ایمن هست؟ پاسخ این پرسش مهم رو با هم در این قسمت بررسی می کنیم. 
متأسفانه هر شخصی با دانستن آدرس آی پی سرور و پورتی که مم کشد بر روی اون داره اجرا میشه میتونه به اطلاعات دیتابیس دسترسی پیدا کنه. بنابراین برای جلوگیری از وقوع این اتفاق باید با استفاده از فایروال دسترسی رو خارج از شبکه قطع کرد. تغییر دادن پورت پیشفرض مم کشد از 11211 در حین نصب به یک پورت ناشناس دیگه هم میتونه مفید باشه. 
نکات تکمیلی:
استفاده نامناسب و نابجا از این امکان میتونه حافظه رم سرور رو به شدت اشغال کنه. پس حتماً برای استفاده از مم کشد باید مطمئن بشین که سرورتون حافظه رم مناسبی داره و میتونه از پس اطلاعاتی که توسط مم کشد ذخیره میشن بر بیاد. 
در این مطلب راجع به مقوله نصب و به نوعی راه اندازی مم کشد صحبتی به میان نیاوردیم چرا که دستورات نصب مم کشد از طریق SSH به راحتی در اینترنت قابل دسترس هستن و هدف بنده از این تاپیک یک آشنایی اجمالی و البته کاربردی با مم کشد بود.
امیدوارم این مطلب براتون مفید واقع شده باشه.
با آرزوی بهترین ها...
غایب
  پاسخ


 سپاس شده توسط: mostafanastary ، oak ، M.gh ، mhp ، amin hosseini ، ᔕinaᗪehghani
#2
عالی عالی
میشه یه آموزش از کار با Php ساده برای ارسال دخواست های ساده به سرور و آپلود فایل Php در سرور و دیتابیس MySql نیز بزارید ؟؟
ممنون میشم از شما ...
[تصویر:  default-yellow.svg]
غایب
  پاسخ


 سپاس شده توسط:
#3
آقای جبرءیلی برای این کار ها من میتونم کمکت کنم پیام خصوصی بده.
هر کمکی خواستی بگو 1
  پاسخ


 سپاس شده توسط: oak
#4
(1399/1/18، 07:01 عصر)oak نوشته است:  
سلام به شما دوست عزیز؛
این آموزش ها رو بنده به صورت پراکنده قرار دادم و حتی طریقه استفاده از PDO که روش مناسب تری برای ارتباط با دیتابیس مای اس کیو ال هست نسبت به توابع پیشفرض PHP رو هم شرح دادم.
آموزش آپلود فایل و فشرده سازی فایلها رو هم قرار دادم. 
میتونین سرچ کنین تا ببینین.
اگر هم بخواین میتونم لینک آموزش ها رو براتون قرار بدم توی همین پست تا راحت تر در دسترستون باشه.

 
غایب
  پاسخ


 سپاس شده توسط: [email protected]
#5
(1399/1/18، 07:08 عصر)""M.gh نوشته است: آقای جبرءیلی برای این کار ها من میتونم کمکت کنم پیام خصوصی بده.
هر کمکی خواستی بگو 1

 

ترجیح میدم یاد بگیرم
ولی ممنونم
[تصویر:  default-yellow.svg]
غایب
  پاسخ


 سپاس شده توسط: M.gh


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
  آموزش پروژه محور ساخت بازی مار و پله mohsen_nasri 6 3,807 1403/10/24، 09:38 عصر
آخرین ارسال: Tggi
Star مهم آموزش خروجی اندروید روی سیستم شخصی rezamms 128 86,462 1403/10/23، 04:58 عصر
آخرین ارسال: Tggi
  مهم آموزش تصویری خروجی مستقیم - یکبار برای همیشه! rezamms 33 20,911 1401/2/13، 09:39 عصر
آخرین ارسال: kamran_cn
  خروجی اندرید davinmstr1 2 2,601 1400/8/4، 10:23 عصر
آخرین ارسال: ᔕinaᗪehghani
  AAB (بسته برنامه اندروید) چيست؟ + نحوه خروجي گرفتن در كرودوا ᔕinaᗪehghani 15 8,600 1400/6/21، 01:55 صبح
آخرین ارسال: mehdi1100

پرش به انجمن: