valkeycompatを使ってgo-redisからvalkey-goへサクッと乗り換えました
こんにちは!RemitAidでソフトウェアエンジニアをしているnos0611です。
はじめに
先日のブログでも紹介しましたが、RemitAidではRedisからValkeyへの移行を行いました。
その際、RedisとValkeyは互換性があるとのことだったのでアプリケーション内で使用するライブラリはgo-redisのままにしていたのですが、valkey-goへの乗り換えも行ったので紹介します。
ライブラリの選定
Valkeyのページを見ると、Go向けのライブラリとしては以下の2つが記載されていました。
valkey-GLIDEについては複数言語向けに提供されており、valkey-goはGo向けのみの提供のようです。
また、それぞれ利用できる機能に違いがあるようで、それも同じページに情報がありました。
RemitAidではセッション管理と一部の排他制御くらいでしか使っていないのでどちらでも現在のユースケースは満たせるのですが、valkey-GLIDEにしかないClusterScanは当面使わなそうだったため、valkey-goを採用することとしました。
valkey-goとgo-redisの差分について
valkey-goは、以下のようにコマンドを組み立ててからそれをclientに渡して実行します。
// B()でビルダーの開始を、Build()で終了を宣言する
cmd := client.B().Get().Key("key").Build()
// 組み立てたコマンドをDo()に渡して実行する
val, err := client.Do(ctx, cmd).ToString()
一方で従来使っていたgo-redisは、以下のようにclientに直接メソッドを渡して実行します
val, err := client.Get(ctx, "key").Result()
慣れればどちらでも良いとは思いますが、実行したい処理によってはvalkey-goスタイルのコマンドの組み立てが少し手間に感じることもありそうです。
// 以下の例など載っていたのですが、なんか大変そうだなと……
client.Do(ctx, client.B().Hexpire().Key("h").Seconds(1).Fields().Numfields(2).Field("f1", "f2").Build()).AsIntSlice()
valkey-go/valkeycompat
うーむと考えていたところ、go-redisと互換性のあるvalkeycompatなるパッケージを発見しました 🎉
clientを用意するタイミングで一手間噛ませれば、go-redisとほぼ同じように使えるようです。(↑のページにも記載がありますが、一部のコマンドには対応していないそうです)
// 簡便化のために一部コードを省略しています。
compat := valkeycompat.NewAdapter(client) // ←これを挟む
ok, _ := compat.Get(ctx, "key").Result()
サードパーティではなく公式の提供しているライブラリで互換性が保てるということで、これを採用し、無事乗り換えを行うことができました。
上記のサンプルコードよりは流石に書くことはありますが、処理部分の実装はほぼ変更なしで済んだため乗り換え作業もかなり楽に終えることができました。
まとめ
- go-redisからvalkey-goへの乗り換えはvalkey-go/valkeycompatが便利!!
- メインコントリビューターの@418Coffeeさんには頭が上がりません 🙏
告知
Podcast 「RemiTalk」では普段の会社の様子を赤裸々に語っています。
もし良ければ聴いてみてください!
Podcast 文字起こしはこちら
Discussion