当使用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
}
...
...