Php 使用predis在redis中存储mysql查询

Php 使用predis在redis中存储mysql查询,php,mysql,redis,predis,Php,Mysql,Redis,Predis,我想使用redis缓存在redis中存储mysql查询,第一次它按预期工作(因为redis中没有键)并执行查询,但后来$rs=@unserialize($redis->get($key)没有返回任何结果;我尝试了许多解决方案,但没有成功,我的代码如下: require __DIR__ . '/vendor/autoload.php'; Predis\Autoloader::register(); $redis = new Predis\Client(array( "scheme" =&

我想使用redis缓存在redis中存储mysql查询,第一次它按预期工作(因为redis中没有键)并执行查询,但后来
$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;

您需要迭代查询结果,
mysql\u 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;

您需要迭代查询结果,
mysql\u 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;

您应该删除所有被抑制的函数调用,即
@
之前的
mysql\u num\u行
等,以排除这些调用中可能出现的错误。您应该删除所有被抑制的函数调用,即
@
之前的
未序列化
mysql\u num\u行,等等。只是为了排除这些调用中可能出现的错误。您需要在
$data[]=$row
之后添加分号,否则它将生成PHP解析错误。Thanx供您帮助。因此,这基本上是一种不写通的更新方法,非常好。关于如何修改代码并使用它“清除”的任何建议任何受update、insert、delete(直写方法)影响的查询@OAH理论上,您将对现在已删除/更新的行执行类似的“SELECT”语句查找一旦您执行删除/更新操作。最好您知道应用程序使用的确切查找查询,因为这会降低清除/刷新的复杂性。该过程将根据您正在执行的操作对缓存结果执行删除/更新。如果您需要帮助,请在您完成att后发布新问题清空了一些东西,如果你有任何问题!@segFault我会尝试一下,并会让你知道。Thx一吨提示:)你需要在
$data[]=$row
之后添加分号,否则它将生成PHP解析错误。Thanx非常感谢您的帮助,所以基本上这是一种不写通的更新方法,非常好。关于如何修改代码并使用它“清除”受更新、插入、删除(直写方法)影响的任何查询的任何建议@OAH理论上,您将在执行删除/更新操作后立即对现在已删除/更新的行执行类似的“SELECT”语句查找。您最好知道应用程序使用的确切查找查询,因为这样可以减少清除/刷新的复杂性。该进程将根据您正在执行的操作对缓存的结果执行删除/更新。如果你在这方面需要帮助,请在你尝试了类似的事情之后,如果你有任何问题,请发布一个新的问题@我会试试看,一定会让你知道的。小费一吨泰铢:)