Redis缓存MYSQL结果

时间:2017-01-16 17:46:20

标签: caching redis analytics

我希望将PDO结果存储在redis缓存中,以便从我收集的在线资源中执行此操作。

$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语句。

这可能不是最好的方法,所以我可以就如何改进它以使其更安全提出建议。

2 个答案:

答案 0 :(得分:0)

我在其他地方看到了"Smart" Caching System using PDO and Memcache

将PDO调用包含在将对语句和参数数组进行哈希处理的函数中。

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

您还需要问问自己,使用适当的索引微调数据库并让它使用自己的缓存系统不会比缓存到Redis更快。

答案 1 :(得分:0)

撰写$query = $pdo->query($statement);代替$query = $pdo->query($domain);