2016-10-02 80 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中找到与之匹配的任何内容。