hadi mirzaie
hadi mirzaie
خواندن ۴ دقیقه·۲ سال پیش

نمایش آمار بازدید از صفحه وبسایت با php و Redis در لاراول _ مزایای آن؟

ردیس یک پایگاه داده غیر رابطه ای مبتنی بر ساختار کلید و مقدار است. یعنی شما مانند mysql با جداول سر و کار ندارید بلکه مشابه آبجکت json، یک کلید دارید که از طریق آن، به مقدار ذخیره شده اش دسترسی پیدا می کنید. این دیتابیس ۱۳ سال پیش برای سیستم عامل های یونیکس بیس ایجاد شد و از طریث WSL قابلیت نصب بر روی ویندوز را دارد.

از ردیس می توان جهت ذخیره داده های موقتی و کچ ها نیز استفاده کرد. یکی دیگر از موارد استفاده از آن، شمارش تعداد بارهایی است که کاربر به صفحه سر زده.

شاید از خودتان بپرسید چرا این داده ها را در mysql ذخیره نکنم؟ پاسخ واضح است، ردیس سریع تر است. در ادامه نحوه کار با ردیس و قیاس پاسخگویی ردیس و mysql را نشان تان خواهم داد.

برای استفاده از ردیس در لاراول کافیست این دستور را در ترمینال یا CMD وارد کنید:

composer require predis/predis

با رجوع به داکیومنت لاراول، می توانید تنظیمات مورد نیاز ردیس را مشاهده کنید. در فایل env. پورت ردیس را برابر با ۶۳۷۹ قرار دهید و هاست شما برابر با ۱۲۷.۰.۰.۱ است و اگر ردیس شما در داکر اجرا می شود هاست را برابر با نام کانتینر ردیس خود قرار دهید.

پس از آن در controller خودتان، شی redis را وارد کنید تا بتوانید از آن جهت ارتباط با ردیس استفاده کنید:

use Illuminate\Support\Facades\Redis;

حالا کدهای زیر را وارد کنید:

if(Auth::check()){ $username = Auth::user()->name; $redis = Redis::connection(); $redis->incr($username . &quot_visits&quot); dump($redis->get($username . &quot_visits&quot)); }

خب در خط اول ابتدا چک میکنیم ببینیم کاربر مورد نظر ما وارد وبسایت شده یا خیر؟

if(Auth::check()){ // some codes here }

در خط دوم چک می کنیم ببینیم نام کاربری کاربر وارد شده چیست. آن را در متغییری به نام username ذخیره میکنیم.

$username = Auth::user()->name;

خط بعدی عنصر اصلی ردیس است. سعی میکنیم به کلاس Redis متصل شویم و به اصطلاح یک instance از آن را دریافت کنیم:

$redis = Redis::connection();

اما قسمت مهم تر ماجرا این قطعه کد است که مقدار عددی increment را در ردیس ایجاد میکند. اگر با ردیس آشنا باشید می دانید که ردیس مقادیری چون استرینگ، هش و غیره را برای ذخیره پشتیبانی می کند. این عدد به صورت خودکار توسط ردیس، افزایش می یابد و نیازی به دستکاری شما نیست.

$redis->incr($username . &quot_visits&quot);

اما در دورن پرانتز ما آمدیم برای تعداد بازدیدهایمان یک نام برای کلید تعیین کردیم که از دو بخش تشکیل شده، یکی نام کاربر جهت تشخیص تعداد بازدیدهای کاربرمان و دیگری واژه visits بود. این نام می تواند به دلخواه توسط شما تعیین شود.

در آخر هم مقادیر ذخیره شده در کلید بازدیدها را چاپ کردیم:

dump($redis->get($username . &quot_visits&quot));

اما نگاهی داشته باشیم به پروسه انجام این کار و مدت زمان پاسخگویی سرور ردیس به ما و قیاس آن با mysql.

کافیست به اول و آخر این کدها ، چند خط کد اضافه کنید جهت سنجش مدت زمان پاسخگویی:

$time_start = microtime(true); $username = Auth::user()->name; $redis = Redis::connection(); $redis->incr($username . &quot_visits&quot); dump($redis->get($username . &quot_visits&quot)); $time_end = microtime(true); $execution_time = ($time_end - $time_start); dump($execution_time);

این قطعه کدهای اضافه شده، مدت زمان پاسخگویی ردیس و انجام عملیات را می سنجند.

در طی این سنجش، عموما مدت زمان پاسخگویی، چیزی بین ۰.۰۰۲ ثانیه تا ۰.۰۰۴ ثانیه بود:

همین عملیات را زمانی که با mysql انجام میدهید متوجه می شوید بسیار بیشتر است:

$time_start = microtime(true); $username = Auth::user()->name; $table = User::where(&quotname&quot,$username)->first(); $db = User::all(); if($db->where(&quotname&quot,$username)){ foreach ($db as $user) { $table->visits = $user->visits + 1; $table->save(); echo($user->visits); } } $time_end = microtime(true); $execution_time = ($time_end - $time_start); dump($execution_time);

در این حالت مدت زمان انجام عملیات چیزی بین ۰.۲ ثانیه تا ۰.۴ ثانیه است که تفاوت زمانی بسیار فاحشی است:

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


redisپایگاه دادهبرنامه نویسیphpدیتابیس
مسترربیت هستم برنامه نویس، طراح سایت، علاقه مند به بلاک چین ... میخونم و گاهی مینویسم و شاید سخت ترین کار دنیا رو هم گاهی انجام بدم ... می اندیشم !!!!
شاید از این پست‌ها خوشتان بیاید