我正在努力將片段高速緩存添加到既有登錄名又有匿名用戶的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作爲客戶端。
花了我幾分鐘的時間仔細研究了一下,但現在我明白了。我可以在之前的過濾器中設置當前的名稱空間ID,這些頁面具有緩存的內容,這樣我只需要時就可以查看它,而且我的代碼更加精簡。'過期'實際上只是memcached,只要它認爲它已滿,最終會清除最早的數據。 – 2010-10-25 22:57:22
現在,我已經擁有了這個偉大的工作,即使在達利也是如此。有一個關於dalli github問題票的評論,最近修改了元帥數據的問題。感謝你的幫助,威廉。 – 2010-10-27 04:14:06