memcached

  • 投稿者:
  • 投稿カテゴリー:NoSQL

構造

・ハッシュ形式で任意のデータを保存する分散型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