構造
・ハッシュ形式で任意のデータを保存する分散型key-valueストア
・オンメモリの為高速に動作し、memcachedの再起動やOSの再起動時にデータが消える
・LRU(Least Recently Used)に基づいて利用されないキャッシュから自動的に削除される
・分散に対しての実装はサーバには実装されておらず、クライアントにて実装(Consistent Hashing可能)
・memcachedは、データをslabという領域にわけてメモリの確保、管理を実施する
(以前は、すべてのレコードに対してmallocとfreeをし、メモリにフラグメンテーションが発生し、大きな負荷となっていた)
・slabについてさまざまな値が用意されており、保存されるデータのbyte数より大きいslabが利用される
そのため、同じbyte数のデータばかりであるときは、同じ大きさのslabのみを用意することが好ましいが、現状その設定はできない
(ほぼ自動的にslabの値が決定する)
使い方
root@akat:/home/akat# lv /usr/share/doc/memcached/protocol.txt.gz # プロトコルの説明 root@akat:/home/akat# telnet localhost 11211 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. stats # 統計情報を表示 STAT pid 12536 STAT uptime 123 STAT time 1388416705 STAT version 1.4.13 STAT libevent 2.0.19-stable STAT pointer_size 64 STAT rusage_user 0.004000 STAT rusage_system 0.008000 STAT curr_connections 5 STAT total_connections 7 STAT connection_structures 6 STAT reserved_fds 20 STAT cmd_get 0 STAT cmd_set 0 STAT cmd_flush 0 STAT cmd_touch 0 STAT get_hits 0 STAT get_misses 0 STAT delete_misses 0 STAT delete_hits 0 STAT incr_misses 0 STAT incr_hits 0 STAT decr_misses 0 STAT decr_hits 0 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT touch_hits 0 STAT touch_misses 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 20 STAT bytes_written 1021 STAT limit_maxbytes 67108864 STAT accepting_conns 1 STAT listen_disabled_num 0 STAT threads 4 STAT conn_yields 0 STAT hash_power_level 16 STAT hash_bytes 524288 STAT hash_is_expanding 0 STAT expired_unfetched 0 STAT evicted_unfetched 0 STAT bytes 0 STAT curr_items 0 # 現在のitem数 STAT total_items 0 STAT evictions 0 STAT reclaimed 0 END set key 0 0 5 # set <key> <flags> <exptime> <bytes> でデータを格納 # <flags>:アプリケーション特有の32bitの値を指定でき、データの取得時に格納した時の値を返却する # <exptime>:データの有効期間を秒数で指定する。指定した時間経過すると、自動的にキーが削除される。0で無期限であるが、キャッシュの量で自動的に削除されることも。 value STORED get key # getでデータの取得 VALUE key 0 5 value END set key1 0 0 6 value1 STORED append key1 0 0 6 # データの後方追加 append STORED get key1 VALUE key1 0 12 value1append END prepend key1 0 0 7 # データの前方追加 prepend STORED get key1 VALUE key1 0 19 prependvalue1append END stats items # slab情報を取得 STAT items:1:number 2 # items:x:…となっておりxがslab番号 STAT items:1:age 3609 STAT items:1:evicted 0 STAT items:1:evicted_nonzero 0 STAT items:1:evicted_time 0 STAT items:1:outofmemory 0 STAT items:1:tailrepairs 0 STAT items:1:reclaimed 0 STAT items:1:expired_unfetched 0 STAT items:1:evicted_unfetched 0 END stats cachedump 1 10 # slab番号1のkeyリスト(10個)を取得 ITEM key [5 b; 1388416582 s] ITEM key1 [19 b; 1388416582 s] END add key 0 0 5 # 同じキーのデータがストレージ上にない場合のみ値を保存 value NOT_STORED replace key 0 0 3 # 同じキーのデータがすでにストレージ上にあった場合のみ値を保存(setはどんなときもデータを保存) new STORED get key VALUE key 0 3 new END
memcached-tool
root@akat:/usr/local/src# wget -d https://github.com/memcached/memcached/archive/master.zip root@akat:/usr/local/src# unzip master.zip root@akat:/usr/local/src# cd memcached-master/scripts/ root@akat:/usr/local/src/memcached-master/scripts# ./memcached-tool localhost:11211 display # slabの内容を表示する # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 1 96B 4957s 1 2 no 0 0 0 root@akat:/usr/local/src/memcached-master/scripts# ./memcached-tool localhost:11211 dump # データのdump Dumping memcache contents Number of buckets: 1 Number of items : 2 Dumping bucket 1 - 2 total items add key1 0 1388416582 19 prependvalue1append add key 0 1388416582 5 value
その他
・exptimeについて、getする際にレコードのtimestampを見ることで,そのレコードがexpireしたかチェックするため、内部的にexpireの監視をしておらず、無駄なリソースを消費しない
・クライアントからget_multiすることができ、非同期でデータを取りに行くため、getのfor文よりも早い
・deleteコマンドについて、1つ目の引数でkeyを指定するが、2つ目の引数として時間を与えることで一定時間、新しいデータを同じキーで保存できないようにすることができる。(addとreplaceではこの間保存できない。)キャッシュデータの不整合を防ぐ
参考
構造
http://gihyo.jp/dev/feature/01/memcached
コマンド
http://research.sakura.ad.jp/2010/03/26/kvs-memcached/
memcached-tool
http://taka512.hatenablog.com/entry/20110830/1314698515