当使用redis_store时,需要注意Rails.cache.clear会完全删除数据库的内容

总结

如果使用redis_store作为Rails的缓存存储,则调用Rails.cache.clear将清除缓存存储所使用的数据库中的所有数据。因此,应将缓存用数据库和其他用途的数据库分开。

进行实验

设定文件的样子是这样的。

require 'redis'
Redis.current = Redis.new(
  host: 'redis://localhost',
  port: 6379,
  db: 0
)
...
...
  config.cache_store = :redis_store, {
    url: 'redis://localhost',
    port: 6379,
    db: 0
  }
...
...

现在让我们来试试看吧。

# 書き込み
> Rails.cache.write('aaa', 'aaa')
=> "OK"
> Redis.current.with { |redis| redis.set('bbb', 'bbb') }
=> "OK"

# 読み込み
> Rails.cache.read('aaa')
=> 'aaa'
> Redis.current.with { |redis| redis.get('bbb') }
=> 'bbb'

# キャッシュクリア後読み込み
> Rails.cache.clear
=> nil
> Rails.cache.read('aaa')
=> nil
> Redis.current.with { |redis| redis.get('bbb') }
=> nil

可以看出,不仅仅是由Rails.cache.write写入的那部分数据消失了。

当查看redis_store的实现时,可以看到Rails.cache.clear实际上是针对Rails使用的Redis数据库执行了flushdb操作。因此,所有缓存数据都会被清空。请参考以下链接的具体实现代码:
https://github.com/redis-store/redis-activesupport/blob/master/lib/active_support/cache/redis_store.rb#L247-L253

处理

在使用Redis时,将缓存存储(Cache Store)和其他数据分开放置。

require 'redis'
Redis.current = Redis.new(
  host: 'redis://localhost',
  port: 6379,
  db: 0
)
...
...
  config.cache_store = :redis_store, {
    url: 'redis://localhost',
    port: 6379,
    db: 1
  }
...
...
广告
将在 10 秒后关闭
bannerAds