【问题标题】:store mysql query in redis using predis使用predis在redis中存储mysql查询
【发布时间】:2016-01-03 14:42:01
【问题描述】:

我想用redis缓存在redis中存储mysql查询,第一次按预期工作(因为redis中没有key)并执行查询,但后来$rs = @unserialize( $redis->get($key)什么也没返回;我尝试了很多解决方案,但没有运气,我的代码如下:

require __DIR__ . '/vendor/autoload.php';
Predis\Autoloader::register();

$redis = new Predis\Client(array(
    "scheme" => "tcp",           
    "host" => "127.0.0.1",       
    "port" => 6379,              
    "password" => "testRedis")); 

$sql="SELECT * FROM news where status=1 and (title like \"%$sword%\" or body like \"%$sword%\" or name like \"%$sword%\" or rss like \"%$sword%\")";

$key = "sql_cache:" . md5($sql);

if ($rs = @unserialize( $redis->get($key) ) === false){ 

    $rs = mysql_query($sql)or die(mysql_error());       

    // Put data into cache for 1 hour                   
    $redis->set($key, serialize($rs));                  
    $redis->expire($key, 3600);                           
}                                                       
echo 'rs= '.$rs;                                   
$nr = @mysql_num_rows($rs);                             
echo "Number of rows: " . $nr;

【问题讨论】:

  • 您应该删除所有被抑制的函数调用,即。 @ 前面的 unserializemysql_num_rows 等只是为了排除这些调用可能存在的错误。

标签: php mysql redis predis


【解决方案1】:

您需要遍历查询结果,mysql_query 返回的资源无法序列化。

你可以试试这样的:

$key = "sql_cache:" . md5($sql);
// If $key exists get and unserialize it, otherwise set $data to empty array
$data = $redis->exists($key) 
    ? unserialize($redis->get($key)) 
    : array();

if (empty($data)) { 
    $rs = mysql_query($sql);       
    if ($rs === false) {
        die(mysql_error());
    }
    // Iterate through results...
    while ($row = mysql_fetch_assoc($rs)) {
        $data[] = $row;
    }

    // Put data into cache for 1 hour                   
    $redis->set($key, serialize($data));                  
    $redis->expire($key, 3600);                           
}                                                       
echo 'data= '.$data;                                   
$nr = count($data);                             
echo "Number of rows: " . $nr;

【讨论】:

  • $data[] = $row后面需要加分号,否则会产生PHP解析错误。感谢您的帮助
  • 所以基本上这是一个非常好的更新的无写入方法。关于如何修改代码并使用它来“清除”受更新、插入、删除影响的任何查询的任何建议(直写方法)
  • @OAH 理论上,只要执行删除/更新操作,您就会对现在删除/更新的行执行类似的“SELECT”语句查找。您最好知道您的应用程序使用的确切查找查询,因为这会降低清除/刷新的复杂性。该过程将根据您正在执行的操作对缓存结果执行删除/更新。如果您需要这方面的帮助,请在您尝试过相关操作后发布一个新问题,如果您有任何问题!
  • @segFault 我会试一试,一定会让你知道的。谢谢你的小费:)
猜你喜欢
  • 2014-07-13
  • 1970-01-01
  • 2023-03-17
  • 2016-05-14
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多