[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: вопрос по Memcache кешированию
agentor
недавно начал разбирать функции по Memcache кешированию нo возникли вопросы.
как правильно кешировать запрос в Memcache что бы исключить вторичные подключения к Мускулу если сохраннёный ключ ещё действует:
Вот пример того что я собрал

PHP
$memcached = new Memcache();
    $memcached->connect('127.0.0.1', 11211);
    $global_user_curuser = array();

    if (!$global_user_curuser = $memcached->get('global_user_curuser_' . $id)) {
    $global_user_curuser ="
    SELECT us . * ,
    COUNT( messages.receiver ) AS messages_count
    FROM users us
    LEFT JOIN messages ON us.id = messages.receiver AND messages.unread = 'yes'
    WHERE us.id = "
.$id."
    AND us.enabled = 'yes'
    AND us.status = 'confirmed'
    GROUP BY us.id"
;

    $memcached->set('global_user_curuser_' . $id, $global_user_curuser, MEMCACHE_COMPRESSED, 3600)or die ("Failed to save data to Memcache(user_global_curuser)");
    }
    $sql = mysql_query($global_user_curuser);
    $row = mysql_fetch_array($sql);

если имеется кеш, идёт ли подключение к Мускулу или нет? или мне нужно кешировать вместе с mysql_fetch_array(чтро мне не надо)
Хотелось бы только кешированные запросы
например
Кеш = mysql_query(селкт бла бла бла);



Спустя 38 минут, 40 секунд (31.10.2009 - 01:19) glock18 написал(а):
agentor

эммм... ты пытаешься кэшировать текст запроса?

Спустя 18 минут, 53 секунды (31.10.2009 - 01:38) agentor написал(а):
я пробовал вместе с mysql_query кешироват (как мне нужно) но выбивает ошибку
(mysql_fetch_array(): supplied argument is not a valid MySQL result resource in)

Спустя 5 часов, 49 минут, 34 секунды (31.10.2009 - 07:28) Sylex написал(а):
Цитата (glock18 @ 31.10.2009 - 04:19)
ты пытаешься кэшировать текст запроса?



очень клева! ))))

Спустя 5 часов, 25 минут, 17 секунд (31.10.2009 - 12:53) glock18 написал(а):
agentor
На лицо простое непонимание того "что нужно кэшировать". Кэшировать соединение к базе нельзя. Кэшировать ресурсы вообще бесполезно, потому что ресурс, по сути дескриптор (GUID - global unique identifier), представляет собой простое число. Соединение (если говорить о соединение - результат mysql_connect) будет закрыто в любом случае, и после отработки этого скрипта сохраненное число потеряло бы смысл. Впрочем, я думаю, пых сохранять данные типа ресурс вовсе не позволит.

Если не нужно, чтобы соединения каждый раз создавались, то используй mysql_pconnect.

Кэшировать нужно данные. Как вариант, результаты запросов - массив из того, что тебе вернут твои mysql_fetch_assoc. И то резонно только если запрос сам по себе тяжелый для mysql. Как правило, есть возможность сделать его гораздо менее тяжелым простой перестройкой индексов.

Спустя 33 минуты, 31 секунда (31.10.2009 - 13:27) Sylex написал(а):
Цитата (glock18 @ 31.10.2009 - 15:53)
Если не нужно, чтобы соединения каждый раз создавались, то используй mysql_pconnect.


на практике использовал?

Спустя 2 часа, 7 минут, 5 секунд (31.10.2009 - 15:34) Michael написал(а):
Цитата (Sylex @ 31.10.2009 - 10:27)
Цитата (glock18 @ 31.10.2009 - 15:53)
Если не нужно, чтобы соединения каждый раз создавались, то используй mysql_pconnect.


на практике использовал?

Я на локальном сервере использовал rolleyes.gif
Все быстрее.

Спустя 41 минута, 22 секунды (31.10.2009 - 16:15) glock18 написал(а):
Цитата
на практике использовал?

не, сам не юзал сам.

Цитата
Все быстрее.

это относительно, на самом деле. Создание подключения обычно занимает определенное время, не такое чтобы особо маленькое, но mysql может иметь и обычно имеет ограничение на количество подключений. а соединения не удаляются сами. вполне резонно, чтобы mysql сам начнет отстреливать их. при этом убивая не те, которые "отдыхают", а которые "живут" сейчас. по крайней мере, такими вещами надо пользоваться, только хорошо подумав о возможных проблемах. ИМХО, если подключение к базе при определенных условиях не нужно вовсе, то и создавать его не надо (или использовать созданное).

Спустя 26 дней, 11 часов, 45 минут, 44 секунды (28.11.2009 - 04:01) agentor написал(а):
у меня возник вопрос..почему у меня при выводе данных через while () такая ерунда?
Уменя выводит к примеру 5000 записей и все одни и те же...т.е от 1 ID
Неужели он не работает с while ()
вот пример того что я с конструировал для теста

    $gethash = $_GET['info_hash'];
if ($gethash) {
$memcache = new Memcache();
$memcache->connect('127.0.0.1', 11211);

if (!$memcache->get("scrape_hash_".$gethash."")) {
$inserter = mysql_fetch_assoc(mysql_query("SELECT info_hash, times_completed, ders, hers FROM video WHERE info_hash = '".$gethash."'"));

if (!$inserter) {
print('No info hash. 1');
}
$memcache->set("scrape_hash_".$gethash."", $inserter, 0, 90);

} else {
$inserter = $memcache->get("scrape_hash_".$gethash."");
}

}
else{
print('No info hash.');
}

while ($row = $inserter) {
print (" ".hash_pad($row['info_hash'])."");
print (" ".$row['ders']."");
print (" ".$row['times_completed']."");
print (" ".$row['hers']."");
}



может кто подскажет как работать правильно с while () в Мemcache
специалисты по Кешу отзовитесь плиз

Спустя 8 минут, 16 секунд (28.11.2009 - 04:09) kirik написал(а):
Цитата (agentor @ 27.11.2009 - 20:01)
почему у меня при выводе данных через while () такая ерунда?

Может потому что ты в мемкэш данные записываешь не правильно?
$inserter = mysql_fetch_assoc(mysql_query("..."));

достанет только одну, первую строчку из результата запроса.

Спустя 3 минуты, 9 секунд (28.11.2009 - 04:12) agentor написал(а):
hm...интересно..каким образом можно в кеш запихнуть while () результат???

Спустя 8 минут, 27 секунд (28.11.2009 - 04:21) kirik написал(а):
Цитата (agentor @ 27.11.2009 - 20:12)
интересно..каким образом можно в кеш запихнуть while () результат???

Наверное в виде массива? smile.gif

Спустя 7 часов, 48 минут, 41 секунда (28.11.2009 - 12:09) agentor написал(а):
можно пример?

Спустя 9 часов, 25 минут, 9 секунд (28.11.2009 - 21:35) agentor написал(а):
что то по всякому пробовалё..ничего не получается...
пожалуйста кто нить приведите пример функций..

Спустя 7 минут, 3 секунды (28.11.2009 - 21:42) kirik написал(а):
Например так?
$data = array();
while($row = mysql_fetch_assoc($result))
{
$data[] = $row;
}
$memcache->set('key', $data);

Спустя 1 день, 19 часов, 28 минут, 54 секунды (30.11.2009 - 17:11) agentor написал(а):
это сохранение...
а вывод как? у меня выводит пустая страница..как будто сохраннённых данных нет
если такое данные уже сохранены в в виде массива то как теперь их вывести из кеша?
Масив уже нельзя делать? я тут немного запутался
типа такого или что?

If($data) {
print (" ".hash_pad($row['info_hash'])."");
print (" ".$row['ders']."");
print (" ".$row['times_completed']."");
print (" ".$row['hers']."");
}


примного благодарен за помощ

Спустя 27 минут, 58 секунд (30.11.2009 - 17:39) glock18 написал(а):
В общем, с кэшем обычно работа проходит так:

1. проверяем есть ли значение в кэше.
2. если нет, то выбираем из базы.
3. кладем в кэш то, что выбрали.

в случае с базой данных, это как правило результат выборки. популярной выборки, как правило.

$global_user_curuser = $memcached->get('global_user_curuser_' . $id);
if (false === $global_user_curuser) {
// значения нет
// выполняем запрос
// собираем данные в массив, используя mysql_fetch_assoc например
// сохраняем в кэш

$memcached->set('global_user_curuser_' . $id, $global_user_curuser); // флаги на усмотрение ставь
}

// значение есть

Спустя 8 минут, 42 секунды (30.11.2009 - 17:47) agentor написал(а):
если кеш сохранён вместе с массивом. while().каким образом от туда его теперь можно вывести?
чёт я совсем запутался в конец....


$data = array();
while($row = mysql_fetch_assoc($result)){
$data[] = $row;
print (" ".hash_pad($row['info_hash'])."");
print (" ".$row['ders']."");
print (" ".$row['times_completed']."");
print (" ".$data['hers']."");
}
$memcache->set("scrape_hash_".$gethash, $data, 0, 30);
$got ="<b>Работает MYSQL</b><br />";

} else {
$row = array();
$row[] = $memcache->get("scrape_hash_".$gethash);

$got ="<b>Работает Memcache</b><br />";
print (" ".hash_pad($row['info_hash'])."");
print (" ".$row['ders']."");
print (" ".$row['times_completed']."");
print (" ".$data['hers']."");

}
echo "$got";

Спустя 16 минут, 38 секунд (30.11.2009 - 18:04) glock18 написал(а):
как любой другой массив. хоть foreach'ем, хоть whiлами, хоть чем в принципе

Спустя 2 часа, 36 минут, 8 секунд (30.11.2009 - 20:40) agentor написал(а):
короче я незнаю...

объясню ещё раз..

к примеру вы хотите загнать в кеш страницу с новостями, в которой находится 20 Разных новостей,
но так как новости выводятся через массив, то лигически должно идти сохранение всего массива в Кеш со всеми данными этих 20 и новостей.
Теперь после того как сохранили всё добро нужно их вывести из Кеша( если таков имеется) но также в массиве..
Т.е фактически загрузит страницу с новостями из кеша.(или данные на неё)

вот то что вы мне насоветывали.....я всё перерыл...но не работает...страница грузится но как будто данных нету..
Кеш сохранение и.т.д..в рабочем состоянии..перепроверял..

в Мемкеше это называют вро де бы memcache multi get конструкция

может кому будте данный топик ясен..я ничего конкретного не понял там.
http://www.endorfine.od.ua/memcached-multi-get-зачем/
но что то похожее


$gethash = $_GET['info_hash'];
$memcache = new Memcache;
$memcache->connect("localhost", 11211) or die("Memcache Connection Failed");
$gethash = array();
function rezults($gethash) {

$memcache = new Memcache;
$memcache->connect("localhost", 11211) or die("Memcache Connection Failed");
$articles = $memcache->get("scrape_hash_" . $gethash);

if ($articles) {
return $articles;
}

$result = mysql_query("SELECT info_hash, times_completed, ders, hers FROM news WHERE info_hash = '".$gethash."'");
$articles = array();
while ($article = mysql_fetch_assoc($result)) {
$articles[] = $article;
}

$memcache->set("scrape_hash_".$gethash, $articles,0,30); // Store for 30 sek
return $articles;
}

rezults($gethash);

Спустя 19 дней, 5 часов, 43 минуты, 54 секунды (20.12.2009 - 02:24) agentor написал(а):
спасибо всем...разобрался и успешно работает кеширование
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.