LoginSignup
13
16

More than 5 years have passed since last update.

PHPでRedisを使うメモ

Last updated at Posted at 2015-05-29

処理速度検証編(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'); //こんな感じで使います。

これだと繰り返し使ってもエラー出ませんでした。

13
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
16