@blog.justoneplanet.info

日々勉強

CentOSにmembaseをインストールする

CentOS 5.3の32bit版にインストールしてみることにした。

■インストール

以下のコマンドでrpmからインストールできる。

wget http://c2978342.ltd.cloudfiles.rackspacecloud.com/membase-server-community_x86_1.6.4.rpm --referer="http://www.membase.org/downloads"
rpm -ivh membase-server-community_x86_1.6.4.rpm

ダウンロードサイトの仕様上、wgetにリファラーをつけた。インストールが完了すると以下のメッセージが表示される。

Starting Membase server[  OK  ]

You have successfully installed Membase Server.
Please browse to http://localhost.localdomain:8091/ to configure your server.
Please refer to http://membase.com and http://membase.org for
additional resources.

Please note that you have to update your firewall configuration to
allow connections to the following ports: 11211, 11210, 4369, 8091
and from 21100 to 21199.

By using this software you agree to the End User License Agreement.
See /opt/membase/LICENSE.txt.

■設定

ブラウザから設定ができるらしいので、以下のコマンドでポート8091番を開ける。ついでに上述のメッセージに従って、11211番、11210番、4369番も同様に対処しておく。

system-config-securitylevel-tui

http://localhost:8091/にアクセスすると悪そうな顔したキャラが表示されるはずだ。後は画面の指示に従えば良い。

■ベンチマーク

上手く書き込みできるかを検証するついでにベンチマークしてみる。

$memcache = new Memcache();
$memcache->connect('localhost', 11211);
$start = microtime(true);
for($i = 0; $i < 1000; $i++){
    $memcache->set("k{$i}", "abcdefghijklmnopqrstuvwxyz");
}
$end = microtime(true);
print($end - $start);// 0.19418982505798

以前にmemcachedのベンチマークで使用したコードをそのまま使うことができるのが素晴らしい。

勝手評価

速度はmemcachedの2~3倍程度かかるようだが、他のKVSよりも数倍高速である。複雑な構造を必要とせずハッシュテーブルとして使用するだけならば、オススメできる気がする。

不具合:保存ができない

管理画面にアクセスし(http://localhost:8091/index.html#sec=monitor_buckets&zoom=zoom_minute)Data Bucket>Item Countを見ると0のままで保存がされていない。

原因

memcachedが既にポートを使っていた。

対策1

以下のコマンドでmemcachedをstopする。普通の人はこれで良いと思う。

/etc/init.d/memcached stop
対策2

以下のコマンドでmemcachedをアンインストールする。membaseがあればmemcachedは要らないってこともあり得る。

yum remove memcached
確認

以下のコマンドで確認すると良いかもしれない。

lsof -i:11211
悪い例

memcachedがポートを使っている。

COMMAND    PID      USER   FD   TYPE DEVICE SIZE NODE NAME
memcached 2500 memcached   26u  IPv6   8072       TCP *:11211 (LISTEN)
memcached 2500 memcached   27u  IPv4   8073       TCP *:11211 (LISTEN)
memcached 2500 memcached   28u  IPv6   8077       UDP *:11211
memcached 2500 memcached   29u  IPv4   8078       UDP *:11211
良い例

membaseがポートを使っている。

COMMAND  PID    USER   FD   TYPE DEVICE SIZE NODE NAME
moxi    6481 membase   40u  IPv6  38065       TCP *:11211 (LISTEN)
moxi    6481 membase   41u  IPv4  38066       TCP *:11211 (LISTEN)

■特性

memcached互換のNoSQLデータベース「Membase」がオープンソースで登場」を参考のこと。デフォルトでGUI管理ってのはなかなか頑張ってるよね。

CentOSにMongoDBをインストールする

■インストール

yumリポジトリの追加

以下のコマンドでリポジトリを追加する。

vi /etc/yum.repos.d/mongo.repo

以下のようにファイルの中身を記述する。

[10gen]
name=10gen Repository
baseurl=http://downloads.mongodb.org/distros/centos/5.4/os/i386/
gpgcheck=0

保存したら以下のコマンドを実行する。

yum install mongo-stable*

起動

以下のコマンドで起動してみる。

/etc/init.d/mongod start

以下のコマンドで起動したか確認する。

lsof -i:27017

以下のコマンドで自動起動を設定する。

chkconfig mongod on
chkconfig mongod --list

参考

CentOS and Fedora Packages

amazon linuxにインストールする

wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.2.tgz
tar xvzf mongodb-linux-x86_64-2.0.2.tgz
mv mongodb-linux-x86_64-2.0.2 /var/lib/mongodb
mkdir /mnt/db
/var/lib/mongodb/bin/mongod --fork --logpath ~/mongod.log --dbpath /mnt/db/

■PHPから扱う準備

以下のコマンドでpecl_mongoをインストールする。

pecl clear-cache
pecl install mongo

以下のコマンドで設定ファイルを生成する。

cp /etc/php.d/curl.ini /etc/php.d/mongo.ini
vi /etc/php.d/mongo.ini

設定ファイルは以下のような記述だ。

; Enable mongo extension module
extension=mongo.so

設定が終わったらhttpdをreloadする。

/etc/init.d/httpd reload

参考

PHP & MongoDB Sitting in a Tree: Part 1

英語だが非常に参考になるドキュメントだ。

■ベンチマーク

以下のコードを使用してベンチマークしてみた。

$dbh = new Mongo();
$dbh = $dbh->testdb;
$col = $dbh->bench;
$start = microtime(true);
for($i = 0; $i < 1000; $i++){
    $col->insert(
        array(
            'key'   => "key{$i}",
            'value' => "abcdefghijklmnopqrstuvwxyz"
        ),
        true
    );
}
$end = microtime(true);
print($end - $start);0.66766786575317
$dbh->close();

但し、2回目以降は0.2秒以下になる。

データを取り出す

本当にデータが挿入されているのか不安になったので、以下のコードを使用してデータを覗いてみた。

$res = $col->find();
$s = 0;
foreach($res as $doc){
    print("<pre>{$s}");
    var_dump($doc);
    print('</pre>');
    $s++;
}
$dbh->close();

ベンチマークをしておいて言うのもオカシイが、データストアにおいて全く同じ条件というものは再現できないので単純に比較してはならない。用途に応じた選択が必要である。

amazon Linuxにインストールする

amazon Linuxにインストールする場合は以下のようにする。

curl -O  http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.2.tgz
tar xzf mongodb-linux-x86_64-2.0.2.tgz
mv mongodb-linux-x86_64-2.0.2 /var/lib/mongodb
cd /var/lib/mongodb/bin
mkdir /mnt/db
./mongod --fork --logpath /var/log/mongod.log --dbpath /mnt/db/

memcachedをインストールする

あまり興味がないが仕事で使うので試してみた。♪(´ε` )

■インストール

以下のコマンドを実行してmemcachedをインストールする。

yum install memcached
/etc/init.d/memcached start
chkconfig memcached on

設定ファイルは以下のコマンドで編集できる。編集が必要な場合は書き換えると良い。

vi /etc/sysconfig/memcached

PHPから使いたいので以下のようにpeclコマンドでインストールする。

pecl clear-cache
pecl install memcache
cp /etc/php.d/curl.ini /etc/php.d/memcache.ini
vi /etc/php.d/memcache.ini

以下のようにファイルを記述する。

; Enable memcache extension module
extension=memcache.so

ファイルを上書き保存したらhttpをreloadする。

/etc/init.d/httpd reload

■ベンチマーク

以下のコードを使用し簡単にベンチマークしてみた。

$memcache = new Memcache();
$memcache->connect('localhost', 11211);
$start = microtime(true);
for($i = 0; $i < 1000; $i++){
    $memcache->set("k{$i}", "abcdefghijklmnopqrstuvwxyz");
}
$end = microtime(true);
print($end - $start);// 0.07976508140564

さすがメモリにしかデータがないだけあって爆速だ。

Tokyo Tyrantを使ってみる

仕事で使うかもしれないので一応やってみる。

■インストール

wget http://fallabs.com/tokyocabinet/tokyocabinet-1.4.46.tar.gz
wget http://fallabs.com/tokyotyrant/tokyotyrant-1.1.41.tar.gz
tar xvzf tokyocabinet-1.4.46.tar.gz
tar xvzf tokyotyrant-1.1.41.tar.gz
cd tokyocabinet-1.4.46
./configure
make
make install
cd ../tokyotyrant-1.1.41
./configure

エラー1

tokyo cabinetが先にインストールされていないと以下のエラーがでる。

checking for tcutil.h... no
configure: error: tcutil.h is required
make
make install

ちょっと動かしてみる。

ttserver

■PHPから使う

pecl install tokyo_tyrant-beta
cp /etc/php.d/curl.ini /etc/php.d/tt.ini

元の記述を削除して、以下の記述に書き換える。

extension=tokyo_tyrant.so

■ベンチマーク

以下のコードを使用して簡単にベンチマークしてみた。

$start = microtime(true);
$tt    = new TokyoTyrant("localhost");
for($i = 0; $i < 10000; $i++){
    $tt->put("k{$i}", "abcdefghijglmnopqrstuvwxyz");
}
$end = microtime(true);
print($end - $start);//0.65114498138428

ベンチマークをしておいて言うのもオカシイが、データストアにおいて全く同じ条件というものは再現できないので単純に比較してはならない。用途に応じた選択が必要である。

CentOSにCassandraをインストールする

■インストール

以下のコマンドでインストールした。

wget http://ftp.riken.jp/net/apache//cassandra/0.6.8/apache-cassandra-0.6.8-bin.tar.gz
tar -xvzf apache-cassandra-0.6.8-bin.tar.gz
cd apache-cassandra-0.6.8/bin

管理

素敵に管理したいので以下のコマンドを実行する。

mkdir /usr/local/apache-cassandra-0.6.8
mv apache-cassandra-0.6.8 /usr/local/
ln -s /usr/local/apache-cassandra-0.6.8/ /usr/local/cassandra

■起動

以下のコマンドで起動する。

./cassandra -f

実は起動するだけならすごく簡単だ。PHPから扱えるようにしたりするのが難しい

参考

起動シェルスクリプトなどがあるので必要な場合は。。。

CentOSにCouchDBをインストールしてみる

■インストール

epelを使ってyumする。

wget http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
rpm -Uvh epel-release-5*.rpm

インストール。

yum --enablerepo=epel install couchdb

■設定

vi /etc/couchdb/local.ini

ローカルホスト以外のアクセスを許可する。必要なければパス。

;port = 5984
;bind_address = 127.0.0.1
bind_address = 0.0.0.0

■起動

以下のコマンドで起動する。

/etc/init.d/couchdb start

■アクセス

http://192.168.11.3:5984/にアクセスしてみる。

{"couchdb":"Welcome","version":"0.10.2"}

できた!(*゚▽゚)ノ

■Futon

http://192.168.11.3:5984/_utils/にアクセスするとGUIでブラウザからDBを操作できる。

futon capture

MapReduceのfunctionをjsで記述できたりレプリケーションが簡単にできたりで楽しみなDBだ。

ThriftをインストールしてPHPからCassandraを使う

ThriftでPHPからCassandraが扱えるらしいぞ((o(´∀`)o))ワクワク

■ソースの入手と解凍

wget http://www.meisei-u.ac.jp/mirror/apache/dist//incubator/thrift/0.4.0-incubating/thrift-0.4.0.tar.gz
tar zxvf thrift-0.4.0.tar.gz

■前準備

cd thrift-0.4.0
./configure

エラー1

configureの途中で以下の様なエラーがでた。

checking for boostlib >= 1.33.1... configure: error: We could not detect the boost libraries (version 1.33 or higher). If you have a staged boost library (still not installed) please specify $BOOST_ROOT in your environment and do not give a PATH to --with-boost option.  If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation.
対処1

boostlib1.33.1以上が必要らしいので以下のコマンドでインストールする。

yum install boost-devel

■インストール

make
make install

エラー2

makeの途中で以下の様なエラーがでた。

BUILD FAILED
/home/admin/thrift-0.4.0/lib/java/build.xml:96: Class org.apache.tools.ant.taskdefs.ConditionTask doesn't support the nested "typefound" element.
対処1

antのバージョンがイカンらしい。(;>_<;)

As you mention, there is no package for ant 1.7.1 on RHEL 5. Until the Hadoop build is fixed to work on ant 1.6 (which will likely not happen soon if ever), you will need to:

  1. Download the Apache Ant 1.7.1 tarball
  2. Extract it
  3. Setup the environment variable ANT_HOME to point to the location you extracted the tarball
  4. Add $ANT_HOME/bin to the front of your $PATH

以下のサイトを参考にソースからインストールする。

他にもインストールに必要なライブラリがあるらしいのでインストール。

yum install libtool
yum install flex
yum install bison
yum install ruby-devel
yum install libevent-devel

再チャレンジする!

make clean
./configure
make
make install

確認してみる。

thrift -version
Thrift version 0.4.0

キタ━━━━(゚∀゚)━━━━!!

■PHPから使う準備

Cassandraの場所を確認

cassandraの場所を忘れたので確認する。

whereis cassandra
cassandra: /usr/local/cassandra

モジュールを生成

以下のコマンドを実行するとPHP用のモジュールが生成される。

cp /usr/local/cassandra/interface/cassandra.thrift /home/admin/module/cassandra.thrift
thrift --gen php /home/admin/module/cassandra.thrift
ls /home/admin/module/gen-php/cassandra
Cassandra.php  cassandra_constants.php  cassandra_types.php

Thriftのphp用ライブラリをコピー

cp -r /home/admin/thrift-0.4.0/lib/php/src/* /home/admin/gen-php/cassandra/

■PHPから使う

いよいよだ。

ディレクトリ構成

  • ext
  • packages
  • protocol
  • server
  • transport
  • autoload.php
  • Thrift.php

packages/cassandraの中に以下の3ファイルが含まれる。

  • Cassandra.php
  • cassandra_constants.php
  • cassandra_types.php

データの登録

以下のようにしてCassandraにデータを登録することができる。

<?php
require_once 'cassandra/Thrift.php';
require_once 'cassandra/protocol/TBinaryProtocol.php';
require_once 'cassandra/transport/TSocket.php';
require_once 'cassandra/transport/TBufferedTransport.php';
require_once 'cassandra/packages/cassandra/Cassandra.php';
require_once 'cassandra/packages/cassandra/cassandra_types.php';

$socket    = new TSocket('192.168.11.3', 9160);
$transport = new TBufferedTransport($socket, 1024, 1024);
$protocol  = new TBinaryProtocolAccelerated($transport);
$client    = new CassandraClient($protocol);
$transport->open();

// set column path
$columnPath = new cassandra_ColumnPath();
$columnPath->column_family = 'Standard1';
$columnPath->column        = 'column';

// set value
$client->insert(
    'Keyspace1',
    'key',
    $columnPath,
    'value',
    time(),
    cassandra_ConsistencyLevel::ONE
);

// close
$transport->close();

データの取得

以下のようにして指定したキーを値を得ることができる。

<?php
require_once 'cassandra/Thrift.php';
require_once 'cassandra/protocol/TBinaryProtocol.php';
require_once 'cassandra/transport/TSocket.php';
require_once 'cassandra/transport/TBufferedTransport.php';
require_once 'cassandra/packages/cassandra/Cassandra.php';
require_once 'cassandra/packages/cassandra/cassandra_types.php';
$socket    = new TSocket('192.168.11.3', 9160);
$transport = new TBufferedTransport($socket, 1024, 1024);
$protocol  = new TBinaryProtocolAccelerated($transport);
$client    = new CassandraClient($protocol);
$transport->open();

// set column path
$columnPath = new Cassandra_ColumnPath();
$columnPath->column_family = 'Standard1';
$columnPath->column        = 'column';

// search
$result = $client->get(
    'Keyspace1',
    'key',
    $columnPath,
    null,
    Cassandra_ConsistencyLevel::ONE
);

// close
$transport->close();

// get the result
$data = $result->column->value;
var_dump($data);//value

■ベンチマーク

以下のコードで簡単にベンチマークしてみた。

<?php
require_once 'cassandra/Thrift.php';
require_once 'cassandra/protocol/TBinaryProtocol.php';
require_once 'cassandra/transport/TSocket.php';
require_once 'cassandra/transport/TBufferedTransport.php';
require_once 'cassandra/packages/cassandra/Cassandra.php';
require_once 'cassandra/packages/cassandra/cassandra_types.php';

$socket    = new TSocket('192.168.11.5', 9160);
$transport = new TBufferedTransport($socket, 1024, 1024);
$protocol  = new TBinaryProtocolAccelerated($transport);
$client    = new CassandraClient($protocol);
$transport->open();

// set column path
$columnPath = new cassandra_ColumnPath();
$columnPath->column_family = 'Standard1';
$columnPath->column        = 'column';

// set value
$start = microtime(true);
for($i = 0; $i < 1000; $i++){
    $client->insert(
        'Keyspace1',
        'key',
        $columnPath,
        'abcdefghijklmnopqrstuvwxyz',
        time(),
        cassandra_ConsistencyLevel::ONE
    );
}
$end = microtime(true);
print($end - $start);// 0.7892119884491

// close
$transport->close();

1回目の計測値だけ倍程度の時間がかかったが2回目以降は安定して上述の時間と変わらないような処理時間であった。また、他のKVSのベンチマークと単純に比較できない理由として以下のように考えた。

  • Cassandraはテーブルのような高次元のデータ構造を持っている点
  • 今回、CassandraにはPHPで記述されたライブラリを経由してアクセスしている点

ベンチマークをしておいて言うのもオカシイが、データストアにおいて全く同じ条件というものは再現できないので単純に比較してはならない。用途に応じた選択が必要である。

PHPとRedisで登録フォームとログインフォームを作ってみる

5分位で書いてみた。セキュリティもログイン状態の維持も気にしてない。ただ概念上のサンプルとして書いておく。(ヽ´ω`)

■登録フォーム

<?php
if($_SERVER['REQUEST_METHOD'] ==='POST'){
    $redis = new Redis();
    $redis->connect('localhost', 6379);
    if($redis->setnx(trim($_POST['name']), md5(trim($_POST['pass'])))){
        $msg = 'registered!';
    }
    else{
        $msg = 'not registered!';
    }
}
else{
        $msg = 'Input!';
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>登録フォーム</title>
</head>

<body>
<form action="./register.php" method="post">
<p><?php print($msg); ?></p>
<dl>
<dt>name</dt>
<dd><input type="text" name="name" /></dd>
<dt>pass</dt>
<dd><input type="password" name="pass" /></dd>
</dl>
<p><input type="submit" name="submit" value="submit" /></p>
</form>
</body>
</html>

■ログインフォーム

<?php
if($_SERVER['REQUEST_METHOD'] ==='POST'){
    $redis = new Redis();
    $redis->connect('localhost', 6379);
    if($value = $redis->get(trim($_POST['name']))){
        if($value === md5(trim($_POST['pass']))){
            $msg = 'Login!';
        }
        else{
            $msg = 'Wrong!(pass)';
        }
    }
    else{
        $msg = 'Wrong!(name)';
    }
}
else{
        $msg = 'Input!';
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ログインフォーム</title>
</head>

<body>
<form action="./login.php" method="post">
<p><?php print($msg); ?></p>
<dl>
<dt>name</dt>
<dd><input type="text" name="name" /></dd>
<dt>pass</dt>
<dd><input type="password" name="pass" /></dd>
</dl>
<p><input type="submit" name="login" value="login" /></p>
</form>
</body>
</html>

すごく色々考えるとGAEが最強な気がする。

Redisをインストールする

■インストール

wget http://redis.googlecode.com/files/redis-1.2.6.tar.gz
tar xvzf redis-1.2.6.tar.gz
cd redis-1.2.6
make

make完了!

エラー

以下のようなエラーが出るかもしれない。

cc -c -std=c99 -pedantic -O2 -Wall -W -g -rdynamic -ggdb   adlist.c
make: cc: コマンドが見つかりませんでした
make: *** [adlist.o] エラー 127
対策

gccのインストールだ。

yum install gcc

/usr/local/libに移動することにした。

mv redis-1.02 /usr/local/lib/redis-1.02
mv redis-1.2.6 /usr/local/lib/redis-1.2.6
ln -s /usr/local/lib/redis-1.2.6/ /usr/local/lib/redis

■操作

起動

以下のコマンドでRedisサーバが起動する。

/usr/local/lib/redis/redis-server

操作

以下のコマンドでRedisを操作する。

/usr/local/lib/redis-cli set mykey somevalue
#OK
/usr/local/lib/redis-cli get mykey
#somevaalue

停止

以下のコマンドでRedisを停止できる。

/usr/local/lib/redis-cli shutdown

redis-2.4.16

久しぶりにインストールしてみたら結構変わっていたのでメモしておく。

wget http://redis.googlecode.com/files/redis-2.4.16.tar.gz
tar xvzf redis-2.4.16.tar.gz
cd redis-2.4.16
make
make test
sudo make install
sudo ./install_server.sh

インストールスクリプトを実行すると以下のようになる。

Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379] 
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] 
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] 
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] 
Selected default - /var/lib/redis/6379
which: no redis-server in (/sbin:/bin:/usr/sbin:/usr/bin)
Please select the redis executable path [] /usr/local/bin/redis-server
which: no redis-cli in (/sbin:/bin:/usr/sbin:/usr/bin)
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!

大体デフォルトで大丈夫だが、redis-serverのパスだけ指定する必要がある。このスクリプトを実行すると起動まで行うがちょっと余計なお世話。

/etc/redis/6379.conf

パスワードを設定するには以下のディレクティブを使う。

requirepass "hogehoge"

■PHPからの使用

phpredis

http://github.com/owlient/phpredis

phpizeが必要になるかもしれないがインストールされていないかもしれない。そんな時は以下のコマンドを実行する。

yum install php-devel

以下のコマンドを実行するとインストールできる。

wget http://github.com/owlient/phpredis/tarball/master
tar xvzf owlient-phpredis-1.2.0-46-g66ac97b.tar.gz
cd owlient-phpredis-66ac97b/
phpize
./configure
make
make install

以下のように表示されるが、まだ使用不可能である。

Installing shared extensions:     /usr/lib/php/modules/

ちゃんとPHPに組み込む。

cp /etc/php.d/dbase.ini /etc/php.d/redis.ini

/etc/php.d/redis.iniには以下のように記述する。

; Enable redis extension module
extension=redis.so

apacheを再起動する。

/etc/init.d/httpd restart

以下のコマンドを実行して確かめる。

php -r 'var_dump(get_declared_classes());'
array(54) {
  [0]=>
  string(8) "stdClass"
  [1]=>
  string(9) "Exception"
  [2]=>
  string(14) "ErrorException"
  [3]=>
  string(11) "LibXMLError"
  [4]=>
  string(22) "__PHP_Incomplete_Class"
  [5]=>
  string(15) "php_user_filter"
  [6]=>
  string(9) "Directory"
  [7]=>
  string(16) "SimpleXMLElement"
  [8]=>
  string(25) "RecursiveIteratorIterator"
  [9]=>
  string(16) "IteratorIterator"
  [10]=>
  string(14) "FilterIterator"
  [11]=>
  string(23) "RecursiveFilterIterator"
  [12]=>
  string(14) "ParentIterator"
  [13]=>
  string(13) "LimitIterator"
  [14]=>
  string(15) "CachingIterator"
  [15]=>
  string(24) "RecursiveCachingIterator"
  [16]=>
  string(16) "NoRewindIterator"
  [17]=>
  string(14) "AppendIterator"
  [18]=>
  string(16) "InfiniteIterator"
  [19]=>
  string(13) "EmptyIterator"
  [20]=>
  string(11) "ArrayObject"
  [21]=>
  string(13) "ArrayIterator"
  [22]=>
  string(22) "RecursiveArrayIterator"
  [23]=>
  string(11) "SplFileInfo"
  [24]=>
  string(17) "DirectoryIterator"
  [25]=>
  string(26) "RecursiveDirectoryIterator"
  [26]=>
  string(13) "SplFileObject"
  [27]=>
  string(17) "SplTempFileObject"
  [28]=>
  string(17) "SimpleXMLIterator"
  [29]=>
  string(14) "LogicException"
  [30]=>
  string(24) "BadFunctionCallException"
  [31]=>
  string(22) "BadMethodCallException"
  [32]=>
  string(15) "DomainException"
  [33]=>
  string(24) "InvalidArgumentException"
  [34]=>
  string(15) "LengthException"
  [35]=>
  string(19) "OutOfRangeException"
  [36]=>
  string(16) "RuntimeException"
  [37]=>
  string(20) "OutOfBoundsException"
  [38]=>
  string(17) "OverflowException"
  [39]=>
  string(14) "RangeException"
  [40]=>
  string(18) "UnderflowException"
  [41]=>
  string(24) "UnexpectedValueException"
  [42]=>
  string(16) "SplObjectStorage"
  [43]=>
  string(19) "ReflectionException"
  [44]=>
  string(10) "Reflection"
  [45]=>
  string(18) "ReflectionFunction"
  [46]=>
  string(19) "ReflectionParameter"
  [47]=>
  string(16) "ReflectionMethod"
  [48]=>
  string(15) "ReflectionClass"
  [49]=>
  string(16) "ReflectionObject"
  [50]=>
  string(18) "ReflectionProperty"
  [51]=>
  string(19) "ReflectionExtension"
  [52]=>
  string(5) "Redis"
  [53]=>
  string(14) "RedisException"
}

(^○^)お!(^□^)め!(^◇^)で!(^▽^)と!(^・^)う!

サンプルコード
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

■起動スクリプト

/usr/local/lib/redis/redis.conf

Redisはデフォルトではデーモンとして動作しないので、設定ファイルを以下のように編集する。

daemonize yes

スクリプト

http://blog.fulltext-search.biz/archives/2010/04/redis-server-initialize-script-for-centos.html

■ベンチマーク

ちょっとだけMySQLと比較してみる。テーブルはInnoDBでカラムはid, valueの2つである。

$start = microtime(true);
$dbh = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('benchmark', $dbh);
for($i = 0; $i < 10000; $i++){
    mysql_query("INSERT INTO `list`(`value`) VALUES('abcdefghijklmnopqrstuvwxyz')");
    print($i . "\n");
}
$end = microtime(true);
print($end - $start);// 5.5481600761414

10000レコードの挿入を10回繰り返してみた。多少のバラつきはある。

$start = microtime(true);
$redis = new Redis();
$redis->connect('localhost', 6379);
for($i = 0; $i < 10000; $i++){
    $redis->set($i, 'abcdefghijklmnopqrstuvwxyz');
    print($i . "\n");
}
$end = microtime(true);
print($end - $start);// 0.77555513381958

大体1/5~1/8程度の時間で終わるようだ。全く同じ条件というものは再現できないので参考程度。用途に応じた選択が必要である。

参考