Кэширование нумерации Codeigniter с результатами - PullRequest
1 голос
/ 29 февраля 2012

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

md5([query]:[search-options]:[page-number]);

Поскольку я кеширую с помощьюБиблиотека кэширования Codeigniter, когда результаты поиска кэшируются, я сохраняю их под ключом, например:

United States:match=yes|rooms=5|order=date|type=desc|include-pictures=true:5

Так что это означает поиск United states с выбранными параметрами и страницей 5. Это может измениться на что угоднокак это:

United States:match=no|include-pictures=false:2
Washington, United States:match=no|include-pictures=false:2

Теперь это проблема, когда запись обновляется, она не отображает результаты поиска до тех пор, пока кэш не истек, что было бы лучшим способом для кэширования результатов и обновленных записейбудет отражать эти результаты (которые кэшируются)?

Ответы [ 2 ]

1 голос
/ 01 марта 2012

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

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

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

1 голос
/ 01 марта 2012

Теперь это проблема, когда запись обновляется, она не отображает результаты поиска, пока не истек срок действия кэша

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

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

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


Удаление только файлов кэша, принадлежащих к определенной «группе»

Теоретически это достаточно просто сделать: записать файлы кэша в их собственный каталог (скорее всего, в каталог кэша по умолчанию).Когда вам нужно удалить кэш, принадлежащий этой «группе», просто удалите каталог или его содержимое.

Проблема в том, что текущие драйверы кэша Codeigniter не поддерживают эту функцию,хотя это было бы легко интегрировать.В то же время вы можете написать свой собственный драйвер, но вы можете также перегружать саму библиотеку CI_Cache, так как интерфейс, который она предоставляет для драйверов, не очень надежен.Например, метод save() в настоящее время выглядит следующим образом:

/**
 * Cache Save
 *
 * @param   string      Unique Key
 * @param   mixed       Data to store
 * @param   int         Length of time (in seconds) to cache the data
 *
 * @return  boolean     true on success/false on failure
 */
public function save($id, $data, $ttl = 60)
{
    return $this->{$this->_adapter}->save($id, $data, $ttl);
}

При работе только с $id, $data, $ttl вам нужно будет выполнить что-то вроде передачи массива одному из параметров в вашем пользовательском параметре.адаптер.Что-то вроде:

$cache_data = array(
    'group' => 'search_results', // Save to this cache directory
    'id' => $my_id,              // Standard params
    'ttl' => $my_ttl,
    'data' => $my_dat,
);
$this->cache->save($cache_data);

Однако, это ломается при использовании других адаптеров, и так же происходит перегрузка класса CI_Cache для изменения интерфейса.

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

Обязательно рассмотрите Решение Nico Kang отслеживания отдельного кэша $id s, так что вы можете пропустить беспорядок, который я описал выше, и явно удалить файлы кэша, которые вам нужно обновить.

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