redis-script-manager 書いた
p5-Redis-Script の Java 移植になります.
Redis を使ってて困った時にインターネットを徘徊してると @shogo82148 さんのブログにたどり着く事が多く,日頃お世話になってるわけですが,今回は Redisのトランザクション・スクリプト・ランキングを扱うPerlモジュールを公開しました - Shogo's Blog からの知見です.
上記の記事中には
EVALコマンドのドキュメントによると、 「EVALSHAで実行してみて NOSCRIPT No matching script で失敗したらEVALでやり直す」というのがおすすめらしいです。 EVALコマンドはSHA1ハッシュの登録も行ってくれるので、初回 NOSCRIPT になっても次回からはEVALSHAが成功します。
そんなに複雑なことではないのですが、毎回書くのも大変なのでモジュールとして切り出したのが Redis::Script です。 以下のようにスクリプトオブジェクトを作っておいて、パラメータを渡して実行します。
とあり,まさにこの度そういった utility 的なものを毎度毎度書くのもだるくなったので,ここは一丁 library 化しようということで今回 Java に移植した次第.
Java でやるなら,特定の script について SCRIPT LOAD を一度だけ行なうような singleton class を用意してごにょごにょやるという方法も考えましたが,基本的な実装は p5-Redis-Script を踏襲しています *1.
redis-script-manager としては Jedis と lettuce の2つの Redis Client に対応しています.
ひとまずこれだけ対応しておけば自分で使う分は大丈夫だろう,という判断からこの2つに対応しました.
もしも他の Redis Client のサポートが必要になったら,redis-script-manager-core の抽象クラスである ScriptManager を継承して実装すれば同様の挙動を実現できるので,その時が来たら考えるぞ! という感じです.
ところでこういう細かい library を書いて使っていくのはあまり Java の文化っぽくない感じがあり,その背景には依存する jar が増えれば増える程地獄と化してきて厳しい,などといった状況があることと思います.確かにそうだ.
しかしだからといってコードをいちいちコピペして使い回すとかはあまりしたくないし,やっぱりかゆい所に手が届くパーツがあれば便利やん? みたいな感覚があるので,とりあえず外に出して使ってみるのが良いのではないかと思っているところです.
*1:むしろ ScriptManager ごと singleton にするという戦略はありかもしれない