【CentOS】Redis

ちょっと興味があったので使ってみた。
memcachedの揮発しない版だと思ってたが、
予想以上に多機能過ぎた・・・。
DBなので当たり前といえば当たり前な気もする・・・・。


【redisをインストール】
remiリポジトリを使うので、設定しておくこと。
# yum -y install redis


【redisの設定】
/etc/redis.confで設定する。
ポイントとなりそうなものをまとめる。

                                              • -

//最低1回、キーの変更が発生すると、900秒後に保存する
//最低10回、キーの変更が発生すると、300秒後に保存する
//最低10,000回、キーの変更が発生すると、60秒後に保存する
save 900 1
save 300 10
save 60 10000

//認証設定
requirepass foobared

//最大接続数
maxclients 10000

//最大使用可能メモリ
//redisはオンメモリでデータを保持するので、ここで指定された容量以上は保持できない。
//保持できない場合はmaxmemory-policyの設定通りにデータを削除していく。
maxmemory 500MB

//LRUアルゴリズムを使用し、期限切れになったセットのキーを削除
maxmemory-policy volatile-lru

//redisは非同期でデータをディスクに保存するが、それを同期的にする。
//同期的にすることで、redisがクラッシュしてもディスクのデータからリカバリが可能。
appendonly no

                                              • -

設定したら、再起動する。
# /etc/init.d/redis restart

redisはコマンドラインで実行できるので、
redisは多機能なので、最初は慣れるためにコマンドラインで遊んでみるといい。
以下のコマンドで起動できる。
# redis-cli

コマンドは公式リファレンスを見ればいい。


PHPクライアントをインストール】
phpizeコマンドを使えるようにする
#yum -y install php-devel

クライアントは phpredis を使う。
公式githubからソースをDLし、インストールする。
インストール方法は公式githubに書いてある。
https://github.com/nicolasff/phpredis

# phpize
# cd phpredis-master
# ./configure
# make
# make install

php.ini に 「extension=redis.so」を追記する。

Apache or php-fpm を再起動。


【redis概要】
・KVS
・データ型が5つある。
・各キーには有効期限を設定できる。
・任意のデータベースを選択して利用することができる。
・オンメモリだが、永続化ができる。
トランザクションがある。
・ソートコマンドでソートできる。


【サポートするデータ型】
1.文字列型(key, value)
普通のkey-valueデータ。
バイナリセーフなので、画像データなど何でも格納できる。

2.リスト型(key, array(value, value, value))
1つのキーに配列を持つイメージ。
配列の先頭 or 末尾に値を挿入したりできる。

3.セット型(key, array(value1, value3, value2))
リスト型 + データ順不同 + 重複データがダメ。

4.ソート済みセット型(key, array(array(score, value), array('score', 'value')))
セット型にデータをscoreによってデータをソートする機能が付いたもの。
scoreによる範囲検索も可能。

5.ハッシュ型(key, field, value)
keyが2つある文字列型。
例えば、ユーザーIDが100のユーザーのパスワードと最終ログイン日を以下のように2レコードで保存できる。
(100, password, my_password)
(100, last_login_date, 2013-09-23)



【phpredisを使う】
・接続
$redis = new Redis();
$redis->pconnect('127.0.0.1', 6379);
$redis->auth('pass'); //認証がある場合
$redis->select(1); //DB1を選択

・各データ型の共通操作
$redis->exists('key'); //return true or false
$redis->delete('key');
$redis->delete(array('key1', 'key2'));
$redis->setTimeout('key', 3); //有効時間(秒)
$redis->save(); //ディスクに保存。保存中はクライアントとの接続ができない。
$redis->bgsave(); //バックグラウンドでディスクに保存。クライアントと接続できる。


・文字列型の操作
$redis->get('key');
$redis->set('key', 'value');
$redis->setex('key', 3600, 'value'); //3600秒保存する
$redis->setnx('key', 'value'); //keyが存在してなければ保存しない
$redis->mGet(array('key1', 'key2', 'key3')); //複数取得。array('value1', 'value2', 'value3')
$redis->getSet('key', 'value2'); //keyをvalue2に更新して、前の値を返す。

まとめようとしたけど、多すぎて無理・・・。
公式githubにリファレンスがあるので、それを参照すること。