Webuilder240

RubyのRedisのクライアントを使う場合は定数ではなくRedis.currentにクライアントインスタンスを代入しよう

2020-07-07 22:36:14 +0900

Redis Ruby
クライアントインスタンスって言うと、ちょっと小難しいけど、見ればわかる。

ちょっと古めのRuby(というかRailsなんだけど)でRedisを扱う系の記事でたまに見るサンプルですが、「config/initializers/redis.rbを生成して...」とか言って下記のようなコードを記載させるわけですよ...
# config/initializers/redis.rb
REDIS = Redis.new(host: ENV['REDIS_HOST'])
で、ControllerやModelで下記のように使えばOK!!!
# test.rb
REDIS.set('hoge', 'fuga')
REDIS.get('hoge') # => "fuga"
みたいな感じで締めくくられた記事をちょいちょい見かけます。なぜ定数に入れるのでしょうか...?
正直、僕もちゃんと調べるまではわかりませんでした。疑問なく使っていて、方法がないとか思っていました。まぁクライアントクラスをちゃんと内部的につくりゃいいんですが、面倒なのでしなかっただけです...
はい。見事にしてやられた...

RedisのGemには.currentというメソッドがある。

その名もずばり、RedisのRubyクライアントには、.currentというメソッドがあります。こいつを使いましょう。

https://github.com/redis/redis-rb/blob/9fd381b18da20248a111cd9551354907c772a00a/lib/redis.rb#L25

なのでコードもこのように書き換わります。
# config/initializers/redis.rb
Redis.current = Redis.new(host: ENV['REDIS_HOST'])

# test.rb
Redis.current.set('hoge', 'fuga')
Redis.current.get('hoge') # => "fuga"


スレッドセーフじゃないからとか?と思ったんですが、ちゃんとRedis.currentもスレッドセーフみたいでした。(Ver 3.0 ~)
https://github.com/redis/redis-rb/blob/master/CHANGELOG.md#300

おそらく定数であることの理由は「現在はない」とおもう

スレッドセーフだし、わざわざ定数を定義する理由がわかりません。
もしあるとすれば、Redisをデータホスト用途に複数台利用していて、それぞれに対して接続をしたいというケースが思い浮かびますが、そこまでRedisをヘビーユースしている人でなければ単にRedis.currentでいいと思いました。あとは、Redis.currentのほうがタイプ数が多いから?
なにか理由があってするのはいいんですが、盲目的に定数を定義するのはしなくてもいいかなぁ。

関連しそうなブログ