【问题标题】:Rails.cache.clear returns nilRails.cache.clear 返回 nil
【发布时间】:2017-12-30 00:11:49
【问题描述】:

我有这个设置 config.cache_store = :redis_store, ENV['REDIS_CACHE_URL']

$ redis-cli
127.0.0.1:6379> set random_key 1
OK

现在我去控制台执行Rails.cache.clear,它返回nil

而且我仍然可以在 redis-cli 中访问密钥 random_key。它没有清除缓存。

我也看不懂Rails.cache在这里返回的内容ruby/2.3.4/lib/ruby/gems/2.3.0/gems/railties-4.2.8/lib/rails.rb

Rails.cache.clear 是否应该返回 true?

如果我的理解有误,有人可以帮助我吗?

【问题讨论】:

    标签: ruby-on-rails caching


    【解决方案1】:

    redis-cache 将数据存储在特定的命名空间下。

    例如,如果您根据Documentation 配置了redis-store,则缓存键将存储在cache 命名空间下。这意味着,当你 Rails.cache.write("random_key", "key") 时,一个键 cache:random_key 将出现在 Redis 中。因此,当你Rails.cache.clear时,只会删除cache命名空间下的键。

    因此,如果您在 Redis 中手动创建 random_keyRails.cache.clear 将不会删除它。但是如果你手动创建cache:random_key,它会的。

    【讨论】:

    • 感谢您详细解释:)
    • 如果你使用redis store你也可以传递要清除的命名空间 Rails.cache.clear(namespace: :yournamespace)
    【解决方案2】:

    使用Rails.cache.clear时要小心,它会使应用程序(source)的所有密钥无效

    [~不确定这是否是这个答案的最佳位置~]

    This helpful article 是我在将 Rails 版本从 5.1+ 更改为 Rails 6.1+ 时了解缓存的好方法。这篇文章讨论了在有或没有版本控制的情况下生成缓存键的选项。

    在我的应用程序实例中,需要版本控制,但在升级到 Rails 6.1 时没有打开:

    #in application.rb
    config.active_record.collection_cache_versioning = true
    

    然后在调用object.cache_key 的应用程序代码中,我不得不将其更改为object.cache_key_with_version (source)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 2019-06-20
      • 2017-12-16
      • 2014-09-27
      • 2017-06-11
      • 2014-12-29
      • 2019-03-14
      相关资源
      最近更新 更多