Memcache & Mysqli подготовил постановку задачи - PullRequest
0 голосов
/ 03 июля 2011

проверьте код ниже, у меня следующая проблема: последние два параметра являются динамическими в выражении SQL, как я могу сделать так, чтобы memcache получал правильные параметры и не только? ?, который показывает мне только? Добавление второй переменной $ sql1 = "SELECT id title vtext FROM tpost ORDER BY id desc LIMIT $ var1, $ var2"; ? Или дает лучшее решение?

$sql = "SELECT id, title, vtext FROM tpost ORDER BY id desc LIMIT ?, ?";
$content = $memcache->get($sql);

if($content == null) {
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param('ii', $offset, $rowsperpage);
    $stmt->execute();
    $stmt->bind_result($r_id, $r_title, $r_vtext); 
    while ($stmt->fetch()) {
        $data[] = array( 'id' => $r_id, 'title' => $r_title, 'vtext' => $r_vtext);
    }
    $stmt->close(); 

    $memcache->set($sql,$data,0,$cache_time);

}

Спасибо за вашу помощь

Ответы [ 2 ]

1 голос
/ 05 июля 2011
$sql = "SELECT id, title, vtext FROM tpost ORDER BY id desc LIMIT ?, ?";
$key = "SELECT id, title, vtext FROM tpost ORDER BY id desc LIMIT $r_title, $r_vtext";
$content = $memcache->get($sql);

if($content == null) {
 $stmt = $mysqli->prepare($sql);
 $stmt->bind_param('ii', $offset, $rowsperpage);
 $stmt->execute();
 $stmt->bind_result($r_id, $r_title, $r_vtext); 
 while ($stmt->fetch()) {
    $data[] = array( 'id' => $r_id, 'title' => $r_title, 'vtext' => $r_vtext);
 }
 $stmt->close(); 

 $memcache->set($key,$data,0,$cache_time);

}
0 голосов
/ 06 июля 2011

Неправильно использовать полные запросы SQL в качестве ключа. Сделайте уникальный идентификатор или хотя бы хешите его. Причина в том, что когда вы увеличиваете масштаб, чем больше ваш ключ, тем медленнее совпадение и скорость передачи данных (1000 м / с на сервер memcache с маленьким ключом быстрее, чем те же 1000 р / с с большим ключом:)).

Также данные могут быть нулевыми, не стоит проверять это и снова попадать в SQL-запрос, если пользователь запрашивает выход за пределы диапазона.

            // Generate key
    $key = 'recent:'. $offset .':'. $rowsperpage;

    // If nothing found within cache instance, retrieve and set it
    if(!$data = $memcache->get($key)) {
        $sql = "SELECT `id`, `title`, `vtext` 
                 FROM `tpost` 
             ORDER BY `id` DESC LIMIT ?, ?";

        $stmt = $this->$mysqli->prepare($sql);
        $stmt->bind_param('ii', $offset, $rowsperpage);

        // Retrieve result set
        if($stmt->execute()) {
            $data = array();
            $stmt->bind_result($r_id, $r_title, $r_vtext); 
            while ($stmt->fetch()) {
                $data[] = array(
                                'id' => $r_id,
                                'title' => $r_title,
                                'vtext' => $r_vtext);
            }
        }

        $stmt->close(); 

        // Set cache entry
        $memcache->set($key, $data, 0, $cache_time);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...