deno-redisのv1リリースに向けて
#deno-redis #メモ
v1までにやりたいこと
新しいクライアントAPI
具体的にはrueidisライクなAPIを提供したい
既存の多くのRedisクライアントライブラリは概ね以下のようなAPIを提供している
code:javascript
client.get("foo");
client.set("foo", "bar");
クライアントオブジェクトの各メソッドがRedisコマンドに対応している
この形式のAPIはわかりやすいものの、Redisに新しいコマンドが追加されていくと、クライアントがどんどん大きくなるという課題がある
Deno Deployからの利用を考えると、フットプリントはできるだけ小さい方が望ましい
まだどういった形にするかは決まりきってはいないものの、以下のようなAPIをイメージしている
code:javascript
import { createClient } from "@redis/builder/createClient.ts";
const client = createClient({
port: 6379,
});
// * コマンドごとにメソッドを用意するのではなく、単一のAPI経由でコマンドを実行する
// * 各コマンドごとにオーバーロードを定義し、ミスを防止できるようにする (型定義であればフットプリントの増加は防げるはず)
await client.command("GET", "foo");
await client.command("SET", "foo", 1);
背景・意図
Denoにnpmパッケージサポートが入ったことにより、node-redisやioredisとの差別化がより重要になるはず (Denoのnpmパッケージサポート)
そのためにはDeno Deployなどとの相性も考慮する必要がありそう
Deno Deployとの相性が良いAPIを提供したい (具体的にはフットプリントを削減したい)
RESP3とより親和性の高い柔軟なAPIが欲しい
ただし、既存のクライアントAPIも削除せずに引き続き提供は続けたい
jsrへの移行
dlinkからの移行
jsrへの移行を考えるとdlinkはやや相性が悪いこともあり、移行をしたい
Molt
Redis Clusterクライアントの実装 (#220)
対応中 (#235)
まだ最低限の状態しかないので、色々充実させていきたい
のサポート
全ノードへのコマンドのブロードキャスト
コネクションプーリングの実装
最低限必要な機能だと思うので優先度は高め
CommandExecutor.connectionを削除したい
Connectionは将来的に変更する可能性が高いので、v1時点では内部APIにとどめておきたい
そうすると、CommandExecutorにisClosedとかをもたせることになりそうだけど、若干の違和感を感じなくもない...😭
Pipeline周りのAPIの見直し (#223/259)
Monitorコマンドの実装 (#183)
RESP3サポート
deno-redisでRESP3をサポートする
Redis Sentinel
Pub/Sub APIをWeb Streams APIベースにする
既存のsubscribe()はAsyncIteratorベースにして、新しくsubscribeStream()みたいなメソッドを追加すべき?
Shared pub/sub
Redis v7.0でサポートされた機能
https://redis.io/docs/manual/pubsub/#sharded-pubsub
その他の案
ロギング
go-redisとかはHookを提供して、コマンドの実行前後に追加処理を行えるようにしてる
RedigoはNewLoggingConnというAPIを提供している
クライアントの自動生成
Redisには大量のコマンドがある
Redisのソースには各コマンドの定義がJSON形式で管理されており、これをベースに自動生成できるかもしれない
redis-commands
将来
Client side cachingのラッパ? (本体に入れなくてもよさそう)
ロック
redis-py
ジョブシステム
SidekiqとかBullなどのようなジョブシステムがあるとよさそう
ただし、本体に入れる必要はない
RedisJSONやRediSearchとかのサポート
node-redis
redis-py
ioredisのscanStreamライクなAPIの提供