
بروزرسانی: 27 خرداد 1404
Rails Caching: یک آموزش سریع
Rails از چندین نوع ذخیره کش یا پشتیبان خارج از جعبه پشتیبانی می کند که در زیر به تفصیل توضیح داده شده است.
فروشگاه حافظه
استفاده از کش در برنامه Rails می تواند عملکرد و مقیاس پذیری آن را به طور قابل توجهی افزایش دهد، به خصوص زمانی که بهترین روش های زیر را اجرا می کنید:
- کش انتخابی: داده هایی که اغلب به آنها دسترسی پیدا می کند، گران قیمت هستند یا داده هایی که به ندرت به روزرسانی می شوند را در حافظه پنهان ذخیره کنید. برای جلوگیری از استفاده بیش از حد از حافظه، خطرات داده های قدیمی و کاهش عملکرد، از ذخیره بیش از حد خودداری کنید.
- منقضی شدن ورودی های حافظه پنهان: با انقضای ورودی های نامعتبر یا نامربوط، از داده های قدیمی جلوگیری کنید. از مهر زمانی، گزینه های انقضا، یا باطل کردن دستی استفاده کنید.
- بهینه سازی عملکرد حافظه پنهان: حافظه پنهان را متناسب با نیازهای برنامه خود انتخاب کنید و پارامترهای آن - مانند اندازه، فشرده سازی یا سریال سازی - را برای عملکرد بهینه تنظیم کنید.
- نظارت و آزمایش تأثیر حافظه پنهان: رفتار حافظه پنهان - مانند نرخ ضربه، نرخ از دست دادن و تأخیر - را ارزیابی کنید و تأثیرات مربوطه را بر عملکرد (زمان پاسخ، توان عملیاتی، استفاده از منابع) ارزیابی کنید. از ابزارهایی مانند New Relic، Rails logs، ActiveSupport notifications یا Rack mini profiler استفاده کنید.
خلاصه
همانند ذخیره سازی قطعه معمولی، ذخیره سازی عروسک روسی نیز از آن استفاده می کند cache
روش کمکی به عنوان مثال، برای ذخیره یک دسته با زیرمجموعه ها و محصولات آن در دید شما، چیزی شبیه به این بنویسید:
Rails می تواند از مهرهای زمانی برای مدیریت خودکار بیشتر وابستگی های حافظه پنهان استفاده کند. هر مدل Active Record دارای created_at
و updated_at
ویژگی هایی که نشان می دهد حافظه نهان چه زمانی رکورد را ایجاد کرده یا آخرین به روز رسانی کرده است. برای اطمینان از اینکه Rails می تواند به طور خودکار ذخیره سازی را مدیریت کند، روابط مدل های Active Record خود را به صورت زیر تعریف کنید:
<% @categories.each do |category| %>
<% cache category do %>
<h2><%= category.name %></h2>
<% category.subcategories.each do |subcategory| %>
<% cache subcategory do %>
<h3><%= subcategory.name %></h3>
<% subcategory.products.each do |product| %>
<% cache product do %>
<%= render partial: "product", locals: { product: product } %>
<% end %>
<% end %>
<% end %>
<% end %>
<% end %>
<% end %>
را fetch
متد ابتدا سعی می کند داده ها را از حافظه پنهان بخواند. اگر نتواند داده ها را پیدا کند یا داده ها منقضی شده باشند، بلوک را اجرا می کند و نتیجه را در حافظه پنهان ذخیره می کند.
فروشگاه Memcached از یک نمونه Memcached برای ذخیره سازی کش استفاده می کند. Memcached یک ذخیره سازی با مقدار کلید در حافظه است که از انواع داده ها و ویژگی های ساده پشتیبانی می کند. سریع و مقیاس پذیر است، اما مانند Redis، به سرور و پیکربندی جداگانه نیاز دارد. این فروشگاه برای برنامه هایی مناسب است که نیاز به کش کردن داده های ساده یا ثابت دارند که به طور مکرر به روز رسانی می شوند.
کش کردن عروسک روسی یک استراتژی ذخیره سازی قدرتمند در Ruby on Rails است که با قرار دادن کش ها در داخل یکدیگر، عملکرد برنامه شما را بهینه می کند. برای به حداقل رساندن کار اضافی و بهبود زمان بارگذاری، از کش کردن قطعه Rails و وابستگی های کش استفاده می کند.
همه برنامه ها، پایگاه های داده و سایت های وردپرس خود را آنلاین و زیر یک سقف دریافت کنید. پلت فرم ابری پر از ویژگی ها و عملکرد بالا ما شامل موارد زیر است:
- راه اندازی و مدیریت آسان در داشبورد MyKinsta
- پشتیبانی تخصصی 24 ساعته
- بهترین سخت افزار و شبکه Google Cloud Platform که توسط Kubernetes برای حداکثر مقیاس پذیری ارائه شده است
- یک ادغام Cloudflare در سطح سازمانی برای سرعت و امنیت
- مخاطبان جهانی با حداکثر 35 مرکز داده و 260 PoP در سراسر جهان به دست می آیند
همچنین می توانید زمان انقضا را تعیین کنید:
همچنین می توانید با انتقال گزینه ها به کلید حافظه پنهان، آن را سفارشی کنید cache
یاور. به عنوان مثال، برای گنجاندن شماره نسخه یا مهر زمانی در کلید حافظه پنهان، چیزی شبیه به این بنویسید:
Rails.cache.write("products/average_price", Product.average(:price), force: true))
فروشگاه های کش و بک اند در Ruby on Rails
برای استفاده از حافظه پنهان قطعه در Rails، از cache
روش کمکی در دیدگاه شما به عنوان مثال، کد زیر را بنویسید تا یک محصول در نمای خود پنهان شود:
در یک برنامه معمولی Rails، شما اغلب مجموعه ای از آیتم ها را ارائه می کنید که هر کدام دارای چندین مؤلفه فرزند هستند. هنگام به روزرسانی یک مورد، از رندر مجدد کل مجموعه یا هر موردی که تحت تأثیر قرار نگرفته اند، خودداری کنید. هنگامی که با ساختارهای داده سلسله مراتبی یا تودرتو سروکار دارید، از کش کردن عروسک روسی استفاده کنید، به خصوص زمانی که اجزای تودرتو داده های مرتبط خود را دارند که می توانند به طور مستقل تغییر کنند.
این مثال نشان می دهد که چگونه داده های محاسبه شده - مانند میانگین قیمت همه محصولات - را برای یک ساعت با استفاده از حافظه پنهان ذخیره کنید fetch
روش با یک کلید سفارشی (products/average_price
) و یک گزینه انقضا (expires_in: 1.hour
).
با یک آزمایش رایگان میزبانی برنامه یا میزبانی پایگاه داده ما شروع کنید. برنامه های ما را بررسی کنید یا با فروشندگان صحبت کنید تا بهترین مناسب خود را پیدا کنید.
دو نوع دیگر کش قبلاً بخشی از Ruby on Rails بودند اما اکنون به عنوان سنگهای جداگانه در دسترس هستند:
- ذخیره صفحه: کل صفحات وب را به صورت فایل های ثابت روی سرور ذخیره می کند و کل چرخه رندر صفحه را دور می زند
- ذخیره کنش: خروجی کل اقدامات کنترلر را در حافظه پنهان ذخیره می کند. این شبیه به کش صفحه است اما به شما امکان می دهد فیلترهایی مانند احراز هویت را اعمال کنید.
در این مثال:
- اگر یک رکورد محصول را به روز کنید (مثلاً با تغییر قیمت آن)،
updated_at
مهر زمانی به طور خودکار تغییر می کند. - اگر از این مهر زمانی به عنوان بخشی از کلید حافظه پنهان خود استفاده می کنید (مانند
products/1-20230504000000
، همچنین به طور خودکار قطعه ذخیره شده شما را باطل می کند. - برای باطل کردن قطعه ذخیره شده در حافظه پنهان دسته خود هنگام به روز رسانی یک رکورد محصول - شاید به این دلیل که داده های جمع آوری شده مانند قیمت متوسط \u200b\u200bرا نشان می دهد - از
touch
روش در کنترلر شما (@product.category.touch
) یا a اضافه کنیدtouch
گزینه در انجمن مدل شما (belongs_to :category touch: true
).
حافظه پنهان برای افزایش عملکرد و مقیاس پذیری برنامه های کاربردی وب ضروری است - و ذخیره سازی در Ruby on Rails از این قاعده مستثنی نیست. با ذخیره و استفاده مجدد از نتایج محاسبات گران قیمت یا پرس و جوهای پایگاه داده، کش کردن به طور قابل توجهی زمان و منابع مورد نیاز برای ارائه درخواست های کاربر را کاهش می دهد.
مثال اول ضمیمه خواهد شد v1
به کلید حافظه پنهان (به عنوان مثال، products/1-v1
). این برای باطل کردن حافظه پنهان هنگام تغییر قالب یا طرح بندی جزئی مفید است. مثال دوم یک زمان انقضا برای ورودی حافظه پنهان (1 ساعت) تعیین می کند، که به منقضی شدن داده های قدیمی کمک می کند.
نگهداری عروسک روسی در روبی روی ریل
برای بی اعتبار کردن دستی یک ورودی حافظه پنهان قبل از زمان انقضای آن، از write
روش با force
گزینه:
در اینجا نحوه پیاده سازی انواع کش در Rails مانند ذخیره قطعه و کش عروسکی روسی را بررسی می کنیم. ما همچنین به شما نشان می دهیم که چگونه وابستگی های کش را مدیریت کنید و فروشگاه های کش را انتخاب کنید و بهترین روش ها را برای استفاده مؤثر از کش در برنامه Rails بیان می کنیم.
ذخیره صفحه و عمل به ندرت استفاده می شود و دیگر برای بیشتر موارد استفاده در برنامه های Rails مدرن توصیه نمی شود.
ذخیره قطعه در Ruby on Rails
با این حال، اگر جزئیات هر زیرمجموعه یا محصول تغییر کند - مانند نام یا توضیحات آن - این قطعه ذخیره شده آن را باطل می کند، که سپس با داده های به روز شده دوباره ارائه می شود. ذخیره سازی عروسک روسی تضمین می کند که در صورت تغییر یک زیرمجموعه یا محصول، لازم نیست کل دسته را باطل کنید.
مدیریت وابستگی کش در Ruby on Rails
شما فقط باید یکی داشته باشید config.cache_store
تماس در هر فایل محیطی اگر بیش از یکی دارید، فروشگاه کش فقط از آخرین مورد استفاده می کند.
<% @products.each do |product| %>
<% cache [product, "v1"] do %>
<%= render partial: "product", locals: { product: product } %>
<% end %>
<% end %>
را cache
Helper هر سطح تودرتو را به طور جداگانه در حافظه پنهان ذخیره می کند. دفعه بعد که همان دسته درخواست شد، قطعه ذخیره شده خود را از حافظه پنهان دریافت می کند و آن را بدون رندر مجدد نمایش می دهد.
# Use memory store
config.cache_store = :memory_store
# Use disk store
config.cache_store = :file_store, "tmp/cache"
# Use Redis
config.cache_store = :redis_cache_store, { url: "redis://localhost:6379/0" }
# Use Memcached
config.cache_store = :mem_cache_store, "localhost"
وابستگی های کش روابطی بین داده های ذخیره شده و منابع زیربنایی آن هستند و مدیریت آن ها می تواند دشوار باشد. اگر داده منبع تغییر کند، هر داده ذخیره شده مرتبط باید منقضی شود.
فروشگاه حافظه از یک هش درون حافظه به عنوان حافظه پنهان استفاده می کند. سریع و ساده است اما ظرفیت و ماندگاری محدودی دارد. این حافظه پنهان برای محیط های توسعه و آزمایش یا برنامه های کوچک و ساده مناسب است.
فروشگاه دیسک
هر فروشگاه کش بسته به نیازها و ترجیحات برنامه شما مزایا و معایب منحصر به فردی دارد. یکی را انتخاب کنید که به بهترین وجه مناسب مورد استفاده و سطح تجربه شما باشد.
بهترین روش ها برای Ruby on Rails Caching
فروشگاه دیسک از فایل های روی دیسک به عنوان ذخیره سازی کش استفاده می کند. این کندترین گزینه ذخیره سازی در Rails است اما ظرفیت و ماندگاری بالایی دارد. فروشگاه دیسک برای برنامه هایی که باید حجم زیادی از داده ها را در حافظه پنهان نگه دارند و به حداکثر کارایی نیاز ندارند، مناسب است.
ردیس
حافظه پنهان Ruby on Rails عملکرد و مقیاس پذیری برنامه را با ذخیره سازی و استفاده مجدد از داده ها یا محتوایی که اغلب به آنها دسترسی دارند، افزایش می دهد. با درک عمیق تر تکنیک های کش، برای ارائه سریع تر برنامه های Rails به کاربران خود مجهزتر هستید.
هنگام استقرار برنامه Rails بهینه شده خود، می توانید به پلتفرم میزبانی برنامه Kinsta مراجعه کنید. با یک حساب Hobby Tier به صورت رایگان شروع کنید و با این مثال شروع سریع Ruby on Rails پلتفرم را کاوش کنید.