memcachedをtelnetコマンドやncコマンドで操作する方法を説明します。
前提
公式ドキュメント
参考となる公式ドキュメントを以下に示します。
動作確認済環境
- Rocky Linux 8.6
- memcached 1.5.22
基本的な操作
telnetコマンドの場合
telnetコマンドでmemcachedに接続し、statsコマンドなどを発行します。操作例は以下のようになります。
[root@linux010 ~]# telnet localhost 11211 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. stats STAT pid 1681 STAT uptime 314 STAT time 1667950077 STAT version 1.5.22 <omitted> END quit Connection closed by foreign host. [root@linux010 ~]#
setコマンドはやや複雑です。syntaxは以下のようになります。
set <key> <flags> <exptime> <bytes>\r\n <data>
各パラメタの意味は以下のようになります。
パラメタ | 意味 |
---|---|
key | key |
flag | 32bitの値。アプリケーションがデータを識別する目的などで使用。version 1.2.1未満は16bitの値だったため、下位互換を持たせたいならば16bitの範囲で使用する。 |
exptime | データの保持期間(秒)。0を指定した場合は、無限に保存する。 |
bytes | dataのbyte数 |
data | data(value) |
例えば、以下のように入力すると、key「foo」を10byte保存分する意味になります。
set foo 0 0 10
前述の操作後、エンターキーを入力すると、10byte分のデータを入力できる状態になります。エンターキーを押下した時点でデータ入力が終わるわけではなく、10byte分のデータを入力完了した時点でデータ入力が完了します。
0123456789
以上を踏まえて、setコマンドの操作例を示します。
[root@linux010 ~]# telnet localhost 11211 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. set foo 0 0 10 0123456789 STORED quit Connection closed by foreign host. [root@linux010 ~]#
ncコマンドの場合
ncコマンドを用いてstatsコマンドを発行するには以下のように操作します。
[root@linux010 ~]# echo "stats" | nc localhost 11211 STAT pid 1681 STAT uptime 1548 STAT time 1667951311 STAT version 1.5.22 <omitted> END [root@linux010 ~]#
ncコマンドを用いてsetコマンドを発行するには以下のように操作します。
memcachedは改行コードを\r\nで指定する必要があります。ncコマンドで改行コード\r\nを使用するには、-Cオプションを付与してください。
[root@linux010 ~]# echo "set baa 0 0 14 > this is a pen." | nc -C localhost 11211 STORED [root@linux010 ~]#
コマンド一覧
Storage commands
set
setはkeyに対するvalueを書き込むコマンドです。後述のaddと異なり、使用済のkeyでも上書きが可能です。
操作例を以下に示します。
[root@linux010 ~]# echo "set key01 0 0 5 > 01234" | nc -C localhost 11211 STORED [root@linux010 ~]# echo "set key01 0 0 10 > 0123456789" | nc -C localhost 11211 STORED [root@linux010 ~]#
add
setはkeyに対するvalueを書き込むコマンドです。前述のsetと異なり、keyが存在しない場合のみ書き込み可能です。
操作例を以下に示します。key01はすでにデータが存在するため、エラーが返されます。
[root@linux010 ~]# echo "add key01 0 0 5 > 01234" | nc -C localhost 11211 NOT_STORED [root@linux010 ~]# echo "add key02 0 0 5 > 01234" | nc -C localhost 11211 STORED [root@linux010 ~]#
replace
すでに存在するkeyに対してvalueを書き換えます。
操作例を以下に示します。key03はデータが存在しないため、エラーが返されます。
[root@linux010 ~]# echo "replace key02 0 0 9 > new data." | nc -C localhost 11211 STORED [root@linux010 ~]# echo "replace key03 0 0 9 > new data." | nc -C localhost 11211 NOT_STORED [root@linux010 ~]#
append
すでに存在するkeyに対して、末尾にデータを追記します。
操作例を以下に示します。key02には既に”new data.”が設定されており、これの末尾に” append data.”を追記します。
[root@linux010 ~]# echo "set key02 0 0 9 > new data." | nc -C localhost 11211 STORED [root@linux010 ~]# echo "append key02 0 0 13 > append data." | nc -C localhost 11211 STORED [root@linux010 ~]# echo "get key02" | nc -C localhost 11211 VALUE key02 0 22 new data. append data. END [root@linux010 ~]#
prepend
すでに存在するkeyに対して、先頭にデータを追記します。
操作例を以下に示します。key02には既に”new data.”が設定されており、これの先頭に”prepend data. “を追記します。
[root@linux010 ~]# echo "set key02 0 0 9 > new data." | nc -C localhost 11211 STORED [root@linux010 ~]# echo "prepend key02 0 0 14 > prepend data. " | nc -C localhost 11211 STORED [root@linux010 ~]# echo "get key02" | nc -C localhost 11211 VALUE key02 0 23 prepend data. new data. END [root@linux010 ~]#
cas
casは”check and set”の意味でcheckに成功した場合のみデータを書き込む処理です。トランザクションを実現する場合に使用します。
それでは実際の操作例を紹介します。memcachedにはデータの更新有無を調査するためにCAS identifierと呼ばれる数値が管理されています。
getsコマンドを使用すると以下のような値が返されますが、CAS identifierはデータが更新される都度インクリメントされる値です。
VALUE <key> <flag> <bytes> <CAS identifier> <data>
実際にデータの更新を試みると、CAS identifierが19から20にインクリメントされている事が分かります。
[root@linux010 ~]# echo "set tran01 0 0 7 > value01" | nc -C localhost 11211 STORED [root@linux010 ~]# echo "gets tran01" | nc -C localhost 11211 VALUE tran01 0 7 19 value01 END [root@linux010 ~]# echo "set tran01 0 0 7 > value01" | nc -C localhost 11211 STORED [root@linux010 ~]# echo "gets tran01" | nc -C localhost 11211 VALUE tran01 0 7 20 value01 END [root@linux010 ~]#
以下に操作例を示します。まず、getsコマンドでデータの取得とCAS identifierの確認をします(CAS identifierが20であるという情報を得ます)。その後、CAS identifierに変化がない場合のみ(getsコマンドを実行後、誰もデータを更新していない場合のみ)、キーtran01の値をvalue01からvalue02に書き換えます。
[root@linux010 ~]# echo "gets tran01" | nc -C localhost 11211 VALUE tran01 0 7 20 value01 END [root@linux010 ~]# echo "cas tran01 0 0 7 20 > value02" | nc -C localhost 11211 STORED [root@linux010 ~]#
Retrieval Commands
get
値を取得します。
[root@linux010 ~]# echo "set key01 0 0 7 > value01" | nc -C localhost 11211 STORED [root@linux010 ~]# echo "get key01" | nc -C localhost 11211 VALUE key01 0 7 value01 END [root@linux010 ~]#
gets
値とCAS identifierを取得します。
[root@linux010 ~]# echo "set key01 0 0 7 > value01" | nc -C localhost 11211 STORED [root@linux010 ~]# echo "gets key01" | nc -C localhost 11211 VALUE key01 0 7 24 value01 END [root@linux010 ~]#
Delete Commands
delete
keyを削除します。操作例は以下の通りです。
[root@linux010 ~]# echo "set key01 0 0 7 > value01" | nc -C localhost 11211 STORED [root@linux010 ~]# echo "delete key01" | nc -C localhost 11211 DELETED [root@linux010 ~]# echo "get key01" | nc -C localhost 11211 END [root@linux010 ~]#
deleteコマンドが成功するのはkeyが存在する場合のみです。以下のように存在しないkeyに対してdeleteコマンドを試みると、NOT_FOUNDが返されます。
[root@linux010 ~]# echo "delete key99" | nc -C localhost 11211 NOT_FOUND [root@linux010 ~]#
Increment/Decrement Commands
incr
値を加算します。操作例は以下の通りです。
[root@linux010 ~]# echo "set key01 0 0 3 > 100" | nc -C localhost 11211 STORED [root@linux010 ~]# echo "incr key01 5" | nc -C localhost 11211 105 [root@linux010 ~]#
数値以外の値に対しincrコマンドを発行した場合は、以下のようなエラーが返されます。
[root@linux010 ~]# echo "set key02 0 0 7 > value02" | nc -C localhost 11211 STORED [root@linux010 ~]# echo "incr key02 5" | nc -C localhost 11211 CLIENT_ERROR cannot increment or decrement non-numeric value [root@linux010 ~]#
decr
値を減算します。操作例は以下の通りです。
[root@linux010 ~]# echo "set key01 0 0 3 > 100" | nc -C localhost 11211 STORED [root@linux010 ~]# echo "decr key01 5" | nc -C localhost 11211 95 [root@linux010 ~]#
数値以外の値に対しincrコマンドを発行した場合は、以下のようなエラーが返されます。
[root@linux010 ~]# echo "set key02 0 0 7 > value02" | nc -C localhost 11211 STORED [root@linux010 ~]# echo "decr key02 5" | nc -C localhost 11211 CLIENT_ERROR cannot increment or decrement non-numeric value [root@linux010 ~]#
Statistics Commands
stats
基本的な統計コマンドです。
[root@linux010 ~]# echo "stats" | nc localhost 11211 STAT pid 1681 STAT uptime 5999 STAT time 1667955762 <omitted>
stats items
imtes(keys and values)に関する統計を出力します。
[root@linux010 ~]# echo "stats items" | nc localhost 11211 STAT items:1:number 8 STAT items:1:number_hot 1 STAT items:1:number_warm 1 <omitted>
slabs items
slabs(memcachedがitemsを格納するための領域)に関する統計を出力します。
[root@linux010 ~]# echo "stats slabs" | nc localhost 11211 STAT 1:chunk_size 96 STAT 1:chunks_per_page 10922 STAT 1:total_pages 1 <omitted>
stats sizes
データの書き込み時に統計を取得します。STOREやDELETEなどが発生する都度少しのオーバーヘッドが発生するため、以下出力が示す通り、デフォルトの状態ではstats sizesの統計は無効化されています。
[root@linux010 ~]# echo "stats sizes" | nc localhost 11211 STAT sizes_status disabled END [root@linux010 ~]#
stats sizesの統計を有効にするには、”-o track_sizes”を指定してmemcachedを起動する必要があります。
cat << EOF > /etc/sysconfig/memcached PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="-l 0.0.0.0 -o track_sizes" EOF systemctl restart memcached.service
以下のようにstats sizesの統計を取得できます。
[root@linux010 ~]# echo "set key01 0 0 7 > value01" | nc -C localhost 11211 STORED [root@linux010 ~]# echo "stats sizes" | nc localhost 11211 STAT 96 1 END [root@linux010 ~]#
Flush Commands
flush_all
すべてのデータを削除します。
内部的には全てのデータを期限切れの状態にする挙動なので、領域が解放されるわけではない。
[root@linux010 ~]# echo "flush_all" | nc -C localhost 11211 OK [root@linux010 ~]#