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を思い出すには最適かなと。それともちょっとレベル高いかな...まあ、難しいくらいが勉強には丁度良いと思っとりますが。