Ключи PHP Memcached и увеличение числа версий для аннулирования кэша - Как? - PullRequest
2 голосов
/ 09 декабря 2011

Я начинаю добавлять слой memcached в мое приложение.пока все хорошо.

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

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

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

Мой код в настоящее время выглядит следующим образом: -

$memcache = new Memcache;


$memcache->connect('localhost', 11211) or die ("Could not connect");


$key = md5("songsearch_$textSearch.$rangeSearch");

Две переменные в ключе var выше получены из запроса get, который, в свою очередь, извлекает большое количество JSON.(Вспомните каталог продуктов).

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

Надеюсь, что все ясно, если нет, пожалуйста, попросите меняуточнить любые моменты, чтобы лучше помочь вам ответить на мой вопрос.

Очевидно, позже, чтобы установить кэш результатов, я использую это: -

$memcache->set($key, $output, MEMCACHE_COMPRESSED, time() + 24*60*60*365);

непосредственно перед тем, как кодировать JSON.

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

Огромное спасибо всем, кто хотя бы поставил меня на правильный путь.

Ответы [ 2 ]

9 голосов
/ 09 декабря 2011

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

$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");

// fetch the current version number
$version = $memcache->get('version_number');

// and add the version to the key
$key = md5("songsearch_$textSearch.$rangeSearch") . 'v' . $version;

Так что теперь, когда кто-то загружает новый контент, вы просто увеличиваете номер версии:

$memcache->increment('version_number');

Это автоматически приводит ко всем существующим запросам работать с недопустимыми записями.

Чтобы упростить доступ, я рекомендую обернуть это в новый класс обработчика Memcache (непроверенный):

class VersionedMemcache extends Memcache {

    const VERSION_KEY = 'version_number';

    private $version = 1;

    public function __construct() {
        $version = parent :: get(self :: VERSION_KEY);
        if ($version === false) {
            $version = 1;
            $this->set(self :: VERSION_KEY, $version);
        }
        $this->version = $version;
    }

    public function get($key, &$flags = null) {
        $key = $key . '_v' . $this->version;
        return parent :: get($key, $flags);
    }

    public function incVersion() {
        $this->version = $this->increment(self :: VERSION_KEY);
        return $this->version;
    }

}

Итак, теперь вы просто изменили бы свой скрипт на:

$memcache = new VersionedMemcache();

$memcache->connect('localhost', 11211) or die ("Could not connect");

$key = md5("songsearch_$textSearch.$rangeSearch");

// this will now result in a fetch on 'ab23...232afe_v1' instead of 'ab23...232afe'
$result = $memcache->get($key);

// when an upload happens, simply
$memcache->incVersion();
0 голосов
/ 09 декабря 2011

Вы можете сохранить массив и избежать чертовых ключей.

...