طراحی یه سیستم کوتاه کننده لینک ساده [قسمت سوم: کش]

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

ابزاری که برای cache کردن اطلاعات استفاده می‌کنیم Redis هست، اما چرا؟ استفاده ازش خیلی سادست، کامینیتی بزرگی داره، کاملا نیاز های ما رو برطرف می‌کنه.

من در نظر دارم همه‌ی لینک های کوتاه شده، بدون زمان انقضاء کش بشه. اینجاست که قضیه احتمالا خیلی عجیبه چون معمولا کلید های ردیس رو با یه زمانی درنظر می‌گیرن که لایو بودن دیتا از دست نره.
ولی منم قصد ندارم لایو بودن دیتا رو از دست بدیم!

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

احتمالا الان یه سوال براتون پیش میاد: ردیس اطلاعات رو توی رم می‌نویسه و رم فضای ذخیره سازی محدودی داره و اینکه بخوایم همه‌ی لینک ها رو داخلش ذخیره کنیم باعث میشه خیلی زود رممون پر بشه، پس چرا داریم همچین کاری می‌کنیم؟

نکته اینجاست که ردیس یه تنظیمی داره که می‌تونیم مشخص بکنیم حداکثر چقد مموری استفاده بکنه و با کلید هایی که بعد از اون میزان قراره ساخته بشن چطوری رفتار بکنه. (maxmemory & maxmemory-policy)

که با ست کردن maxmemory-policy به allkeys-lfu می‌تونیم بگیم زمانی که مموری بیشتری برای استفاده نداشتی برو اون کلید هایی که کمتر استفاده شدن رو پاکشون کن و این کلید جدیده رو اضافه کن :)

توی این صفحه این تنظیمات ردیس دقیق توضیح داده شده.

اما یه حالتی هست که باعث میشه از این هم سریع‌تر باشه! اونم زمانی که از سمت کلاینت کش بشه و اصلا ریکوئست به سرور ما نرسه :)))

برای رسیدن به این حالت جذاب میشه از هدر Cache-Control استفاده کرد.

البته اینطوری نیست که توی همون ریکوئست اول از مرورگر بتونه جوابش رو بگیره طبیعتا!
بلکه توی ریکوئست اول هدر ارسال میشه و باعث میشه مرورگر کشش بکنه و توی درخواست های بعدی در صورتی که از max-age مشخص شده نگذشته باشه از اون بخونه.

ایده این جنس کش کردن رو از bitly گرفتم (نمونه ریکوئستش رو می‌تونید توی تصویر پایین ببینید)


لطفا به کامنت های این پست اهمیت بدید چون ممکنه دوستان اشتباهات من رو اصلاح کرده باشن و نظرات متفاوتی رو ببینیم.
محمد محمدعلیان | 5 اردیبهشت 1401
کانال تلگرامم | لینکدینم