redis | RubyGems.org が 2022/08/29 に5.0.0 になった。
4.8.0 から 5.0.0 にアップデートしようとしたらいろいろエラーが出たので自分が踏んだ変更点をメモ。
Redis.new の引数
Redis.new
の引数は Hash を取るが、v4 まではキーは文字列でも、シンボルでもどちらでも良かったが、V5 ではシンボルのみになった。
redis-rb V4 までは次の様に文字列キーのハッシュでも初期化できた。
もちろんシンボルキーも使えた。
config = {
'host' => 'redis-host-name',
'port' => 6379,
}
redis = Redis.new(config)
redis-rb V5 では次の様にシンボルキーで設定しないとエラーになるようになった。
config = {
host: 'redis-host-name',
port: 6379,
}
redis = Redis.new(config)
文字列のキーで設定すると次のようなエラーが発生する。
unknown keywords: "host", "port" (ArgumentError)
V4 では文字列キーをシンボルキーに置き換えるような実装しているのになんでなくしたのかな。
ListとHashで値に設定できる型がチェックされるようになった
V5 では List と Hash では要素にセットできる値の型が制限されるようになった。
まずは List 。
redis-rb V4 までは次の様にどんな型でも特にエラーなく値を入れることができた。
redis = Redis.new(config)
key = 'key-rpush'
redis.del(key)
redis.rpush(key, 'hello')
redis.rpush(key, 100)
redis.rpush(key, true)
redis.rpush(key, nil)
redis.rpush(key, MyClass) # クラスを入れようとしている
pp redis.lrange(key,0,-1)
=> ["hello", "100", "true", "", "MyClass"] # Redis から取り出すと結局全部文字列として取れる。
上記コードを redis-rb v5 で実装すると次のエラーが発生する。
Unsupported command argument type: TrueClass (TypeError)
true
をセットしようとしているのがダメ。
V4と同じ結果を得ようとすると次の様に数値か文字列として値をセットするようにする。
redis = Redis.new(config)
key = 'key-rpush'
redis.del(key)
redis.rpush(key, 'hello')
redis.rpush(key, 100)
redis.rpush(key, 'true')
redis.rpush(key, nil || '')
redis.rpush(key, MyClass.to_s)
pp redis.lrange(key,0,-1)
=> ["hello", "100", "true", "", "MyClass"]
ソースを見ると String
, Symbol
, Integer
, Float
以外はエラーにしている。
Hash も同様。
V4 では次のコードを実行できる。
redis = Redis.new(config)
key = 'key-hash'
values = {
'field1' => 'string',
'field2' => 100,
'field3' => true,
'field4' => nil,
'field5' => MyClass,
}
redis.mapped_hmset(key, values)
pp redis.hgetall(key)
=> {"field1"=>"string", "field2"=>"100", "field3"=>"true", "field4"=>"", "field5"=>"MyClass"}
V5 では上のコードのままだとListと同じ箇所でチェックされエラーになる。
同様の結果を得るには次のコードになる。
redis = Redis.new(config)
key = 'key-hash'
values = { # シンボルキーでも結果は同じ
'field1' => 'string',
'field2' => 100,
'field3' => true.to_s,
'field4' => nil.to_s,
'field5' => MyClass.to_s,
}
redis.mapped_hmset(key, values)
pp redis.hgetall(key)
=> {"field1"=>"string", "field2"=>"100", "field3"=>"true", "field5"=>"MyClass", "field4"=>""}
結局の所、値を to_s
してやれば良いようだ。
hiredis を利用するためのgemも変更されている。
hiredis ドライバーを利用する場合に必要なGemも変更されている。
redis-rb v4 の場合は次の様に hiredis-rb が必要だった。
# for redis-rb V4
gem 'hiredis'
gem 'redis', '4.8.0', :require => ['redis', 'redis/connection/hiredis']
redis-rb v5 では hiredis-client に変わった。
gem 'hiredis-client'
gem 'redis', '5.0.5'
いずれのバージョンでも gem を require
した時点で、デフォルトの driver が hiredis
となるのでわざわざ Redis.new(driver: :hiredis)
と指定する必要はない。
まとめ
- シンボルキーで設定する
- List、Hash の値は
to_s
する - hiredis から hiredis-client