memcached-cli の v0.9.4 までの追加機能の紹介
3/24 の記事で、最近作った memcached-cli というツールの紹介をしました。
別に困ってはいないのですが、もっと便利にしたので、Changes から抜粋して追加機能を紹介しておきます。
昨日か一昨日に手元に入れて試してみた、という方はぜひアップデートしてみてください。
gets, add, replace, append, prepend, cas, touch, incr, decr の実装
v0.6.0 以前は get/set/delete しかできませんでしたが、これで memcached/doc/protocol.txt に書かれている Retrieval, Storage コマンド + α のデータ操作が全てできるようになりました。
なんとなくコマンドの解説:
- add は該当キーのデータが無いときのみ成功します。
- replace は該当キーのデータが有るときのみ成功します。
- cas は gets で取得した cas 値に基いて更新を試み、cas 値が異なっていたら更新しません。
append, prepend はこんな感じですね:
memcached@127.0.0.1:11211> add foo Foo memcached@127.0.0.1:11211> append foo .extension memcached@127.0.0.1:11211> prepend foo prefix- memcached@127.0.0.1:11211> get foo key: foo value: prefix-Foo.extension length: 20B flags: 0
get, gets で複数キーの同時取得に対応
元々 get, gets は複数キーを渡せたので、 memcached-cli
でもできるようにしました。
で、複数データ取得した時には下のように LTSV で表示するようにしました。
memcached@SERVER:PORT> gets foo bar Key:foo Value:Foo Length:3B Flags:0 Cas:219 Key:bar Value:Bar Length:3B Flags:0 Cas:220
cachedump コマンドで VALUE も取得して表示
以前の cachedump
コマンドは stats cachedump
の結果をそのまま出力していましたが、上のような LTSV にして、かつデータの中身も合わせて表示できたら便利だな、と思ったので、実装しました。
memcached@SERVER:PORT> cachedump 1 Key:foo Value:Foo Length:3B Expire:2016-03-26 00:30:27 Flags:0 Cas:219 Key:bar Value:Bar Length:3B Expire:2016-03-26 09:53:19 Flags:0 Cas:220 Key:baz Value:Baz Length:3B Expire:2016-03-26 10:49:05 Flags:123 Cas:221
実運用だと、 display
でざっと全体の様子をつかんで、気になるスラブ・クラスを cachedump してみて、場合によっては中身を見る、という調査の流れがよくあるかと思いますが、そんなときにこれを使うとすごく捗りそうです。
stats
, settings
の結果を正規表現でフィルタ可能に
小ネタですが、よく見る指標がある人にはちょっと便利かと。
memcached@127.0.0.1:11211> stats (get|set) # stats # Field Value cmd_get 248 cmd_set 515 get_hits 46 get_misses 202 memcached@127.0.0.1:11211> settings ^lru # stats settings # Field Value lru_crawler no lru_crawler_sleep 100 lru_crawler_tocrawl 0
ランダムデータ生成機能を実装しました
> randomset [<NUMBER> [<MAX_LENGTH> [<MIN_LENGTH> [<NAMESPACE>]]]] > randomset # 100 個生成 > randomset 50 # 50 個生成 > randomset 50 1024 # データ長 1-1024B の範囲で生成 > randomset 50 1024 256 # データ長 256-1024B の範囲で生成 > randomset 50 1024 256 sample1 # キーの prefix を 'sample1:' にする
これを使って、前回も話題に触れたネームスペースごとの統計取得・表示を簡単に試すことができます。
memcached@127.0.0.1:11211> settings detail # 設定を絞込み表示 # stats settings # Field Value detail_enabled no memcached@127.0.0.1:11211> detail on OK - Enabled stats collection for detail dump. memcached@127.0.0.1:11211> settings detail # stats settings # Field Value detail_enabled yes memcached@127.0.0.1:11211> \dd # まだデータが無い memcached@127.0.0.1:11211> detail on OK - Enabled stats collection for detail dump. memcached@127.0.0.1:11211> randomset 1000 0 0 sample1 Random Generate. [....................] Complete. memcached@127.0.0.1:11211> randomset 1000 0 0 sample2 Random Generate. [....................] Complete. memcached@127.0.0.1:11211> randomset 1000 0 0 sample3 Random Generate. [....................] Complete. memcached@127.0.0.1:11211> \dd PREFIX sample3 get 0 hit 0 set 1000 del 0 PREFIX sample2 get 0 hit 0 set 1000 del 0 PREFIX sample1 get 0 hit 0 set 1000 del 0
(これで、別に作っていたデータ生成ツールは要らなくなりました。)
memcached-tool の "dump" コマンドをインポート
memcached-cli dump_all
というコマンドにしました。
memcached-tool の "dump" は expire 0 のデータが正しく dump できない不具合があるのですが、こちらでは直しました。*1
ついでに dump から restore できるようにした
restore_dump <dumpファイル>
でできます。
cat <dumpファイル> | telnet SERVER PORT
で行けるかなと思ったのですが、やってみたら CLIENT_ERROR の嵐になってしまいましたので、このコマンドを使うといいと思います。
実運用上も、Memcached サーバを再起動しないといけないときに dump して別サーバに restore して IP アドレスを付け替える、みたいな使い方ができるかもしれません。
実装していないコマンドも実行できるようにしました。
call <command> [<arguments>...]
という形式で、任意のコマンドを直接 Memcached サーバに投げれるようにしました。
これで、まだ実装していない stats conns
や slabs reassign <src class> <dest class>
のようなコマンドも実行できます。
memcached-tool の sizes
コマンドも実装していませんが、 call stats sizes
で OK です。
今後 memcached に新しいコマンドが追加されてもなんとかなりそうです。
終りに
memcached 初心者の学習用にも良いかもなー、とも思いました。
もうたぶん、あまりいじることはないと思いますが、何かあれば GitHub のイシューなりでお知らせください。
それでは、Have fun!
*1:本家では修正 PR が出ていますが、まだ取り込まれていません。