Blogaomu

WEBアプリケーション開発とその周辺のメモをゆるふわに書いていきます。

redis gem で Encoding::CompatibilityError が発生した

set(key, value) するときに、keyとvalueのエンコーディングに互換性がないと例外になる話。

keyに日本語入れることはあまり無いと思いますが、以下の例で発生します。

require 'redis'
require 'msgpack'

redis = Redis.new(host: "localhost", port: 6379)
redis.set('読書', MessagePack.pack({cnt: 14}))
#=> Encoding::CompatibilityError: incompatible character encodings: UTF-8 and ASCII-8BIT

'読書'.encoding
#=> #<Encoding:UTF-8>

MessagePack.pack({cnt: 14}).encoding
#=> #<Encoding:ASCII-8BIT>

https://github.com/redis/redis-rb/blob/v3.1.0/lib/redis/connection/command_helper.rb#L28

この行で Redis#set に渡した引数を join するのですが、 読書MessagePack.pack({cnt: 14})エンコーディングが異なり、互換性がないため例外が起きてました。ケースとしては少ないと思いますが気をつけましょう...。