2017-01-16 217 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字符串中以便快速訪問。 –