کش memoized لاراول حالا با tag کار میکنه
خلاصهٔ کاملتر
کش memoized لاراول، یعنی Cache::memo()، یه کلید رو فقط یه بار از کش استور میخونه و بعد تا آخر همون ریکوئست یا job، همون مقدار رو از حافظه سرو میکنه. خبر تازه اینه که از لاراول 13.33 این کش با cache tag هم کار میکنه، پس میتونی مقدارهای tagدار رو هم memoize کنی.
تو مقاله اومده که این کار کجا به درد میخوره: وقتی یه مقدار tagدار تو یه ریکوئست چندین بار خونده میشه. مثلاً لوکاپ دسترسیها ممکنه برای هر can() و هر دایرکتیو @can تو ویو اجرا بشه، و بدون memoize هر بارش یه رفتوبرگشت به کش استور میخوره. کافیه tags() رو روی کش memoized صدا بزنی و بعدش مثل هر کش tagدار دیگهای ازش استفاده کنی:
return Cache::memo()
->tags(['permissions', "user:{$user->id}"])
->remember(
"permissions:{$user->id}",
now()->addHour(),
fn () => $this->loadPermissionsFromDatabase($user)
);اولین صدا زدن تو هر ریکوئست از کش استور میخونه، یا اگه کلید نبود کلوژر رو اجرا میکنه. صدا زدنهای بعدی با همون tag و همون کلید، مقدار رو از حافظه برمیگردونن. قبل از این تغییر، راهحل موقت این بود که خودت کش tagدار رو داخل یه استور از نوع array بپیچی، که کد درازتر و شلوغتری میشد.
متدهایی که مقدار رو عوض میکنن، هم روی کش tagدار مینویسن و هم نسخهی memoizeشدهی اون کلید رو دور میندازن، پس خوندن بعدی برمیگرده به خود استور. این رفتار برای put()، putMany()، add()، increment()، decrement()، forever()، touch() و forget() برقراره. صدا زدن flush() روی کش tagدار memoized هم tagها رو تو استور flush میکنه و مقدارهای memoizeشده رو پاک میکنه.
یه محدودیت مهم هم هست: کش memoized فقط چیزی رو نگه میداره که همین ریکوئست قبلاً خونده. اگه یه queue worker یا یه ریکوئست دیگه مقدار رو عوض کنه، این ریکوئست تغییر رو نمیبینه. نویسنده پیشنهاد میکنه برای مقدارهایی استفاده بشه که وسط یه ریکوئست عوض نمیشن، مثل دسترسیها و تنظیمات، و شمارندهها یا هر چیزی که پروسهی دیگه وسط کار آپدیتش میکنه روی کش معمولی بمونه. مقدارهای memoizeشده اول هر ریکوئست یا job ریست میشن، پس workerهای بلندمدت دادهی کهنه رو بین jobها نگه نمیدارن.
نکات کلیدی:
- پشتیبانی کش memoized از tag از لاراول 13.33 اضافه شده و با Cache::memo()->tags() استفاده میشه
- اولین خوندن به کش استور میزنه و بقیهی خوندنهای همون ریکوئست از حافظه جواب میگیرن
- نوشتن با put()، add()، increment()، forget() و بقیهی متدهای تغییردهنده، نسخهی memoizeشدهی اون کلید رو دور میندازه
- راهحل قبلی پیچیدن کش tagدار داخل استور array بود
- مقدارهای memoizeشده اول هر ریکوئست یا job ریست میشن، پس worker بلندمدت دادهی کهنه نگه نمیداره




