###処理速度検証編(2015/6/4追記)
hashを使ってデータを保存されている時の、データ取得速度を、同じデータ構成のmySQLと比較
データ単体取得
$redis->hGet('key','field');
と select field from db_table where id="key"
では、Redisの方が高速に動作するが、複数のデータを取得したい時、
例えば
for($i=0;$i<100;$i++){
$redis->hGet($key,'field');
}
みたいなパターンだと
select `field` from user_data where uid>=0 and uid<100;
の方が高速でした。
###expire編(2015/6/3追記)
phpredis - github を見ても、expire()みたいなメソッドは存在しない??
どうやら
$redis->set('x', '42');
$redis->setTimeout('x', 3); // x will disappear in 3 seconds.
とか
$redis->set('x', '42');
$now = time(NULL); // current timestamp
$redis->expireAt('x', $now + 3); // x will disappear in 3 seconds.
といった様なメソッドが用意されているみたい。(動作未検証)
setTimeout()
はミリ秒ではなく「秒」ってのが注意点かな。
expireAt()
はUNIXtimeを指定できるのは便利そう。今日の24時までとか、簡単に設定出来ちゃいますね。
###HASH型編
HASHの主キー(便宜上そう呼びます)の 末尾に数字が使えない
使えました 'key:1'
のように、コロンを挟む必要があったようです
$redis->hSet('key1','mykey','test');//false
どうやら副キー(フィールド?)には使えるみたいです。
$redis->hSet('key','mykey1','test');//true
####コネクションの使い回し編
class RedisManager extends Redis{
public function __construct($is_master,$db_number=0) {
if($is_master){
parent::__construct();
$this->pconnect(Conf::$redis_m_host,Conf::$redis_m_port);
$this->select($db_number);
}else{
parent::__construct();
$this->pconnect(Conf::$redis_s_host,Conf::$redis_s_port);
$this->select($db_number);
}
return $this;
}
}
色々と突っ込みどころのあるソースですが、やりたいこととしては、
1.newした時点でコネクションを開いて、DB選択までやりたい
2.一度の処理で二度も三度もnewするかもしれないので、コネクションを使いまわしたい
(一度の処理でいくつもコネクション開いちゃダメ・・・だよね・・・?)
という事なのですが、上記のコードではエラーが発生します。
Redis server went away
とのこと。
高度なテクニックを持っていなかったので、下記の様に
class RedisManager extends Redis{
private $is_master;
private $is_connected = false;
public $db_number;
public function __construct($is_master,$db_number=0) { //オーバーライド
$this->is_master = $is_master;
$this->db_number = $db_number;
if($is_master){
parent::__construct();
}else{
parent::__construct();
}
return $this;
}
public function connect() { //オーバーライド
if(!$this->is_connected){
if($this->is_master){
parent::connect(Conf::$redis_m_host,Conf::$redis_m_port);
parent::select($this->db_number);
$this->is_connected = true;
}else{
parent::connect(Conf::$redis_s_host,Conf::$redis_s_port);
parent::select($this->db_number);
$this->is_connected = true;
}
}
return $this;
}
}
使う時は
$redis_master = new RedisManager(true); //こんな感じでnewしておいて
$redis_master->connect()->hGet('aaa','bbb');
$redis_master->connect()->hGet('xxx','yyy'); //こんな感じで使います。
これだと繰り返し使ってもエラー出ませんでした。