redis_storeを使っているときRails.cache.clearはDBをまるまる吹っ飛ばすから注意
概要
Railsのキャッシュストアにredis_storeを用いている場合、Rails.cache.clearを呼び出すとキャッシュストアが使っているDBのデータが全部消えます。なのでキャッシュ用DBとそれ以外の用途のDBは分けておきましょう。
実験
設定ファイルはこんな感じ
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 DBに対して flushdb
を行っています。そりゃ全部消えちゃうわけですね。
https://github.com/redis-store/redis-activesupport/blob/master/lib/active_support/cache/redis_store.rb#L247-L253
対処
キャッシュストアとそれ以外で、Redis DBを分けておきましょう。
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
}
...
...
Author And Source
この問題について(redis_storeを使っているときRails.cache.clearはDBをまるまる吹っ飛ばすから注意), 我々は、より多くの情報をここで見つけました https://qiita.com/k5trismegistus/items/de1d4f1cb2a8a88e81c2著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .