nodeからmemcachedを使いたくなったんだけど,あまり良いクライアントがない.
というわけで自作した.
nodeでのmemcached事情
一番メジャーそうな
これは,DefinitelyTypedにd.tsファイルは存在するけど,そもそもcallback関数を受け取る形で,もういい加減Promiseを返してほしいと思う. Promiseにしてくれというissueは存在していて,どうやら開発している痕跡はあるのだけれど,どうもアップデートされてこない. というか最終リリースが2016年なので,これ当分更新されないのでは……
しかもメンテナの募集までされている……のだが,そのメンテナがnpmにアクセスできないようで……
Maintainers wanted! · Issue #318 · 3rd-Eden/memcached · GitHub
これは未来がない…….
こちらはPromiseを返してくれてよいのだけど,いかんせんtypescriptに対応していない. DefinitelyTypedにもないし,d.tsファイルも配信していない.
というわけで,
- typescriptで書かれている or d.tsファイルが存在する
- callbackではなくPromiseを返す
memcachedクライアントがほしいのだけれど,存在しない気がしたので自作した.
使い方
$ yarn add memcached-client
でインストールできる.
import Memcached, { Metadata } from 'memcached-client' const client = new Memcached('127.0.0.1', 11211) const example = async (client: Memcached) => { const connection = await client.connect() const code = await connection.set('my-key', 'my-value', false, 0) console.log(code) // => STORED const data: { [key: string]: Metadata } = await connection.get('my-key') if (data['my-key']) { console.log(data['my-key'].value) // => my-value } await connection.close() }
使い方はこんな感じ.
getのときの戻り値だけ少し複雑で,Metadata
という独自の型を,ハッシュの中に埋めて返す.
memcachedは,getに関しては複数のキーを同時指定することができる.そうすると,一度に複数のvalueが帰ってくることがあって,これをどう返すかが悩みどころでこういう形になっている.
配列で返しても良いのだが,key-value storeであることを考えると,keyとvalueをセットにして返すべきだろうと思ってこういう形になっている.
現状実装されている機能と今後
READMEにもRoadmapを載せているけど,そもそも現状このクライアントは,get/set/deleteメソッドしか持っていない. ただし,memcached側としては,この他にもいくつかメソッドが用意されており,それらにはまだ対応していないということになる.
一応自分で使う範囲では,get/set/deleteだけできれば事足りるので,とりあえずこの状態で出しているが,そのうち機能は充実してくると思う.
とりあえず直近はこの,未対応メソッドに対応していくことが優先されるので,もうちょっと開発しようかと思う.