2016-07-06 6 views
1

У хака есть атрибут <<__Memoize>>, чтобы легко получить результаты кеша.Атрибут Memoize в языке взлома - тайм-аут кеша

Как я могу использовать его для кэширования результатов какой-либо базы данных или запроса API для ограниченного количества времени?

Скажем, мой код очень часто нуждается в некоторой информации из базы данных:

public function loadEmployees(
    string $company_name, 
): ImmSet<string> { 
    return $this->db->sqlQuery(...); 
} 

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

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

Проверен official docs.

ответ

2

Запомните только жизнь в контексте запроса. Ваш запрос занимает более одной минуты? Если это так, Memoize не подходит для вашего случая использования.

+1

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

+0

Теперь в документах говорится: «Атрибут __Memoize позволяет функциям или методам кэшировать свои результаты в течение всего заданного запроса». –

3

< < __Memoize >> только кэширует для жизни запроса и не разделяется между запросами. Очень маловероятно, что у вас есть HTTP-запрос, который длится более минуты, так что кажется, что вы хотите, чтобы кэш был разделен несколькими запросами. APC обычно используется для этого (см. http://php.net/apc). Если вам действительно нужен более подробный контроль кеширования в запросе, вам нужно будет свернуть свой собственный, используя статический член или глобальную переменную.

+0

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

+0

Я приму ответ @ Gareve, поскольку он был первым, хотя этот ответ более полный. Спасибо! –

+1

Также имейте в виду, что для '__Memoize' нет политики выселения - она ​​очищается в конце запроса, но нет контроля над тем, как долго она хранится в запросе; в рамках одного запроса HHVM может кэшировать его навсегда или в течение некоторого другого неопределенного промежутка времени. Ручного контроля над этим вообще нет. Идея состоит в том, что он кэширует дорогостоящие, но идемпотентные вычисления; HTTP-запрос будет технически работать, но на самом деле не попадает в эту парадигму, поэтому, если вам нужна более сложная семантика, вам лучше с чем-то еще. –

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

  • Нет связанных вопросов^_^