簡體   English   中英

Rails中的自動模型緩存過期

[英]Automatic model cache expiry in Rails

我正在閱讀一些有關在Rails中進行緩存的指南,但是我錯過了一些我無法調和的重要內容。

我了解自動過期緩存鍵的概念,以及如何根據模型的updated_at屬性的派生方式構建緩存鍵,但是我無法弄清楚在沒有先進行數據庫查找的情況下它如何知道updated_at是什么(這正是緩存的部分設計目的是避免)?

例如:

cache @post

將結果存儲在緩存鍵中,如下所示:

文章/ 2-20110501232725

據我了解Rails中的自動過期緩存鍵,如果@post被更新(並且updated_at屬性被更改,則該鍵將改變。但是我不知道的是,隨后對@post的查找如何知道如何獲取密鑰而不進行數據庫查詢即可獲取新的updated_at值?Rails不必知道@ post.updated_at是什么,才可以訪問緩存的版本嗎?

換句話說,如果鍵包含updated_at時間戳,那么如何在不首先知道高速緩存是什么的情況下查找高速緩存?

在您的示例中,您不可避免地要訪問數據庫。 但是,這種緩存的目的是避免執行額外的工作,這些工作僅在每次發布更改時才需要執行。 從數據庫中查找單個行應該非常快,然后根據該查找的結果,您可以避免執行比該單個查找更昂貴的額外工作。

您尚未完全指定,但我懷疑您是在視圖中執行此操作。 在這種情況下,目標是避免在帖子發布之前不會改變的片段構建。 與崗位和標記來呈現這些屬性可以是昂貴的,這取決於工作的排放相關的各種屬性的迭代中完成的,所以給你有一個職位已經 ,能夠避免工作在這種情況下獲得的增益。

據我了解您的問題。 您正在嘗試弄清緩存如何工作的黑魔法。 祝好運。

但是我認為潛在的問題是更新如何發生?

緩存元素應具有基於元素某些部分的邏輯鍵,例如復合鍵,以及基於項ID的某些鍵名。 您可以構建此密鑰以在需要時調用緩存片段。 密鑰始終是相同的,否則您將無法確定自己正在獲得所需的東西。

緩存的一個基本假設是,緩存值是瞬態的,即,如果緩存值消失或過時,則沒什么大不了的。 如果這很重要,那么緩存不是解決問題的方法。 緩存的目的是減輕高負載,即,大量流量擊中數據庫中的同一事物。 類似於一個可能有1百萬人正在閱讀特定博客帖子的網絡日志。 它並不是要加快數據庫的速度。 這是通過SQL優化,分片等完成的。

如果使用Dalli作為緩存存儲,則可以設置到期時間。

本質上,Rails AFAIK中的緩存循環是這樣的:

在此處輸入圖片說明

因此,回答您的問題:

密鑰在更新時會更新。 與發布更新相關的操作。 您可以設置到期時間,通過新的查找/緩存寫入強制緩存更新,從本質上可以達到所需的結果。 就高速緩存而言,它總是讀取與鍵相對應的高速緩存元素。 如果它得到更新,則它將讀取已更新的元素,但不是緩存對數據庫進行檢查的責任。

您可能正在尋找的是准備好的聲明 在Prepared Statements上的Tenderlove或更快的數據存儲區,例如不太安全的Postgres(即,在沒有ACID的情況下調整為NoSQL)或NoSQL類型的數據庫。

您的數據庫中也有索引嗎? 沒有適當的索引,數據庫請求將很慢。 您可能只需要“調整”數據庫。

另外,還有一個很棒的叫做cell的 gem,至少在我的經驗中,它使您可以用自己的視圖做更多的事情,包括更快的返回率與渲染局部視圖。 它還具有一些緩存功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM