2017-01-16 10 views
0

私はこれを行うために収集したオンラインリソースからPDO結果をredis cacheに保存したいと考えています。Redis Cache MYSQLの結果

$domain = 'www.example.com'; 



function getStat($domain) { 
global $pdo; 
global $redis; 

$statement = "SELECT * FROM mc_visitor_session WHERE website = \'$domain\'"; 

$hash = md5($statement); 

if (!$redis->get($hash . '-cache')) { 

      $query = $pdo->query($domain); 

      if ($result = $query->execute()) { 

       $record = $query->fetchAll(\PDO::FETCH_ASSOC); 
       $redis->set($hash . '-cache', serialize($record)); 
       $redis->expire($hash . '-cache', 86400); 

       echo 'RESULT FROM MYSQL'; 
       pretty_print($record); 
      } 

     } 

     $results = unserialize($redis->get($hash . '-cache')); 
     //will show this if it's already in cache. 
     echo 'RESULT FROM REDIS'; 
     pretty_print($results); 
} 


    getStat($domain); 

上記のコードがうまくいきます。しかし、私はpdoの準備ステートメントではなく、pdoクエリを使用して、クエリを準備し安全に実行することなく、それを使用したいと思っています。しかし、私は、クエリ文からハッシュを取得して、redisのキーとして使用する必要があります。

これは私がredisでキャッシュしたいクエリの1つで、他のクエリには複数のPDOバインドパラメータを必要とするWHERE文が2つ以上含まれています。

これは、これを行う最良の方法ではない可能性があります。これを改善してより安全にする方法の提案をお願いします。

答えて

0

私はこれを見ました"Smart" Caching System using PDO and Memcache他のところにあります。

ステートメントとパラメータの配列をハッシュする関数の中にPDO呼び出しをラップします。

$name = 'querycache-'.md5(serialize(array($sql, $params))); 

また、あなたのデータベースを微調整する場合は、適切なインデックスを使用して、それが独自のキャッシュシステムは、Redisのにキャッシュよりも高速ではありません使用せ、自問する必要があります。

+0

ありがとうございます。私はチュートリアルに従っていたので、レディスキーになるとちょっと厚いです。私はちょうどuseridまたはgroupidなどのredisキーのハッシュベースの他のフォームを実装しています。あなたが言及するように、単一のmysqlクエリのキャッシュは効率的ではありません。しかし、あなたのコードのおかげで、私は速いアクセスのためにredis-cacheの1つのjson文字列に15-20のmysqlクエリで構成されるリクエスト全体をキャッシュするだけです。 –