2016-10-02 115 views
0

雖然我們使用FileStore作爲緩存存儲,DalliStore作爲會話存儲,但我們可以運行Rails.cache.clear,並且它只會清除緩存中的no無論什麼問題。Rails.cache.clear正在註銷所有登錄用戶(清除會話)

現在我們已經將緩存存儲移到了mem_cache_store中,如果我們運行Rails.cache.clear我們清除緩存,但也註銷每個用戶,銷燬所有會話。

這是預期的行爲?

+0

讓我猜測,您正在爲您的緩存和會話存儲使用相同的memcached配置? – phoet

回答

0

@phoet是對的。在我的initializers/session_store中,config.session_store被設置爲CacheStore。這不是Rails 4中的默認值,它是:cookie_store。

什麼是混淆(現在我看到了光線)是這樣的:無論您選擇哪種緩存存儲機制,總會有一個存儲在瀏覽器中的cookie(使用您在同一文件中設置的名稱商店機械化,在關鍵:'xxx'選項 - 這個關鍵實際上是cookie名稱,並且與您在secrets.yml中設置的密鑰無關以加密它)。

如果您使用默認存儲mecanism(:cookie_store),則整個「會話散列」將存儲在cookie中,而服務器(數據庫/ memcached)中將不存儲任何內容。所有內容都將直接在該cookie中讀取和寫入(如果您設置了secret_key_base,則始終以Rails 4開頭)。

如果您使用任何其他存儲(如CacheStore或ActiveRecordStore),Cookie仍然存在,並且在'key'選項中設置了相同的名稱,但是如果您解碼它(您需要secret_key_base ,谷歌解碼rails 4會話),你會看到只會包含會話ID,然後Rails會查找數據庫(ActiveRecord)或memcached(CacheStore,考慮到您使用的是memcached而不是FileStore用於存儲緩存,但這是另一個配置)。

因此,因爲我的會話存儲設置爲CacheStore,所以當我做Rails.cache.clear時,cookie沒有被刪除(當然是在客戶端),但是當Rails獲得該cookie內的會話ID時它無法在memcached中找到與之匹配的任何內容。