memcacheD Это в порядке?

Я удивлен, что кто-то, который использовал Переполнение стека, не мог думать о причине НЕ использовать OpenId - потому что это является раздражающим как ад?!

Ted Dziuba сделал намного лучшее задание разрыв в OpenId, чем я буду, поэтому просто считать то, что он записал.

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

В какой-то момент я предполагаю, что Facebook мог сделать Подключение поставщиком OpenId..., но действительно, почему они захотят?

5
задан The Disintegrator 17 September 2009 в 06:49
поделиться

2 ответа

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

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

  • Для новых элементов предварительно нагрейте кеш (в основном это означает, что вы предварительно загружаете требуемые объекты до того, как сайт будет запущен).
  • Для элементов, срок действия которых истекает периодически, создайте время истечения, которое немного в будущем, чем фактическое время истечения (допустим, 5-10 минут). Затем, когда вы вытаскиваете объект из кеша, проверьте, близко ли время истечения срока действия, кешируйте в будущее, чтобы предотвратить обновление кеша любым другим клиентом, и обновление из базы. Чтобы это работало без задержек кеша, вам необходимо либо реализовать блокировку клавиш, либо использовать токены cas (для работы потребуется последняя версия клиентской библиотеки).

Для получения дополнительной информации см. memcached faq .

] Допустим, запрос X получает 100 строк. Немного после того, как строка № 50 изменена другим процессом (допустим, что розничная цена увеличивается).

У вас есть три типа данных в кэше:

  1. Объекты
  2. Списки объектов
  3. Сгенерированные данные

Обычно я сохраняю объекты как отдельные ключи, а затем использую "указатели" кеша в списках. В вашем случае у вас есть N объектов где-то в кеше (скажем, ключи 1,2..N ), а затем у вас есть список объектов в массиве array (1,2, 3,10,42 ...) . Когда вы решите загрузить список объектами, вы загружаете ключ списка из кеша, а затем загружаете фактические объекты из кеша (используя getMulti для уменьшения количества запросов). В этом случае, если какой-либо объект обновляется, вы обновляете его только в одном месте, и он автоматически обновляется везде (не говоря уже о том, что вы экономите огромное количество места с помощью этой техники).

Изменить : Решили добавьте дополнительную информацию о истечении срока опережающего просмотра .

Вы настраиваете свой объект с данными об истечении срока x и сохраняете его в базе данных с датой истечения срока x + 5 минут . Вот шаги, которые вы предпринимаете при загрузке объекта из кеша:

  1. Проверьте, не пора ли обновить ( time () - x <0 )
  2. Если да, заблокируйте ключ, чтобы никто не может обновить его, пока вы обновляете элемент. Если вы не можете заблокировать ключ, тогда кто-то другой уже обновляет ключ, и это становится SEP (проблема кого-то другого). Поскольку у memcached нет решения для блокировок, вы должны разработать свой собственный механизм. Обычно я делаю это, добавляя отдельный ключ со значением исходного ключа + ": lock" в конце. Вы должны установить срок действия этого ключа на минимально возможное время (для memcached, которое составляет 1 секунду).
  3. Если вы получили блокировку ключа, вы сначала сохраняете объект с новым сроком действия ( Таким образом, вы уверены, что никакие другие клиенты не попытаются заблокировать ключ), затем займитесь своими делами, обновите ключ из базы данных и снова сохраните новое значение с соответствующими предвиденными сроками действия (см. пункт 1).

Надеюсь на это все проясняет :)

s Проблема). Поскольку у memcached нет решения для блокировок, вы должны разработать свой собственный механизм. Обычно я делаю это, добавляя отдельный ключ со значением исходного ключа + ": lock" в конце. Вы должны установить срок действия этого ключа на минимально возможное время (для memcached, которое составляет 1 секунду).
  • Если вы получили блокировку ключа, вы сначала сохраняете объект с новым сроком действия ( таким образом вы уверены, что никакие другие клиенты не попытаются заблокировать ключ), а затем займитесь своими делами, обновите ключ из базы данных и снова сохраните новое значение с соответствующими упреждающими сроками действия (см. пункт 1).
  • Надеюсь на это все проясняет :)

    s Проблема). Поскольку у memcached нет решения для блокировок, вы должны разработать свой собственный механизм. Обычно я делаю это, добавляя отдельный ключ со значением исходного ключа + ": lock" в конце. Вы должны установить срок действия этого ключа на минимально возможное время (для memcached, которое составляет 1 секунду).
  • Если вы получили блокировку ключа, вы сначала сохраняете объект с новым сроком действия ( Таким образом, вы уверены, что никакие другие клиенты не попытаются заблокировать ключ), затем займитесь своими делами, обновите ключ из базы данных и снова сохраните новое значение с соответствующими предвиденными сроками действия (см. пункт 1).
  • Надеюсь на это все проясняет :)

    Обычно я делаю это, добавляя отдельный ключ со значением исходного ключа + ": lock" в конце. Вы должны установить срок действия этого ключа на минимально возможное время (для memcached, которое составляет 1 секунду).
  • Если вы получили блокировку ключа, вы сначала сохраняете объект с новым сроком действия ( Таким образом, вы уверены, что никакие другие клиенты не попытаются заблокировать ключ), затем займитесь своими делами, обновите ключ из базы данных и снова сохраните новое значение с соответствующими предвиденными сроками действия (см. пункт 1).
  • Надеюсь на это все проясняет :)

    Обычно я делаю это, добавляя отдельный ключ со значением исходного ключа + ": lock" в конце. Вы должны установить срок действия этого ключа на минимально возможное время (для memcached, которое составляет 1 секунду).
  • Если вы получили блокировку ключа, вы сначала сохраняете объект с новым сроком действия ( таким образом вы уверены, что никакие другие клиенты не попытаются заблокировать ключ), а затем займитесь своими делами, обновите ключ из базы данных и снова сохраните новое значение с соответствующими упреждающими сроками действия (см. пункт 1).
  • Надеюсь на это все проясняет :)

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

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

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

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

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