прочел "простыню" но слабо понял вроде бы русский язык знаю но смысл плохо доходит понял что желательно вынести в пхп,но опять же процу прийдется считать влюбом случае, да и логичнее же сортировать в базе потому что базы изначально заточены на сортировку
База масштабируется тоже. Кеш не используется для копирования в него базы, кеш нужен для хранения промежуточных горячих данных. Например, если взять запрос на поиск близлежащих объектов, задать шаг точки отсчета (не точка - точка, а "центр квадрата в который входит точка отсчета" - точка) и применить к Москве, то центр попадет в горячие данные, окраины - нет. Регулируя размер кеша можно подобрать оптимальное соотношение между затраченной памятью и скоростью отклика.
Это никак не отменяет моего тезиса о том, что ее процессорное время нецелесообразно тратить на обработку данных. База - это модель. Обработка - это задача контроллера. А никто и не спорит. Но данные эти должны быть не уникальными для каждого вызова, а общими для N вызовов. Достаточно общие, чтобы их выгрузка в кэш имела смысл для прироста производительности. Часто используемые данные всегда "горячие", те, что используются реже - со временем могут остывать и протухать. И да, он может хранить в себе не чистые данные из БД, а результаты выборок, если эта выборка пользуется спросом, а всякие соцсети так вообще хранят там и пользовательские выборки, которые дешевле хранить так, чем тянуть из БД, как, например, френдленту, я в курсе насчет всего этого. Но если выборка уникальна не только для каждого пользователя, но и чуть ли не на каждый запрос - кэш будет бесполезен. Он будет вечно полон заведомой тухлятиной, у которой единственный путь - на выброс.
Отменяет. Может это и не очевидно для жертв PHP и ActiveRecord (на что намекает это ваше безграмотное "база - это модель"), но база предназначена для хранения и обработки данных. Как минимум - для уменьшения передаваемого датасета. Ты же предлагаешь выбрать огромную пачку данных (что уже может быть медленнее, чем выборка по индексу), сериализовать, передать по сети, десериализовать, обработать... о, да... такая экономия процессора. Ты споришь предлагая все необработанные данные выдрать из базы и загнать в кеш, а что бы потом выбирать все эти данные из кеша. Конкретный кейс, который обсуждается, а не сферические горячие данные в абстрактном кеше.
Нет, у него там надо выбрать всего два числа. Долготу и широту. И передать их для обработки на сервер, вместо того, чтобы жевать их на стороне БД. В данном случае я пляшу от конкретной задачи. И эта задача легко разделяется на логические сущности. А вот теперь, чтобы быть правым любой ценой ты начал скатываться в демагогию и присваивать мне тезисы, которые я не выдавал, с тем, чтобы победоносно их опровергнуть. Не надо так делать. Либо тут ошибка понимания, исходящая из того, что ты прочитал то, что я написал по-диагонали. Уж чем чем, а косноязычием я не страдаю. И многозначно стараюсь не выражаться. Не было ни слова про "надо все необработанные данные выдрать и загнать в кэш". Было сказано лишь про то, что в случае, если из базы выбирать только широту и долготу объектов, кэш получится прикрутить и он будет прогреваться без проблем. Если же БД будет выдавать уникальные одноразовые конечные результаты, то добавить системе быстродействия, в будущем, за счет кэша, при такой архитектуре не получится. И, по возможности, лучше учесть это уже сейчас. А ты прочитал то, что не было написано, просто потому, что не способен не спорить. Я ни разу не видел, чтобы ты не спорил. Спорил ради спора. Это не круто.
Какие два числа? В базе 10000 объектов. Задача - найти 10 ближайших в радиусе 5 км. Ты предлагаешь передать все 10000 объектов (ок, их id и координаты) на клиент (PHP), что бы там на ПХП найти искомое, да еще все эти 10000 выдранного положить в кеш. Я правильно понял твое предложение?
Нет. Я предложил вполне прямым текстом выбирать из этих 10к объектов те, что находятся от пользователя в квадрате NхN градусов. И сортировать по расстоянию уже на сервере. Эти вот объекты можно складывать в кэш. И те, что чаще востребованы, будут забираться оттуда. А те, что нет, с базы. А на стороне сервера уже делать все, что захочется. Снова демагогия. Это не было сказано. Это первый страйк. После третьего Родент, в свое время, улетел, не обещав вернуться. --- Добавлено --- Геометри, поинты и полигоны? Если да, то было. Или ты о чем-то другом?
В чем тогда смысл складывать в кеш если ключом будет позиция, которая может быть какая угодно? Получить засранный кеш с потоком miss-ов? Зачем был предложен кеш? Почему нельзя кешировать уже отсортированные данные, что много лучше?
В том и дело, что она не может быть какая угодно. Она статична. Например, координата какого-нибудь кафе. Она не меняется от запроса к запросу. Или ты про позицию пользователя? Ну так а зачем делать ее ключом, если можно делать ключом широту и долготу? Скорее всего, правда, придется хранить двойной набор данных, но это уже другая история. А эти данные как раз меняются от запроса к запросу, потому что выборка делается в радиусе от точки, в которой находится пользователь. И каждая выборка уникальна не только для конкретного пользователя, но и для конкретного запроса. Об этом я и толковал.
Что ты хочешь кешировать? Объекты, которые нужно выдать пользователю с ключом - координатой этого объекта? С какой целю ты собираешься использовать этот кеш?
Я вообще не собираюсь ничего нигде хранить, Миксер. Я просто привел пример, как перенос бизнес-логики на сторону хранилища может в будущем стать проблемой, если между данными и этой логикой нужно будет что-то добавить, например слой кэша.
Я не вижу проблемы и не понимаю, где ты ее увидел, какой вариант кеширования приведет к тому, что этому будет мешать расчет расстояния на стороне базы. Объясни подробнее.
Я уже несколько раз же написал. Посмотри, какой запрос у @vikrorpert используется. Он возвращает не объекты, а посчитанные с них значения. То есть он выбирает пачку, потом ее гонит через формулы, и то, что получилось, отдает клиенту. В итоге каждый запрос возвращает набор данных, актуальных только здесь и сейчас в этой точке пространства. В 100 метрах, БД уже будет возвращать совсем другие данные. Протухаемость этих данных будет просто феноминальная. И кэшировать их нет никакого смысла. Разве что...можно сделать оптимизацию и считать не от позиции клиента, а от квадрата, в котором он находится. Нарезать для себя карту города, скажем, на равные сектора. Проверять вхождение пользователя в сектор, после чего делать выборку, относительно этого сектора и/или смежных, если надо. Тогда действительно будет профит от кэширования уже посчитанных данных, потому как ключом будет квадрат, охватывающий разом определенную площадь, внутри которой выборка всегда будет актуальна, но посчитанные данные, разумеется, не будут иметь точность "до метра".
Извини, не понимаю. Ты сам предлагаешь выбирать объекты рядом с пользователем по его точке из базы. Но расстояние для сортировки считать не в базе, а на клиенте. И говоришь: Т.е. если у нас расчет расстояния на клиенте (пхп) - то с кешом все будет ок. Если в базе - все плохо. Вот я и спрашиваю, как это с кешом все будет хорошо при расчете на клиенте, если выборка все-равно по координате человека и...
на прошлой неделе ганзал психует, сегодня - миксир. Че с вами? --- Добавлено --- я тоже так предлагаю
А я не вижу никакой разницы. Возможно(!) есть какие-то конкретные(!) кейсы в каком-то легаси коде, где удобнее считать на пхп или на стороне базы. Но эти решения не имеют никакого отношения к "программерской логике", ни к "масштабированию", ни к "кешированию". А когда человек не просто бредит, но и вываливает этот бред на новичков - я буду встревать. А не нравится, могу дать повод. Не знаю кто там такой Родент, но мне глубоко поxуй (вот повод, что бы не мучились) на твои угрозы, я потерю не замечу. А форуму еще +10 к рассаднику говнокодерского мракобесия будет.
да, вот отличный кейс сейчас: у него скорее всего немного объектов, и он крайне хреново врубается в программирование. Вполне себе отличное решение на коленке, которое понятно.
Я уже внес выше корректировку в схему, которая даже твой вариант и твою логику учитывает. Но ты ее прокинул, потому что из согласия не получится срач, и продолжаешь атаку на уже отброшенную ветку измышлений. Демагогия. Второй страйк.