۱۳۹۹/۰۴/۱۹

کش کامپوننت در فریم ورک سیموفنی

Cache Component در سیموفنی ۱۳۹۸/۰۸/۰۷

کش اطلاعات یکی از مواردی است که باعث میشود سرعت نرم افزار یا وب سایت بصورت قابل توجهی افزایش پیدا کند.بطور کلی عملکرد کش اطلاعات به این صورت است که ابتدا برنامه کش را بررسی میکند اگر اطلاعات در کش وجود داشت اطلاعات از کش خوانده و مورد استفاده قرار میگیرد.اما اگر اطلاعات در کش وجود نداشت برنامه درخواست را به پایگاه داده ها یا api یا هر منبعی که طراحی شده می فرستند.و اطلاعات را برمیگرداند و در پایان اطلاعات جدید را در کش ذخیره میکند.

در این پست از مجموعه مقالات آموزشی سیموفنی در مورد مفاهیم اولیه کش در سیموفونی توضیح داده میشود,  در ادامه در مورد کامپوننت کش در سیمفونی صحبت میکنیم .

برای استفاده از از این کامپوننت از دستور زیر استفاده میکنیم

 composer require symfony/cache

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

PSR-6 Caching:

سیستم کش عمومی در سیموفنی است که شامل کش pools و کش items میباشد.

Cache Contracts:

یک روش ساده و در عین حال قدرتمند برای ذخیره کردن مقادیر برگشتی است .

فریم ورک سیموفنی استفاده از روش Cache Contracts را توصیه میکند.با استفاده از این روش نیاز به کد زنی کمتری دارید و بطور پیش فرض خیلی از نیازها برای کش اطلاعات در نظر گرفته شده است.

Cache Contracts

تمام آداپتورها از Cache Contracts پشتیبانی میکنند.و تنها دو متد دارد ()get و ()delete و متد ()set در این کامپوننت وجود ندارد زیرا متد ()get هر دو کار ذخیره و دریافت مقادیر را انجام میدهد.

در ابتدا  یک نمونه از cache adapter ایجاد کنید.در مثال زیر FilesystemAdapter  استفاده شده است .

use Symfony\Component\Cache\Adapter\FilesystemAdapter;

$cache = new FilesystemAdapter();

حالا شما با استفاده از این object میتوانید داده های ذخیره شده را بازیابی و یا حذف کنید.اولین آرگومان متد ()get یک کلید است .این کلید یک نام انتخابی است که داده های شما را به اطلاعات کش شده مرتبط میکنید و با استفاده از این کلید میتوانید اطلاعات را بازیابی و یا حذف کنید.دومین آرگومان یک مقدار برگشتی php است و زمانی فراخوانی مشود که کش حذف یا expireشده باشد.

use Symfony\Contracts\Cache\ItemInterface;

// The callable will only be executed on a cache miss.
$value = $cache->get('my_cache_key', function (ItemInterface $item) {
    $item->expiresAfter(3600);
    // ... do some HTTP request or heavy computations
    $computedValue = 'foobar';
    return $computedValue;
});
echo $value; // 'foobar'
// ... and to remove the cache key
$cache->delete('my_cache_key');

Cache Contracts با توجه به متولاژی (نوعی سیستم کش اطلاعات است و هنگامی استفاده میشود که سیستم های محاسباتی بصورت موازی با مکانیزم کش اطلاعات تحت فشار بسیار بالایی قرار بگیرند.)Cache stampede پیاده سازی شده است .بطور مثال اگر در یک برنامه 5 ثانیه برای محاسبه داده های که برای مدت زمان  1 ساعت کش شده  زمان صرف شود و این اطلاعات هر ثانیه 10 بار از کش بازخوانی شود.به این معنی است که نرم افزار شما کش اطلاعات را به خوبی پیاده سازی کرده است.

اما زمانیکه بعد از گذشت یک ساعت 10 درخواست جدید از کش داشته باشید و داده دوباره محاسبه شود.و در ساعت دوم هم همین اتفاق بیفتد.در نتیجه 50 بار قبل از کش اطلاعات محاسبه صورت میگیرد اینجاست که شما باید سیستم کش اطلاعات را بازنویسی کنید.

cache in symfony

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

راه دوم که کاربردی تر است به این صورت است که تاریخ انقضا کش بررسی شود و در وصورت اکسپایر شدن کش ابتدا کش نمایش داده شود و نسبت به زمان تعیین شده کش در بک سیستم پردازش را انجام دهد و اطلاعات جدید را کش کند و بعد از کش اطلاعات جدید اطلاعات قبلی کش شده از حافظه پاک شود.در این روش الگوریتمی پیاده سازی میکند که تاریخ انقضا کش را نزدیک به پایان محسابه میکند برای پیاده سازی این روش میتوانید از پارمتر سوم ()get که یک مقدار اعشاری دریافت می کند استفاده کنید.

use Symfony\Contracts\Cache\ItemInterface;

$beta = 1.0;
$value = $cache->get('my_cache_key', function (ItemInterface $item) {
    $item->expiresAfter(3600);
    $item->tag(['tag_0', 'tag_1']);

    return '...';
}, $beta);

در مثال بالا در صورتی که کش اکسپایر شده باشد ابتدا مقدار کش فرخوانی و استفاده میشود.و بعد از ان با توجه به مقدار beta$ پردازش اطلاعات انجام میشود و اطلاعات دوباره کش میشود و اطلاعات قبلی کش شده پاک میشود.


رای :

سیموفنی

کش در سیموفنی

Symfony

Cache Contracts

ارسال نظر
Copyright © All right reserved.