Rails.cache.clear正在注销所有登录用户(清除会话)

时间:2016-10-02 15:43:56

标签: ruby-on-rails caching memcached

虽然我们使用FileStore作为缓存存储和DalliStore作为会话存储,但我们可以运行Rails.cache.clear,它只是在Sessions中清除缓存而没有任何问题。

现在我们将缓存存储移动到mem_cache_store,如果我们运行Rails.cache.clear,我们清除缓存,但也注销每个用户,销毁所有会话。

这是预期的行为吗?

1 个答案:

答案 0 :(得分:0)

@phoet是对的。在我的initializers / session_store中,config.session_store设置为CacheStore。这不是Rails 4中的默认值,即:cookie_store。

令人困惑的是(现在我看到了亮点)是这样的:无论你选择什么缓存存储机制,浏览器中都会存储一个cookie(你在同一个文件中设置的名称,就在存储机制,在密钥中:' xxx'选项 - 此密钥实际上是cookie名称,与您在secrets.yml中设置的密钥无关,以加密它。

如果你使用默认的存储机制(:cookie_store),整个"会话哈希"将存储在cookie中,并且服务器上没有任何内容(数据库/ memcached)。所有内容都将直接在该cookie中读取和写入(如果您设置了secret_key_base,则从Rails 4开始总是加密的。)

如果您使用任何其他存储空间(如CacheStore或ActiveRecordStore),则Cookie仍将存在,并且您在'键中设置的名称相同。选项,但如果你解码它(你需要secret_key_base,谷歌解码rails 4会话)你将看到只会包含会话ID,然后Rails将查找对应于该会话的数据数据库(ActiveRecord)或memcached(CacheStore,考虑到你使用的是memcached而不是FileStore来存储缓存,但这是另一个配置)。

因此,由于我的会话存储设置为CacheStore,当我执行Rails.cache.clear时,cookie没有被删除(当然是在客户端),但是当Rails得到了在该cookie中的会话ID,它无法在memcached中找到任何与之匹配的内容。