Шаблоны разработки кэш-памяти PHP

Я рекомендую упростить вашу логику и стиль, чтобы было проще рассуждать о вашем коде. Вы постоянно вычисляете N//2, что тратит впустую циклы, и это шумно и семантически бессмысленно. Сохраните работу в переменную с именем mid в начале вашей функции, придав ей смысл. Добавьте интервал в свой код, чтобы уменьшить визуальный шум и сделать его приятным (и возможным) для пошагового выполнения.

Что касается start, end и N, это дополнительная переменная, о которой нужно думать и манипулировать - start и end достаточно для обработки всех случаев, и путаница в этих переменных кажется быть проблемой в вашем коде.

Поскольку вы уже знаете алгоритм, вы близки к решению. Однако четность массива не является проблемой - единственная проблема - это (буквально!) Крайние случаи, когда mid == 0 и mid == len(nums) - 1. В обоих этих случаях есть только один сосед, поэтому мы бы потерпели крах, если бы попытались nums[mid-1] и nums[mid+1] соответственно. Решение этих проблем - это проверка того, что mid не находится ни на одном конце массива, ни на другом, прежде чем пытаться проводить эти сравнения.

Собрав все вместе, все, что должно произойти в функции, это:

def finder(start, end):
    mid = (start + end) // 2

    if mid > 0 and nums[mid] < nums[mid-1]:
        return finder(start, mid - 1)
    elif mid < end and nums[mid] < nums[mid+1]:
        return finder(mid + 1, end)
    else:
        return mid
12
задан Rob 27 November 2008 в 01:55
поделиться

4 ответа

Мы также храним результаты запроса от нашей базы данных (PostgreSQL) в кэш-памяти, и мы используем, включает таблицы для лишения законной силы кэша - существует несколько API там (например, pgmemcache, я думаю, что mysql имеет что-то как этот также, но я не знаю наверняка). Преимущество - то, что база данных сам (триггеры) может обработать аннулирование данных по изменениям (обновление, вставить, удалить), Вы не должны писать все это в свое "приложение".

1
ответ дан 2 December 2019 в 06:10
поделиться

То, что грабит, говорит, хороший совет. На основе моего опыта существует два распространенных способа определить и делать недействительным теги: уникальная идентификация и основанная на теге идентификация. Они обычно объединяются для формирования полного решения в который:

  1. Записи кэша присваивают уникальный идентификатор (который обычно зависит так или иначе от данных, которые она кэширует), и дополнительно любое количество тегов.
  2. Записи кэша вспоминает их уникальный идентификатор.
  3. Записи кэша могут делаться недействительным их уникальным идентификатором (по одному), или любым тегом они отмечены с (возможно делающий недействительным несколько записей одновременно).

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

6
ответ дан 2 December 2019 в 06:10
поделиться

Я использую компонент Кэша Зенда (Вы не должны использовать всю платформу просто материал кэша зенда, если Вы хотите). Это абстрагирует часть кэширующегося материала (это поддерживает группирующийся кэш 'тегами', хотя та функция не поддерживается для бэкэнда кэш-памяти, я прокрутил свою собственную поддержку 'тегов' с относительной простотой). Так шаблон я использую для функций, которые кэш доступа (обычно в моей модели):

public function getBySlug($ignoreCache = true)
{
    if($ignoreCache || !$result = $this->cache->load('someKeyBasedOnQuery'))
    {
        $select = $this->select()
                ->where('slug = ?', $slug);
        $result = $this->fetchRow($select);

        try
        {
            $this->cache->save($result,'someKeyBasedOnQuery');
        }
        catch(Zend_Exception $error)
        {
          //log exception
        }
    }
    else
    {
        $this->registry->logger->info('someKeyBasedOnQuery came from cache');
    }
    return $result;

}

базирование кэша включает хеш средств запроса что, если другой разработчик обходит мои модели или использовал другую функцию в другом месте, которая делает то же самое, которое это все еще вытягивают от кэша. Обычно я отмечаю кэш с парой, генерируют тег (название таблицы один, и другой название функции). Таким образом, по умолчанию наш код делает недействительным на вставке, удалите и обновите кэшируемые элементы с тегом таблицы. В целом, кэширование является довольно автоматическим в нашем основном коде, и разработчики могут быть безопасными, что кэширование 'просто работает' в проектах, которые мы делаем. (также большой побочный эффект использования меток состоит в том, что у нас есть страница, которая предлагает детализированную очистку/управление кэша с опциями очистить кэш образцовыми функциями или таблицы).

3
ответ дан 2 December 2019 в 06:10
поделиться

Одна точка для запоминания с объектным кэшированием - то, что это просто что - кэш структур объектов/комплекса. Много людей делает ошибку удара их кэшей для простых, эффективных запросов, который подвергается издержкам проверки/мисс кэша, когда база данных получила бы результат намного быстрее.

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

15
ответ дан 2 December 2019 в 06:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: