2014-11-04 2 views
0

Каким образом можно кэшировать несколько запросов с memcached в PHP? Предположим, что страница выполняет два запроса для рендеринга, нужно ли использовать два отдельных ключа и дважды получить доступ к $memcache?Кэширование нескольких запросов с memcached

Вот пример:

$id = $_POST["id"]; 
    $memcache = new Memcache; 
    $memcache->connect('localhost', 11211) or die ("Could not connect"); 

    $dbh = new PDO("mysql:host=$hostname;dbname=$databasename", $username, $password); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    $key1 = "{$id}1"; 
    $key2 = "{$id}2"; 

    $cache_result = array(); 
    $cache_result = $memcache->get($key); 
    $cache_result2 = array(); 
    $cache_result2 = $memcache->get($key2); 

    if($cache_result || $cache_result2) 
    { 
    $rows =$cache_result; 
    $rows2 = $cache_result2; 
    } 
    else 
    { 
    $sql = "call load_this(?);"; 
    $users = $dbh->prepare($sql); 
    $users->bindValue(1, 1, PDO::PARAM_INT); 
    $users->execute(); 
    $rows = $users->fetchAll(PDO::FETCH_ASSOC); 
    $memcache->set($key, $rows, MEMCACHE_COMPRESSED, 1200); 

    $sql = "Call load_that(?)"; 
    $users = $dbh->prepare($sql); 
    $users->bindValue(1, 2, PDO::PARAM_INT); 
    $users->execute(); 
    $rows2 = $users->fetchAll(PDO::FETCH_ASSOC); 
    $memcache->set($key2, $rows2, MEMCACHE_COMPRESSED, 1200); 

    print "NOT_CACHED"; 
    } 
+0

"Мне нужно использовать два отдельных ключа и дважды получить $ memcache" --- это зависит. Вы хотите сохранить их отдельно или вместе? – zerkms

+0

@zerkms Мне нужно перебирать «rows» и «rows2» отдельно, поэтому, я думаю, я не могу хранить их в одном ключе. – RedGiant

+1

вы можете. Просто поместите их в один массив. – zerkms

ответ

1

Вы можете сделать это, как вы ...

Если они будут кэшируются в то же время, вы можете просто сделать это:

$memcache->set('key', array('result1' => $rows, 'result2' => $rows2), MEMCACHE_COMPRESSED, 1200); 

Это кэширует оба результата в одном и том же объекте и потребует меньше вызовов memcached, но различная производительность не будет иметь смысла.

+0

Thak you. Я это попробую. Как получить данные? $ Memcache-> Get ('result1'); ? – RedGiant

+0

Нет, вы будете использовать один ключ, в моем примере это будет get ('key'); Это вернет массив, содержащий оба ваших результата. –

Смежные вопросы