memcachedを使ってみる
さてTokyo Cabinetを触ったので、Tokyo Tyrantを使ってみようと思ったんですが、折角なんでその前にmemcachedを触りました。Tkyo Tyrantはmemcached互換らしいので、API的には同じみたいですしね。さて、まずはインストールですがmemcachedはrpmforgeを追加すればyumでインストールできる模様。
# yum -y install memcached
起動。
# /etc/init.d/memcached start # chkconfig memcached on
確認。11211でListenしてるらしいのでtelnetで叩く。statsコマンドで状態が確認できるらしい。
# telnet localhost 11211 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. stats STAT pid 20061 STAT uptime 203 STAT time 1241579794 STAT version 1.2.6 STAT pointer_size 32 STAT rusage_user 0.000000 STAT rusage_system 0.000000 STAT curr_items 0 STAT total_items 0 STAT bytes 0 STAT curr_connections 5 STAT total_connections 6 STAT connection_structures 6 STAT cmd_get 0 STAT cmd_set 0 STAT get_hits 0 STAT get_misses 0 STAT evictions 0 STAT bytes_read 7 STAT bytes_written 0 STAT limit_maxbytes 67108864 STAT threads 4 END
同様にtelnetでつないで「set」,「get」コマンドでデータの出し入れができるみたいです。
- set $key $flag $expire $size
- get $key
setコマンドは
- $flag : 圧縮するかどうか
- $expire : 期限
- $size : データサイズ
となっているみたいです。
ということで、圧縮せずに期限なしで5byteの「value」と言うデータを「key」というキーで保存してみます。
set key 0 0 5 value STORED get key VALUE key 0 5 value END
一通り接続の確認が出来たので今回はphpで接続してみます。PECLでライブラリが提供されてるみたいですね。まずはインストール。
# yum -y install php-pecl-memcache
リファレンスはこれですかね。
http://jp.php.net/memcache
コードです。データを登録して取り出して出力しています。set関数は文字列、数値以外の型の値を登録しようとした場合は自動的にシリアライズして保存してくれるらしいです。便利ですね。ということで、Arrayも登録してみました。
<?php define("SERVER", "localhost"); define("PORT", 11211); $memcache = new Memcache; $memcache->connect(SERVER, PORT); $memcache->set('name', 'mind', false, 10); $name = $memcache->get('name'); echo "name: $name\n\n"; $tmp_array = array('A', 'B'); $memcache->set('array', $tmp_array, false, 10); $array = $memcache->get('array'); print_r($array); ?>
実行結果
name: mind Array ( [0] => A [1] => B )
実際どのような形でArrayが保存されているかtelnetでも叩いて確認してみました。
get array VALUE array 1 30 a:2:{i:0;s:1:"A";i:1;s:1:"B";} END
a:はArray, 2は要素数, i:がインデックス、s:は文字列を表してるんですかねー。memcachedのコードはCで書かれてて全部で6000行くらいだそうな。そろそろC言語の勉強をちゃんとしようかなーと思ってるので、ネタ的には丁度良いくらいかな。カーネルのソースコードを読んでみたいなーと思ってるんで、久しく触ってないCを思い出すには最適かなと。それともちょっとレベル高いかな...まあ、難しいくらいが勉強には丁度良いと思っとりますが。