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 が出ていますが、まだ取り込まれていません。