сильнее просто некуда, сломаю))) я по разному пробовал, но эффект один. у новичков часто двойной клик вызывает проблемы, а у меня сейчас проблема одинарный клик.
в веб-программировании ситуаций когда несолько запросов работают как единое целое несравнимо меньше чем единичных запросов. так же как и ситуаций конкурентного доступа к ресурсам. таким образом «преимущественно, InnoDB» это параноя, ибо если исходить из реалий то необходимость использования innoDB по определению намного меньше в большинстве веб-приложений.
причем тут время? речь то не о времени жизни кеша, а о том что данные были изменены и от этого утарели. а проверить это можно только выбрав сами данные и сравнив их версию со значением тэга. в моем же случае выбирать данные необходимости нет.
>Вообще, при чтении тегов сразу определяется версия и «годность» данных ;)
Поподробнее ка, плиз.
>Это привычка. Осталась в наследство от Delphi. И считаю, что привычка хорошая ;).
Не понимаю причем тут Дэлфи. Я тоже раньше плотно на нем писал, но почему то привычки такой нет, зато есть чувство здравого смысла, и понимание того когда оно надо а когда нет.
1. То же самое и у меня. Если в кешхеадере нет данных, из кеша не читаем.
2. Отличия в том, что в реализации с тегами может быть такая ситуация, при которой происходит чтение тэгов (1 операция), получение данных из кеша (2 операция) и после этого выясняется что данные устарели. В моем случае всегда можно определить устарели ли данные только на основе информации из кешхеадера.
>Меня это всегда напрягало, поэтому использую, преимущественно, InnoDB.
ну вероятно для онлайн игр то что я тут описал негодится. я не очень знаком со спецификой онлайн игр. Но вот на том же фотофайле было около 40М сущностей (сейчас гораздо больше), но проблем никаких небыло. Я думаю что ресурсы подобные фотофайлу на порядок распростаненее ресурсом типа онлайн-игры.
P.S. И все таки меня терзают смытные сомнения по поводу эффективности хранения такого количества сущностей в мемкеше. Ну да ладно.
скажите, приминительно к вашему проекту сколько будет весить кешхеадер? Это же не сложно посчитать, достаточно построить хеш из используемых в проекте ключей, и серилизовать его.
Вы видимо немного спутали мою статью с самоучителем по работе с мемкеш. Тема моей статьи узкая, она рассказывает только о том, как реализовать групповое удаление данных из кеша. И только то. А то о чем вы горите, это даже не очевидно. Удалять ли данные из кеша, или менять их там, решается конкретно даже не применительно к конкретному проекту, а применительно к конкретной части конкретного проекта. И это уже абслоютно другая тема, цели освятить которую в данной статье я перед собой не ставил. Как впрочем и хак мемкешеда на тему добавления нового функционала.
повторяю, подобная архитектура работала без проблем на photofile.ru, одном из самых высоконагруженных фотохостингов рунета. Конечно же можно представить себе и более нагруженные проекты, но все таки кешхеадер размером в мегабайт мне очень сложно себе представить.
дело в том, что в реализации с тэгами, всегда необходимо делать две выборки, и всегда необходимо выбирать данные из кэша. в моей же реализации мы всегда выбираем только кешхеадер, и по нему и только по нему определяем, надо ли выбирать основные данные (которые могут быть немаленькими, а это расходы памяти) или не надо. То есть, мой подход значительно менее ресурсоемкий как по использованию памяти, так и по количеству чтений из кеша, так и по количеству операций.
да, есть одна проблема. дело не в потерях данных, а в том что если вдруг два скрипта, параллельно обновляют кеш, то может случится ситуация, когда один из них удалил некую группу, а второй тут же записал данные, в которых эта группа не удалена. Но я писал выше что приведенный код несовершенен. Данная проблема решается
1. Разнесением кешхеадера. Сейчас все хранится под одним ключем 'cacheheder', но это не очень опитмально. Надо бы сделать не один корень, а несколько, по первым составным частям ключа. Тогда и запись будет более распределенной, то есть несколько скрипотов могут писать в кеш, не мешаю друг другу.
2. Можно добавить систему блокировок, которая исключит оставшийся шанс конфликта двух записей.
3. Можно при удалении данных, не только удалять их из хеадера, но и удалять из кеша тоже, тогда это, даже при присутвии в кешхеадере этих данных, заставит скрипт их обновить (как я уже говрил, клиент обязан проверять факт получения данных в любом подходе)
Но в любом случае, самая большая опасность состоит только в том, что в некоторых ситуациях может оказаться что некоторые данные не обновлились, хотя они были изменены. Но в реальности шанс такого стечения обстоятельств достаточно мал. В конце концов, мы не паримся насчет использования MyISAM в львиной доле наших проектов, хотя там такие ситуации тоже возможны. Но мы как то обходимся без транзакций.
да, но ничего страшного не будет. в любом случае при получении данных из кеша, необходимо проверять что данные реально получены. Еще и потому что в любом случае они могут проэкспайрится или исчезнуть из-за глюка на сервере.
а да, я и не говорил что с тэгами было бы хуже, но, если не ошибаюсь, то тогда, когда этот подход был применен на фотофайле (более двух лет назад), реализации тэгов еще небыло.
тесты вполне нормально отражают суть. если есть конкретные притензии а не субъетивные, слушаю.
то же самое и по запутанности реализации. помоему проще просто некуда.
Поподробнее ка, плиз.
>Это привычка. Осталась в наследство от Delphi. И считаю, что привычка хорошая ;).
Не понимаю причем тут Дэлфи. Я тоже раньше плотно на нем писал, но почему то привычки такой нет, зато есть чувство здравого смысла, и понимание того когда оно надо а когда нет.
2. Отличия в том, что в реализации с тегами может быть такая ситуация, при которой происходит чтение тэгов (1 операция), получение данных из кеша (2 операция) и после этого выясняется что данные устарели. В моем случае всегда можно определить устарели ли данные только на основе информации из кешхеадера.
>Меня это всегда напрягало, поэтому использую, преимущественно, InnoDB.
Это уже параноя.
1. Моя реализация была придумана раньше
2. Моя реализация оптимальнее по памяти и количеству обращений к мемкешу
P.S. И все таки меня терзают смытные сомнения по поводу эффективности хранения такого количества сущностей в мемкеше. Ну да ладно.
да, есть одна проблема. дело не в потерях данных, а в том что если вдруг два скрипта, параллельно обновляют кеш, то может случится ситуация, когда один из них удалил некую группу, а второй тут же записал данные, в которых эта группа не удалена. Но я писал выше что приведенный код несовершенен. Данная проблема решается
1. Разнесением кешхеадера. Сейчас все хранится под одним ключем 'cacheheder', но это не очень опитмально. Надо бы сделать не один корень, а несколько, по первым составным частям ключа. Тогда и запись будет более распределенной, то есть несколько скрипотов могут писать в кеш, не мешаю друг другу.
2. Можно добавить систему блокировок, которая исключит оставшийся шанс конфликта двух записей.
3. Можно при удалении данных, не только удалять их из хеадера, но и удалять из кеша тоже, тогда это, даже при присутвии в кешхеадере этих данных, заставит скрипт их обновить (как я уже говрил, клиент обязан проверять факт получения данных в любом подходе)
Но в любом случае, самая большая опасность состоит только в том, что в некоторых ситуациях может оказаться что некоторые данные не обновлились, хотя они были изменены. Но в реальности шанс такого стечения обстоятельств достаточно мал. В конце концов, мы не паримся насчет использования MyISAM в львиной доле наших проектов, хотя там такие ситуации тоже возможны. Но мы как то обходимся без транзакций.
А это что?
$cache = new MemcacheCacher('key');
$cache->del();
>а что будет, если между этими событиями рядом работающий скрипт возьмёт и изменит хэдер?
А вы подумайте что будет, ну и если обнаружите проблему, которую я не заметил, буду благодарен
то же самое и по запутанности реализации. помоему проще просто некуда.