Я удивлен, что кто-то, который использовал Переполнение стека, не мог думать о причине НЕ использовать OpenId - потому что это является раздражающим как ад?!
Ted Dziuba сделал намного лучшее задание разрыв в OpenId, чем я буду, поэтому просто считать то, что он записал.
Другое серьезное основание - Подключение Facebook уже, кажется, делает очень хорошо. В то время как членство Facebook продолжает расти, оно собирается заставить Подключение Facebook поддерживать это намного более ценное.
В какой-то момент я предполагаю, что Facebook мог сделать Подключение поставщиком OpenId..., но действительно, почему они захотят?
Уязвим ли этот код к состоянию гонки кеш-памяти с истекшим сроком действия? Как бы вы его улучшили?
Да . Если два (или более) одновременных клиента пытаются получить один и тот же ключ из кеша и в конечном итоге извлекают его из базы данных. У вас будут всплески в базе данных, и в течение определенного периода времени база данных будет находиться под большой нагрузкой. Это называется забастовкой кеша. Есть несколько способов справиться с этим:
Для получения дополнительной информации см. memcached faq .
] Допустим, запрос X получает 100 строк. Немного после того, как строка № 50 изменена другим процессом (допустим, что розничная цена увеличивается).
У вас есть три типа данных в кэше:
Обычно я сохраняю объекты как отдельные ключи, а затем использую "указатели" кеша в списках. В вашем случае у вас есть N объектов где-то в кеше (скажем, ключи 1,2..N
), а затем у вас есть список объектов в массиве array (1,2, 3,10,42 ...)
. Когда вы решите загрузить список объектами, вы загружаете ключ списка из кеша, а затем загружаете фактические объекты из кеша (используя getMulti
для уменьшения количества запросов). В этом случае, если какой-либо объект обновляется, вы обновляете его только в одном месте, и он автоматически обновляется везде (не говоря уже о том, что вы экономите огромное количество места с помощью этой техники).
Изменить : Решили добавьте дополнительную информацию о истечении срока опережающего просмотра .
Вы настраиваете свой объект с данными об истечении срока x
и сохраняете его в базе данных с датой истечения срока x + 5 минут
. Вот шаги, которые вы предпринимаете при загрузке объекта из кеша:
time () - x <0
) + ": lock"
в конце. Вы должны установить срок действия этого ключа на минимально возможное время (для memcached, которое составляет 1 секунду). Надеюсь на это все проясняет :)
s Проблема). Поскольку у memcached нет решения для блокировок, вы должны разработать свой собственный механизм. Обычно я делаю это, добавляя отдельный ключ со значением исходного ключа + ": lock"
в конце. Вы должны установить срок действия этого ключа на минимально возможное время (для memcached, которое составляет 1 секунду).
Надеюсь на это все проясняет :)
s Проблема). Поскольку у memcached нет решения для блокировок, вы должны разработать свой собственный механизм. Обычно я делаю это, добавляя отдельный ключ со значением исходного ключа + ": lock"
в конце. Вы должны установить срок действия этого ключа на минимально возможное время (для memcached, которое составляет 1 секунду).
Надеюсь на это все проясняет :)
Обычно я делаю это, добавляя отдельный ключ со значением исходного ключа + ": lock"
в конце. Вы должны установить срок действия этого ключа на минимально возможное время (для memcached, которое составляет 1 секунду).
Надеюсь на это все проясняет :)
Обычно я делаю это, добавляя отдельный ключ со значением исходного ключа + ": lock"
в конце. Вы должны установить срок действия этого ключа на минимально возможное время (для memcached, которое составляет 1 секунду).
Надеюсь на это все проясняет :)
Вы должны сделать недействительными любой кэшированный объект, содержащий измененный элемент. Либо вам нужно изменить механизм кеширования, чтобы хранить элементы на более детальном уровне, либо сделать недействительной всю запись.
Это в основном то же самое, что сказать, что вы кэшируете всю БД в одной записи кэша. У вас либо истекает срок его действия, либо нет.