درخواست های برنامه های خود را با ذخیره سازی شارژ کنید

آیا تا به حال فکر کرده اید که چگونه برخی از وب سایت ها تقریباً اطلاعات را بارگیری می کنند فورا، حتی زمانی که با حجم عظیمی از داده ها سروکار دارید؟ راز اغلب در تکنیکی به نام نهفته است ذخیره سازی. در این پست، ما کشف خواهیم کرد که کش چیست، چرا مهم است، و چگونه آن را برای افزایش قابلیت لیدربرد برنامه خود اجرا کردم.
Caching چیست؟ قیاس کتابخانه ای
کتابخانه وسیعی را تصور کنید که در آن یک کتابدار باید میلیونها کتاب را برای درخواست هر مراجعه کننده جستجو کند. اکنون بیلبورد کوچکی را در ورودی تصویر کنید که پاسخ سوالات رایج را نشان می دهد. به جای جستجوی کل کتابخانه هر بار، کتابدار می تواند به سرعت به بیلبورد برای پرس و جوهای مکرر مراجعه کند.
در این قیاس:
-
کتابخانه وسیع پایگاه داده شما را نشان می دهد که پر از اطلاعات است اما جستجو در آن کند است.
-
شما، کتابدار، درخواست های پردازش سرور را نمایندگی می کنید.
-
کاربران کاربرانی هستند که اطلاعات را درخواست می کنند.
-
بیلبورد نشان دهنده حافظه پنهان است – یک فضای ذخیره سازی کوچک و سریع برای اطلاعاتی که اغلب در دسترس هستند.
ذخیره سازی مانند آن بیلبورد است. این مقدار محدودی از دادههای اغلب قابل دسترسی را در مکانی ذخیره میکند که بتوان آنها را خیلی سریع بازیابی کرد و در زمان صرفهجویی کرده و بار سیستم ذخیرهسازی داده اصلی شما را کاهش میدهد.
چرا Caching را پیاده سازی کنیم؟
در برنامهام، یک ویژگی لیدربرد داشتم که به خوبی کار میکرد، اما ناکارآمد بود. این پایگاه داده را پرس و جو کرد و رتبه بندی را برای هر درخواست، حتی زمانی که داده ها تغییر نکرده بودند، دوباره محاسبه کرد. این مانند این بود که کتابدار ما بارها و بارها کل کتابخانه را برای اطلاعات مشابه جستجو می کرد.
متوجه شدم که برای جلوگیری از این جستجوهای تکراری و وقت گیر به راهی نیاز دارم. کش را وارد کنید!
راه اندازی Redis: سیستم ذخیره سازی ما
برای سیستم کش خود، استفاده از چیزی به نام Redis را انتخاب کردم. Redis چیزی است که ما آن را “ذخیره ساختار داده در حافظه” می نامیم. این یک لقمه است، پس بیایید آن را تجزیه کنیم:
-
“در حافظه” به این معنی است که اطلاعات را در حافظه رم کامپیوتر نگه می دارد که دسترسی به آن بسیار سریع است.
-
اکسل در بازیابی سریع داده ها، ایده آل برای ذخیره سازی
-
حافظه محدود است، اما فقط نیاز به ذخیره داده هایی دارد که اغلب به آنها دسترسی دارید
در اینجا کدی برای مقداردهی اولیه redis-client شما در سرور پایتون آمده است:
redis_client = Redis(
host="my-redis-server.com",
port=6379,
password='secret-password'
)
ایجاد برچسب های ما (کلیدهای حافظه پنهان)
کلیدهای کش را به عنوان برچسب یا آدرس برای داده های ذخیره شده خود در نظر بگیرید. آنها به شما کمک میکنند تا به سرعت بخشهای خاصی از اطلاعات را در حافظه پنهان خود پیدا کرده و به آن دسترسی پیدا کنید، دقیقاً مانند اینکه چگونه سیستم فهرستنویسی کتابخانه به شما کمک میکند کتابها را پیدا کنید.
در سیستم تابلوی امتیازات خود، این کلیدها را به صورت زیر ایجاد می کنم:
if user_scope == 'Friends':
cache_key = f"leaderboard:user:{user_id}:{attribute}:{duration}:{user_scope}:{page}"
else:
cache_key = f"leaderboard:{attribute}:{duration}:{user_scope}:{page}"
اگر این یک زبان خارجی به نظر می رسد نگران نباشید – بیایید آن را تجزیه کنیم!
به این کلیدها مانند برچسب های روی پوشه ها در یک کابینت بایگانی فکر کنید. هر قسمت از کلید اطلاعات خاصی را نشان می دهد:
بیایید به هر قسمت نگاه کنیم:
-
تابلوی امتیازات: این همیشه اول است. مثل این است که بگویید “این برای سیستم تابلوی امتیازات است.”
-
user:{user_id}: این فقط برای تابلوهای امتیازات دوستان ظاهر می شود. مانند داشتن یک پوشه شخصی برای لیست دوستان هر کاربر است.
-
{ویژگی}: این می تواند “words_learned” یا “daily_streak” باشد – هر چه که رتبه بندی می کنیم.
-
{duration}: این یا “تمام زمان” یا “امروز” است و دوره زمانی رتبهبندی را به ما میگوید.
-
{user_scope}: این یا “Friends” یا “Global” است، که نشان میدهد این تابلوی امتیازات دوستان است یا برای همه کاربران.
-
{page}: این شماره صفحه تابلوی امتیازات است، زیرا نتایج را به صورت تکهای نشان میدهیم.
بنابراین، یک کلید کش کامل ممکن است به شکل زیر باشد:
leaderboard:user:12345:words_learned:AllTime:Friends:1
این به دستیار ما میگوید: “پیدا کردن تابلوی امتیازات برای دوستان کاربر 12345، رتبهبندی بر اساس کلمات آموخته شده، برای همیشه، صفحه 1.”
اما صبر کن در مورد تغییرات چطور؟
ممکن است فکر کنید، “یک لحظه صبر کنید. اگر یک کاربر امتیاز یا موقعیت خود را در تابلوی امتیازات افزایش دهد چه می شود؟ آیا اطلاعات موجود در حافظه پنهان ما قدیمی نمی شود؟”
این یک سوال عالی است! کاملاً درست می گویید – ما به راهی نیاز داریم تا مطمئن شویم داده های تابلوی امتیازات ذخیره شده ما تازه و دقیق باقی می مانند. بیایید به نحوه برخورد با این موضوع بپردازیم.
سیستم تازه سازی تابلوی امتیازات ما
در اینجا نحوه تازه نگه داشتن حافظه پنهان تابلوی امتیازات آمده است:
-
تشخیص تغییرات: هر زمان که یک کاربر کاری انجام می دهد که می تواند بر رتبه او تأثیر بگذارد (مانند یادگیری کلمات جدید یا گسترش خط آنها)، سیستم ما آن را یادداشت می کند.
-
به روز رسانی تابلوهای امتیازات خاص: به جای تازه کردن همه تابلوهای امتیازات (که مانند عکس گرفتن مجدد از هر تابلوی رتبه بندی در باشگاه است)، فقط مواردی را به روز می کنیم که این تغییر می تواند بر آنها تأثیر بگذارد.
برای مثال، اگر آلیس یک کلمه جدید یاد بگیرد:
- ما تابلوی امتیازات “Words Learned” را به روز می کنیم
- ما هر دو تابلوی امتیازات مدت زمان “همه زمان” و “امروز” را به روز می کنیم
- ما تابلوی امتیازات دوستان آلیس و تابلوی امتیازات جهانی را به روز می کنیم
- بی اعتباری هوشمند: ما بلافاصله کل تابلوی امتیازات را مجدداً محاسبه نمی کنیم. در عوض، آن حافظههای پنهان تابلوی امتیازات خاص را بهعنوان «بیات» علامتگذاری میکنیم.
در اینجا یک نسخه ساده از آنچه در عمل به نظر می رسد آمده است:
def update_user_score(user_id, attribute):
# Update the user's score in the database
update_database_score(user_id, attribute)
# Mark relevant leaderboard caches as stale
invalidate_leaderboard_cache(user_id, attribute)
def invalidate_leaderboard_cache(user_id, attribute):
# List of cache keys to invalidate
keys_to_invalidate = [
f"leaderboard:{attribute}:AllTime:Global",
f"leaderboard:{attribute}:Today:Global",
f"leaderboard:user:{user_id}:{attribute}:AllTime:Friends",
f"leaderboard:user:{user_id}:{attribute}:Today:Friends"
]
# Mark these keys as stale in Redis
for key in keys_to_invalidate:
redis_client.set(f"{key}:stale", "true")
این سیستم کارایی، اطلاعات بهروز و مزایای ذخیرهسازی مداوم را برای تابلوهای امتیازی بیتأثیر تضمین میکند.
بحث بس است، بیایید آن را در عمل ببینیم!
ویدیوی اول صفحه لیدربورد را قبل از اجرای حافظه پنهان نشان می دهد، ویدیوی دوم مربوط به ذخیره سازی است.
شما می توانید ببینید که پاسخ سرور با اجرای کش چقدر سریعتر است!
با پیادهسازی حافظه پنهان در برنامههای کاربردی خود، میتوانید عملکرد مشابهی را افزایش دهید و تجربهای روانتر و سریعتر برای کاربران خود فراهم کنید. به یاد داشته باشید، نکته کلیدی این است که به صورت هوشمند حافظه پنهان ذخیره کنید – داده هایی را که اغلب به آنها دسترسی دارید ذخیره کنید، آنها را تازه نگه دارید و از مزایای بازیابی سریع داده ها لذت ببرید!