memcachedをコマンドラインで操作する完全ガイド【telnet・nc・stats解説 2024年版】

2012年3月21日

memcachedは高速なインメモリキャッシュシステムとして広く使われていますが、「中身を直接確認したい」「特定のキーを削除したい」といった場面で、コマンドラインから直接操作する方法を知っておくと非常に便利です。

本記事では、telnetやncコマンドを使ったmemcachedへの接続方法から、キーの一覧取得・値の確認・削除・フラッシュまで、実務でよく使うコマンドを網羅的に解説します。

memcachedのアーキテクチャ概要図:クライアントからtelnetでmemcachedサーバーに接続するイメージ

memcachedへの接続方法

memcachedはデフォルトでポート11211でTCP/UDPリクエストを受け付けます。コマンドラインから接続するにはtelnetまたはnc(netcat)を使います。

telnetで接続する

telnet localhost 11211

接続に成功すると以下のように表示されます:

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

nc(netcat)で接続する

telnetが使えない環境では、ncを使うことができます。特にシェルスクリプトからのワンライナー実行に便利です。

echo "stats" | nc localhost 11211

または対話モードで接続する場合:

nc localhost 11211

切断方法

telnet接続を切断する際は、quitコマンドを入力するか、Ctrl+]qで切断します。

quit

memcachedの基本コマンド一覧

memcachedのコマンドプロトコルはシンプルなテキストベースです。接続後に以下のコマンドが使えます。

コマンド 用途
stats サーバー全体の統計情報
stats items スラブ(slab)ごとのアイテム数
stats cachedump <slab_id> <limit> スラブ内のキー一覧
get <key> キーの値を取得
set <key> <flags> <exptime> <bytes> キーと値を設定
delete <key> キーを削除
flush_all 全キャッシュをフラッシュ
version memcachedのバージョン確認

キャッシュ内のデータを確認する手順

memcachedはデータをスラブ(slab)という単位で分けて管理しています。そのため「全キーを一覧で取得する」コマンドは存在せず、スラブ番号を経由して順番に確認します。

memcachedのスラブ構造図:データがslab1〜slabNに分散して保存されるイメージ

ステップ1:stats itemsでスラブ一覧を取得

stats items

実行結果の例:

STAT items:13:number 1
STAT items:13:age 23763
STAT items:13:evicted 0
STAT items:13:evicted_nonzero 0
STAT items:13:evicted_time 0
STAT items:13:outofmemory 0
STAT items:13:tailrepairs 0
STAT items:13:reclaimed 0
STAT items:14:number 2
STAT items:14:age 23742
STAT items:14:evicted 0
STAT items:14:evicted_nonzero 0
STAT items:14:evicted_time 0
STAT items:14:outofmemory 0
STAT items:14:tailrepairs 0
STAT items:14:reclaimed 0
END

items:13:number 113 がスラブ番号、1 がそのスラブに格納されているアイテム数です。

ステップ2:stats cachedumpでキー一覧を取得

スラブ番号がわかったら、そのスラブに含まれるキーの一覧を取得します。

stats cachedump 13 1000
  • 第1引数:スラブ番号(上記で確認した番号)
  • 第2引数:取得するキーの最大数(0にすると全件)

実行結果の例:

ITEM session_user_123 [1264 b; 1332315959 s]
ITEM session_user_456 [1264 b; 1332315959 s]
END

ITEM <key> [<bytes> b; <expiry> s] の形式で、キー名・データサイズ・有効期限(UNIXタイムスタンプ)が表示されます。

ステップ3:getでキーの値を取得

get session_user_123

実行結果の例:

VALUE session_user_123 0 1264
{"user_id":123,"name":"gendosu","role":"admin"}
END

VALUE <key> <flags> <bytes> の後に実際の値が続きます。

データの書き込み・削除

setコマンドで値を設定する

set mykey 0 300 11
hello world

コマンドの書式:

set <キー名> <フラグ> <有効期限(秒)> <バイト数>
<値>
  • フラグ:アプリケーション側が任意に使う整数(通常は0)
  • 有効期限:0で無期限、秒数を指定(最大30日 = 2592000秒)
  • バイト数:値のバイト数(値の文字数と一致させること)

成功すると STORED が返ります。

STORED

deleteコマンドでキーを削除する

delete mykey

成功時は DELETED、キーが存在しない場合は NOT_FOUND が返ります。

flush_allで全キャッシュをクリアする

flush_all

注意:flush_allは全データを削除します。本番環境での実行は慎重に行ってください。

開発環境でのみ使用するか、遅延フラッシュ(秒数指定)を活用します:

flush_all 60

60秒後にフラッシュされます(その間に追加されたデータは保持されます)。

サーバー統計情報の確認

statsコマンドで全体の状態を確認

stats

主要な統計情報の見方:

項目 意味
curr_connections 現在の接続数
curr_items 現在のキャッシュアイテム数
bytes 現在使用中のメモリ(バイト)
limit_maxbytes メモリ使用上限
get_hits キャッシュヒット数
get_misses キャッシュミス数
evictions メモリ不足によるキャッシュ追い出し数
uptime 起動からの経過秒数

キャッシュヒット率は get_hits / (get_hits + get_misses) で計算できます。

versionでバージョン確認

version
VERSION 1.6.23

シェルスクリプトでの自動化

ncを使うと、シェルスクリプトから一括でmemcachedを操作できます。

全スラブのキーを一覧取得するワンライナー

#!/bin/bash
HOST=localhost
PORT=11211

# stats itemsからスラブ番号を抽出
slab_ids=$(echo "stats items" | nc $HOST $PORT | grep -oP 'items:\K[0-9]+(?=:number)' | sort -u)

for slab_id in $slab_ids; do
    echo "=== Slab $slab_id ==="
    echo "stats cachedump $slab_id 0" | nc $HOST $PORT
done

特定プレフィックスのキーをまとめて削除する

#!/bin/bash
HOST=localhost
PORT=11211
PREFIX="session_"

# キー一覧を取得してプレフィックス一致のものを削除
for slab_id in $(echo "stats items" | nc $HOST $PORT | grep -oP 'items:\K[0-9]+(?=:number)' | sort -u); do
    echo "stats cachedump $slab_id 0" | nc $HOST $PORT \
        | grep "^ITEM ${PREFIX}" \
        | awk '{print $2}' \
        | while read key; do
            echo "delete $key" | nc $HOST $PORT
            echo "Deleted: $key"
        done
done

シェルスクリプトでmemcachedキーを一括操作しているターミナルのスクリーンショットイメージ

セキュリティに関する注意事項

memcachedはデフォルトで認証機能を持たないため、ネットワーク設定が重要です。

ループバックインターフェースのみでリッスンする

/etc/memcached.conf(Debian/Ubuntu系)または起動オプションで、ループバックアドレスのみにバインドします:

-l 127.0.0.1

ファイアウォールでポートを遮断する

外部からポート11211へのアクセスをiptablesで遮断します:

sudo iptables -A INPUT -p tcp --dport 11211 -s 127.0.0.1 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 11211 -j DROP

SASL認証を有効にする(memcached 1.4.3以降)

memcached 1.4.3以降ではSASL認証が利用可能ですが、通常はループバック+ファイアウォールの組み合わせで十分なセキュリティが確保できます。

よくあるエラーと対処法

「Connection refused」が出る場合

memcachedが起動しているか確認します:

# 起動状態の確認
sudo systemctl status memcached

# プロセス確認
ps aux | grep memcached

# ポートのListen確認
ss -tlnp | grep 11211

「CLIENT_ERROR」が出る場合

setコマンドでバイト数と実際の値の長さが一致しないと発生します。

CLIENT_ERROR bad data chunk

バイト数を正確に計算して再実行してください:

echo -n "hello world" | wc -c
# → 11

ncコマンドで応答が返らない場合

ncのバージョンによって動作が異なります。-q オプションで接続終了後のタイムアウトを指定します:

echo "stats" | nc -q 1 localhost 11211

または ncat(nmap-ncat)を使うと安定します:

echo "stats" | ncat localhost 11211

まとめ

memcachedをコマンドラインで操作する際の流れをまとめます:

  1. 接続: telnet localhost 11211 または nc localhost 11211
  2. スラブ確認: stats items でスラブ番号を把握
  3. キー一覧: stats cachedump <slab_id> 1000 でキーを確認
  4. 値の確認: get <key> で値を取得
  5. 値の設定: set <key> <flags> <exptime> <bytes> + 値
  6. 削除: delete <key> または flush_all

memcachedの動作を直接確認できるコマンドラインスキルは、デバッグ・障害対応・パフォーマンスチューニングのあらゆる場面で役立ちます。本記事のコマンドを参考に、日常的なキャッシュ管理に活用してください。

関連記事

Linuxmemcached

Posted by GENDOSU