2010-10-25 20 views
2

我正在努力將片段高速緩存添加到既有登錄名又有匿名用戶的Rails 3站點,並且需要根據內容何時過期來控制部分頁面過期在整個網站顯示更新。在此過程中,我發現memcached不支持expire_fragment的正則表達式,所以現在我正在尋找解決方法。解決memcached在Rails片段高速緩存中缺少通配符失效的問題

對於匿名用戶來說,這不是一個大問題。我創建了像'frontpage-new-shows'或'schedule-weekly-forecast-10/24/10'這樣的緩存鍵,並在Show模型中創建一個新條目或者在下週通過清掃器進行修改。這工作得很好。

我的問題是登錄的用戶。他們每個人都有自己的自定義時間表,所以我的密鑰看起來像'schedule-user-jschuur-10/10/24',其中jschuur是帳戶的用戶名。我瞭解到,使用基於日期的約定時,它們會自然過期,但我也希望在當天(或一週)的日程安排中顯示相關更改的那一天,顯式過期緩存時間表的所有片段。

事實證明,memcached無法做到我需要的那種通配符到期(schedule-user - 。* - 10/10/24)。這意味着我需要某種解決方案來存儲在memcached中的中央查找鍵中發佈的所有密鑰,或者基於我爲我發送給memcached的密鑰,Rails/Ruby以某種方式在內部執行此操作。

我假設前者是更好的解決方案。我的問題是,我如何以最有效的方式來做到這一點,所以我不會將所有時間都保存下來,而不是再次擊中數據庫。我可以將數組或散列存儲在memcached中,檢索整個事物,循環如果匹配,刪除它們並將散列存儲回去。聽起來這對於幾百甚至上千用戶來說可能很好,但這真的是最好的選擇嗎?

有人已經解決了這個問題併發布瞭解決方案嗎?

有一點要考慮的是,幾乎所有的緩存目前正與在視圖中陳述完成後,向ActiveRelations面向尚未準備發射查詢,像這樣的:

<% if current_user %> 
    <% if current_user.saved_shows_count %> 
    <% cache "schedule-user-#{current_user.username}-#{(Time.now + 3.hours).to_date.end_of_week.strftime('%D')}" do %> 
     <% if @shows.any? %> 
     <%= render :partial => "schedule/schedule", :locals => { :shows => @shows } %> 
     <% end %> 
    <% end %> 
... 

該網站是在Heroku上託管,我使用dalli gem作爲客戶端。

回答

5

編輯:有一些問題,這是與達利寶石寫,做一個讀引發「元帥數據太短」或「無效編組數據在內存緩存」對我來說。不知道它是否也適合你。

雖然有點詭異,但可以使用命名空間,然後增加命名空間,從而使使用它創建的所有密鑰無效。爲此,請首先在初始化程序(或任何地方)中使用Rails.cache.write("frontpage-new-shows-namespace", "1", {:raw => true})設置名稱空間。設置每個緩存時,請將Rails.cache.read("frontpage-new-shows-namespace")添加到您希望的任何位置的散列密鑰中(這在哪裏並不重要)。使名稱空間中創建的所有緩存鍵失效就像Rails.cache.increment("frontpage-new-shows-namespace", 1)一樣簡單。您可以將Rails.cache.read("frontpage-new-shows-namespace")作爲全局變量添加,從而消除用於創建緩存鍵的memcache搜索,然後在執行緩存名稱空間增量時更新此變量。

祝你好運,我希望這有助於。

+0

花了我幾分鐘的時間仔細研究了一下,但現在我明白了。我可以在之前的過濾器中設置當前的名稱空間ID,這些頁面具有緩存的內容,這樣我只需要時就可以查看它,而且我的代碼更加精簡。'過期'實際上只是memcached,只要它認爲它已滿,最終會清除最早的數據。 – 2010-10-25 22:57:22

+1

現在,我已經擁有了這個偉大的工作,即使在達利也是如此。有一個關於dalli github問題票的評論,最近修改了元帥數據的問題。感謝你的幫助,威廉。 – 2010-10-27 04:14:06