2017-01-16 224 views
0

我希望将PDO结果存储在redis缓存中,以便从我收集的在线资源中进行操作。Redis缓存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缓存的查询之一,而其他查询包含多个需要多个PDO绑定参数的WHERE语句。

这可能不是最好的方法,所以我可能会问我如何改善这个问题以提高安全性。

回答

0

我在SO上的其他地方看到了这个"Smart" Caching System using PDO and Memcache

将PDO调用包装在一个函数中,该函数将散列语句和参数数组。

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

你还需要问自己,如果微调您的数据库,用正确的索引并使其利用自身的缓存系统不会比缓存来Redis的速度更快。

+0

谢谢。我正在关注教程,所以当它涉及到redis密钥时,我有点厚。我现在只是在userid或groupid等实现其他形式的redis关键散列基础。如你所说,单个mysql查询的缓存效率不高。但是现在感谢您的代码,我只是将整个请求(可能包含15-20个mysql查询)缓存到redis-cache中的一个json字符串中以便快速访问。 –