Как стать автором
Обновить
30
0
Максим @pro100tak

Пользователь

Отправить сообщение
1. Сценарий запуска пока кеш не разогреется — апокалиптичен по определению. У нас бъют сильно-сильно по всяким выступающим частям тела за слив мемкеша (либо админа за рестарт и т.п. — за что что недоглядел).
2. Максимальная оптимизация, которую тут можно провести:
return (is_array($value) &&
    isset($value['_dc_life_end']) && isset($value['_dc_cache_time']) &&
    !empty($value['_dc_life_end']) && !empty($value['_dc_cache_time'])
);

Ибо должна произвестись ошибка уровня E_NOTICE при использовании одних только empty(). Даже если они по-умолчанию отключены — не значит что их нет :) Да и isset() и empty() — функции, предназначенные совершенно для разных вещей и какбе логично сначала проверить существование элемента массива (если нет — ветка просто обломается и дальше считаться не будет), а потом уже — его пустоту.
300 МБ исходников, часть которых завязана на мемкеш и логику работы с ним. Не получится без конфликтов никак — это нормальное поведение. Запрос — нет данных — генерация — в промежутке ещё 100 запросов. Для того и делалось :)
Совсем не хочется иметь N висящих потоков. Не к добру это.
P.S. цитата коммента ниже
Охохо, ежели ничего не удалять — ужасающе быстро закончится место. В моём коде так и делается: один начинает генерацию, а остальные — «кто не успел :)» — получают старые данные.
Бляяя, извините. Не посчитал точечки — монитор большой.
Промах.
Совсем не хочется иметь N висящих потоков. Не к добру это.
Совсем не хочется иметь N висящих потоков. Не к добру это.
karellen привёл толковую альтернативу:
Советую использовать Redis + команду WATCH.
Магия CAS тут совершенно ни при чём.
Как справедливо заметил Darivush тут:
Это избавит только от повторного set по ключу, а не от повторных вычислений сохраняемых данных.
Я тогда ещё не знал про Хабр :)
Да и у меня пример кода имеется.
Это уже в ToDo листе. Redis или Mongo — нужен будет файловый кеш, чтобы при падении кеш-сервера/гибели мира/Чаке в датацентре и т.д. случаях кеш поднимался из файла сначала, а потом уже дёргал приложение.
До консоли можно достучаться если нажать просто Shift+F10 в рекавери. Плюс — работает при установке семёрки. Это не рас спасло при восстановлении MBR.
Это очень и очень приблизительный сценарий. В идеале код должен понять, что есть лок и показать пользователю что-то типа «обновление...» на месте, где должно быть значение из мемкеша.
В это время, первый дорвавшийся выставляет лок и обновляет данные. Либо ставит задачу в очередь на обновление и тоже умирает.
Сбрасываем нужные ключикию Если данные важны — генерируем данные и просто заменяем.
Отправил. Живее всех живых :) Просто огромный траффик + всякие примочки типа счётчиков, статистика и т.д. 0,5 секунд — бесконечно долгое время, за которое не одна сотня запросов может прийти.
За слив кеша у нас бъют по разным частям тела. И без этой логики это будет равносильно его ооочень скрипучей работе.
Локи — медленно и надо привязывать к этой надстройке, а не к голому мемкешу. Плюс — в каком виде хранить генераторы данных и организовывать очередь выполнения — тоже вопрос. Иначе сервера лягут, но уже от РНР :)
Это в основную ветку комментарий? Всё равно — добавлю секцию «Примеры использования».
При этом, количество хранимых данных вырастет в ~2 раза (данные + backup)

Информация

В рейтинге
Не участвует
Откуда
Харьков, Харьковская обл., Украина
Дата рождения
Зарегистрирован
Активность