memcached 操作例 (telnetコマンド, ncコマンド編)

スポンサーリンク

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 ~]# 
タイトルとURLをコピーしました