"кэширование" массива значений базы данных в php (2 варианта, что лучше?) - PullRequest
1 голос
/ 28 июля 2010

(я использую слово var в следующем, потому что я не уверен, что это такое, я думаю, что это глобальная переменная для класса)

Я хочу кэшировать значения, полученные из таблицы вбаза данных, чтобы сохранить повторные запросы.Я создал одноэлементный класс, в котором есть функция для проверки переменной внутри класса, если ключ существует, если он существует, то просто возвращает значение из переменной, если он не запрашивает базу данных и не загружает еев var и возвращаем его.

Или лучше использовать глобальную переменную (имеет ли глобальная переменная одно и то же значение независимо от того, из какого файла к ней осуществляется доступ?) и не использовать класс ввсе.

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

Должен ли я опубликовать источник того, что мне пришло в голову?

Ответы [ 3 ]

7 голосов
/ 28 июля 2010

Проверьте memcached.Его цель - сделать именно то, что вы только что описали.Он принимает запрос к базе данных и сохраняет результаты в памяти, которая имеет гораздо более быстрый ввод-вывод.Когда выполняется тот же запрос, вы проверяете, хранится ли значение в памяти, и обращаетесь к базе данных, только если это не так.Ценность memcached по сравнению с вашим текущим решением заключается в том, что он постоянен во всех соединениях.

1 голос
/ 28 июля 2010

Если это просто ссылки, вы можете сохранить их в своем сеансе, что означает, что они создаются только при первом посещении страницы с таким изображением.Если вы можете получить все ссылки заранее и сохранить их в сеансе, вы можете сделать ..

session_start();
setupLinks();

// Getting a link by Link ID
if( ($aLink = getLink(562)) !== null) {
    echo "The Link Title is: {$aLink['value']}<br>";
} else {
    echo "The Link Title is unknown<br>";
}

// Getting a link by Key
if( ($aLink = getLink('my_link_key')) !== null) {
    echo "The Link Title is: {$aLink['value']}<br>";
} else {
    echo "The Link Title is unknown<br>";
}

function setupLinks() {

    // Only do this once, so if the links exist do nothing
    if(!isset($_SESSION['aLinks'])) {
        return null;
    }

    storeLinks(getAllLinks()); // your own custom function
}

function storeLinks($aLinks) {
    foreach($aLinks as $aLink) {
         $_SESSION['aLinks'][$aLink['id']] = array(
              'key'   => $aLink['key'],
              'value' => $aLink['value']
         );
    }
}

function getLink($iLinkID) {
    return isset($_SESSION['aLinks'][$iLinkID]) ? $_SESSION['aLinks'][$iLinkID] : null;
}

function getLinkByKey($sLinkKey) {
    foreach($_SESSION['aLinks'] as $aLink) {
        if($sLinkKey == $aLink['key']) { return $aLink; }
    }
    return null;
}
0 голосов
/ 28 июля 2010

Это очень зависит от ваших запросов - насколько они дорогие и тяжелые для базы данных? Если это довольно простые и легкие запросы - я бы сказал, что кэширование не нужно (если только у вас не будет действительно большого количества их - тысячи или миллионы за короткое время). Для простых повторяющихся запросов ваша БД, вероятно, также будет использовать какой-то тип кеша запросов - это также ускорит процесс.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...