|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Здравствуйте. Начитался тут https://m.habr.com/ru/company/oleg-bunin/blog/316652/ У меня вроде как аналогично. Ну только разве что масштабы не те) и без memcached Клиент делает запрос, если в редисе нет данных— берет с базы и по пути складывает в redis. Последующий заход — сразу из редиса Тут вроде как все более менее понятно. А вот со стороны сервера данные, которые относятся к конкретному клиенту могут меняться в базе за сутки раз 10. Вернее добавляться новые. Пока сделал так. Если данные клиента добавлены— после добавления в базу удаляется запись из редиса Ну и если клиент зайдет чуть позже , то не найдет ничего в редисе. Ну а далее по алгоритму что выше описан. Вроде как все красиво более менее. Только смущает что данные клиента как уже писал за сутки могут раз 10 поменяться. Причем внутри суток все может быть размазано почти равномерно. В итоге получается, что может возникнуть такая ситуация, что будет постоянно со стороны сервера будут добавляться данные и грохаться запись редиса. А клиент будет постоянно «долбиться», не находить ничего в редисе и брать все из базы. Иди я слегка перемудрил? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 02:32 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Максимум что скудный умишко подсказывает — ставить в редисе ttl записи минут 20. В итоге запись протухнет через 20 минут и при следующем запросе данные подскребутся с базы ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 02:36 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
sergq В итоге получается, что может возникнуть такая ситуация, что будет постоянно со стороны сервера будут добавляться данные и грохаться запись редиса. А клиент будет постоянно «долбиться», не находить ничего в редисе и брать все из базы. Ну а в чём проблема? Это абсолютно нормально. Вы можете поставить метрики на эти операции и следить как часто используется кеш для передачи данных клиенту. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 10:22 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
sergq Максимум что скудный умишко подсказывает — ставить в редисе ttl записи минут 20. Тогда в течение 20 минут клиент может получать не актуальные данные. Если по бизнесу это ок, делайте так. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 10:22 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
>sergq, сегодня, 02:32 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1324233&msg=22113944][22113944] >...Если данные клиента добавлены— после добавления в базу удаляется запись из редиса ... < А если так: 1. после добавления в базу меняется запись в редисе по клиенту, если она там есть (у клиента суррогатный ключ). 2. запрос клиента. ЕСЛИ нет в кеше ТО { //--у каждой записи в кеше имеется параметр - время крайнего обращения ЕСЛИ есть место в кеше ТО запись с сервера в кеш ИНАЧЕ { удаляем ту запись из кеша, которая имеет максимальное время не использования; запись с сервера в кеш } } берем из кеша. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 13:02 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
sergq Иди я слегка перемудрил? Скорее слегка не додумали. При изменении вы удаляете запись из редиса - это правильно. Но делать это надо не после сохранения в базе, а до. Чтобы, если непосредственно что-то упадёт при сохранении в бд, то в кэше не остались старые данные. А после сохранения следует поместить актуальные данные в редис, так, как вы это делаете при чтении. Это называется Декоратор: вы оборачиваете работу с БД логикой работы с кэшем. На чём код пишите? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 14:13 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух Но делать это надо не после сохранения в базе, а до. Чтобы, если непосредственно что-то упадёт при сохранении в бд, то в кэше не остались старые данные. Если важно всегда 100% получать актуальные, то этого тоже недостаточно. Нужна блокировка. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 15:24 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух sergq Иди я слегка перемудрил? Скорее слегка не додумали. При изменении вы удаляете запись из редиса - это правильно. Но делать это надо не после сохранения в базе, а до. Чтобы, если непосредственно что-то упадёт при сохранении в бд, то в кэше не остались старые данные. А после сохранения следует поместить актуальные данные в редис, так, как вы это делаете при чтении. Это называется Декоратор: вы оборачиваете работу с БД логикой работы с кэшем. На чём код пишите? nodejs на сервере. чуток я не так описал как было с клиентом. приходит. если в редисе нет - формирует запрос табличке, где уже подготовленные json лежат. если и там нет - запрос в базу, кладется в табличку json и в редис. вчера убрал эту промежуточную таблицу с подготовленными json и огреб ступор сервера. те когда на сервере что то добавлялось, то удалялось и редиса и в следующий раз клиенту приходилось делать полный запрос к базе. Все стало раком а схема основная не понравилась потому, что замечал такое, что в промежуточной табличке с json для клиента ничего не было, а в редисе было. но уже протухшее. приходилось отдельный скрипт запускать чтоб все актуализировать. А протухало думаю по такой причине. тк все идет параллельно. и на сервере добавляется и клиенты читают если выполняется в такой последовательности Клиент:Считал старое из базы. json в промежуточной таблице Сервер(идет добавление инфы относящейся к клиенту): удалил json в промежуточной таблице Транзакции разные. Значит теоретически видно и старое и новое значение json в таблице сервер(идет добавление инфы относящейся к клиенту): удалил из редиса клиент: положил в редис старое что считалось В итоге в редисе старое . В базу никто не ходит . Для клиентов это актуальное значение ну по крайней мере количество записей в редисе не совпадало с количеством записей в промежуточной таблице где json хранятся ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 16:30 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Дмитрий Мух Но делать это надо не после сохранения в базе, а до. Чтобы, если непосредственно что-то упадёт при сохранении в бд, то в кэше не остались старые данные. Если важно всегда 100% получать актуальные, то этого тоже недостаточно. Нужна блокировка. в том то и дело, что когда сменил логику (выше описал), то огреб большое количество запросов к базе. тк, допустим, в минуту на сервере может добавиться инфа, относящаяся к клиенту раз 10-15. и все в разных "транзакциях" не знаю на сколько это правильно, но есть еще мысль. когда в базу добавляется со стороны сервера что то, относящееся к клиенту - брать из редиса json, добавлять в него данные и класть обратно в редис Хотя врятли это тоже будет работать, тк может получиться так. 1. на сервере добавилась запись для клиента 2. сервер взял из редиса json, добавляет данные 3. в это ж время еще записи добавились для клиента. 4. сервер опять забрал json из редиса. но получается в данном случае оригинальный-первичный. и тоже добавляет. В итоге рассинхрон ( Можно чуть подробней про блокировку ) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 16:37 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
воспользовался темой как диалогом ) я правильно додумал, что чтоб рассинхрона не произошло, то можно, например, использовать кролика. при добавлении на сервер данные кидать в очередь. и обрабатывать ее. получится последовательно. и никакого рассинхрона ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 16:47 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Дмитрий Мух Но делать это надо не после сохранения в базе, а до. Чтобы, если непосредственно что-то упадёт при сохранении в бд, то в кэше не остались старые данные. Если важно всегда 100% получать актуальные, то этого тоже недостаточно. Нужна блокировка. Блокировка чего и зачем? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 17:11 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
sergq, что-то не понимаю я ваших проблем... седьмой год используем Декоратор поверх Репозитория Hit Ratio 98-100% и в кэше всегда актуальные данные за исключением тех редких случаев, когда кто-то напрямую в базу полез и что-то там изменил ручками, или скриптом ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 17:18 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
sergq hVostt пропущено... Если важно всегда 100% получать актуальные, то этого тоже недостаточно. Нужна блокировка. в том то и дело, что когда сменил логику (выше описал), то огреб большое количество запросов к базе. тк, допустим, в минуту на сервере может добавиться инфа, относящаяся к клиенту раз 10-15. и все в разных "транзакциях" не знаю на сколько это правильно, но есть еще мысль. когда в базу добавляется со стороны сервера что то, относящееся к клиенту - брать из редиса json, добавлять в него данные и класть обратно в редис Хотя врятли это тоже будет работать, тк может получиться так. 1. на сервере добавилась запись для клиента 2. сервер взял из редиса json, добавляет данные 3. в это ж время еще записи добавились для клиента. 4. сервер опять забрал json из редиса. но получается в данном случае оригинальный-первичный. и тоже добавляет. В итоге рассинхрон ( Можно чуть подробней про блокировку ) зачем из редиса брать json? в каком виде вы данные кладёте в редис? из чего их получаете (сериализуете)? и что это вообще за данные? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 17:23 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
sergq воспользовался темой как диалогом ) я правильно додумал, что чтоб рассинхрона не произошло, то можно, например, использовать кролика. при добавлении на сервер данные кидать в очередь. и обрабатывать ее. получится последовательно. и никакого рассинхрона поясните, что такое "данные, которые относятся к конкретному клиенту могут меняться в базе за сутки раз 10"? чем вы оперируете: Сущностями, агрегатами, командами? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 17:25 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух sergq пропущено... в том то и дело, что когда сменил логику (выше описал), то огреб большое количество запросов к базе. тк, допустим, в минуту на сервере может добавиться инфа, относящаяся к клиенту раз 10-15. и все в разных "транзакциях" не знаю на сколько это правильно, но есть еще мысль. когда в базу добавляется со стороны сервера что то, относящееся к клиенту - брать из редиса json, добавлять в него данные и класть обратно в редис Хотя врятли это тоже будет работать, тк может получиться так. 1. на сервере добавилась запись для клиента 2. сервер взял из редиса json, добавляет данные 3. в это ж время еще записи добавились для клиента. 4. сервер опять забрал json из редиса. но получается в данном случае оригинальный-первичный. и тоже добавляет. В итоге рассинхрон ( Можно чуть подробней про блокировку ) зачем из редиса брать json? в каком виде вы данные кладёте в редис? из чего их получаете (сериализуете)? и что это вообще за данные? В редисе лежит json. Имя ключа — ид клиента. В json данные дляотображения на клиенте в виде таблицы. Если упрощенно— журнал документов в которых фигурирует клиент ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 17:45 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух sergq воспользовался темой как диалогом ) я правильно додумал, что чтоб рассинхрона не произошло, то можно, например, использовать кролика. при добавлении на сервер данные кидать в очередь. и обрабатывать ее. получится последовательно. и никакого рассинхрона поясните, что такое "данные, которые относятся к конкретному клиенту могут меняться в базе за сутки раз 10"? чем вы оперируете: Сущностями, агрегатами, командами? Документы, в которых фигурирует клиент. На сервер за минуту— две может добавиться 10 документов, в которых данный клиент (его ид) имеется. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 17:46 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
sergq Дмитрий Мух пропущено... поясните, что такое "данные, которые относятся к конкретному клиенту могут меняться в базе за сутки раз 10"? чем вы оперируете: Сущностями, агрегатами, командами? Документы, в которых фигурирует клиент. На сервер за минуту— две может добавиться 10 документов, в которых данный клиент (его ид) имеется. А если кэшировать сами документы, а не составлять из них JSON? Что вообще такое этот JSON? Некий отчёт, или что? По идее простой запрос списка документов, в которых фигурирует клиент, не должен вводить сервер в ступор. Откуда вдруг он случился? Пробовали понять? Вообщем будет лучше если вы толком объясните задачу, которую решаете. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 18:38 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух sergq пропущено... Документы, в которых фигурирует клиент. На сервер за минуту— две может добавиться 10 документов, в которых данный клиент (его ид) имеется. А если кэшировать сами документы, а не составлять из них JSON? Что вообще такое этот JSON? Некий отчёт, или что? По идее простой запрос списка документов, в которых фигурирует клиент, не должен вводить сервер в ступор. Откуда вдруг он случился? Пробовали понять? Вообщем будет лучше если вы толком объясните задачу, коорую решаете. Откуда он случился понять не осилил) Или скорее не успел. ибо погряз в сообщениях и звонках. Как одну из простых мер увеличил пул коннектов к базе в три раза— ушло в ступор через 15 минут. Все коннекты в пуле были заняты. Ну и соответственно последующему запросу клиента приходилось ждать, пока в пуле появится свободный коннект. Пришлось вернуть предидущую версию сервера. В базе хранятся стандартные документы. Две таблицы. Шапка, тело. Со стороны сервера ( скорее один тип клиентов) идет добавление этих документов. Это один экземпляр nodejs со своим пулом коннектов к базе. Внешние клиенты(другой экземпляр nodejs) заходят и должны видеть в виде таблицы в каких введенных документах они фигурируют. По этому и формируется json. На клиенте на его основе отображается таблица. Даже если брать напрямую из тех двух таблиц данные, то все равно возвращать клиенту json. Те задача сводится к: с одной стороны навводили документов. С другой стороны конкретный клиент смотрит в каких он есть Подумал реализовать через rabbit. Те когда добавляется документ в кролика кидается инфа какие клиенты есть в документе. А с другой стороны consumer подгребает очередь, находит нужный ключ в редисе, добавляет в его json данные и обновляет значение ключа. Единственное обработка очереди должна идти последовательно ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 18:53 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
sergq Дмитрий Мух пропущено... А если кэшировать сами документы, а не составлять из них JSON? Что вообще такое этот JSON? Некий отчёт, или что? По идее простой запрос списка документов, в которых фигурирует клиент, не должен вводить сервер в ступор. Откуда вдруг он случился? Пробовали понять? Вообщем будет лучше если вы толком объясните задачу, коорую решаете. Откуда он случился понять не осилил) Или скорее не успел. ибо погряз в сообщениях и звонках. Как одну из простых мер увеличил пул коннектов к базе в три раза— ушло в ступор через 15 минут. Все коннекты в пуле были заняты. Ну и соответственно последующему запросу клиента приходилось ждать, пока в пуле появится свободный коннект. Пришлось вернуть предидущую версию сервера. В базе хранятся стандартные документы. Две таблицы. Шапка, тело. Со стороны сервера ( скорее один тип клиентов) идет добавление этих документов. Это один экземпляр nodejs со своим пулом коннектов к базе. Внешние клиенты(другой экземпляр nodejs) заходят и должны видеть в виде таблицы в каких введенных документах они фигурируют. По этому и формируется json. На клиенте на его основе отображается таблица. Даже если брать напрямую из тех двух таблиц данные, то все равно возвращать клиенту json. Те задача сводится к: с одной стороны навводили документов. С другой стороны конкретный клиент смотрит в каких он есть Подумал реализовать через rabbit. Те когда добавляется документ в кролика кидается инфа какие клиенты есть в документе. А с другой стороны consumer подгребает очередь, находит нужный ключ в редисе, добавляет в его json данные и обновляет значение ключа. Единственное обработка очереди должна идти последовательно Простая вроде задачка: сделал запрос, сформировал json, отдал клиенту. Пока не понятно для чего тут кэш и тем более очередь. Какова нагрузка на чтение, сколько запросов в секунду? Сколько по времени выполняется запрос списка документов по клиенту? Чем коннекты были заняты? Может у вас просто коннекты не освобождаются после выполнения запроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 19:04 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Я бы начал не с кэширования, а с того, почему пул коннектов к базе выбирается. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 19:20 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух Простая вроде задачка: сделал запрос, сформировал json, отдал клиенту. Пока не понятно для чего тут кэш и тем более очередь. Какова нагрузка на чтение, сколько запросов в секунду? Сколько по времени выполняется запрос списка документов по клиенту? Чем коннекты были заняты? Может у вас просто коннекты не освобождаются после выполнения запроса? Кэш просто поэспериментировать ) когда табличка из json на клиенте отображается- клиент может скачать "пристегнутый " к позиции файл. файл лежит в базе. Знаю, что это плохо. но пока так. файлы относительно небольшие. до метра. а коннекты к базе освобождались после того, как файл из базы был отдан клиенту (pipe) но что вчера что сегодня в части скачивания пристегнутого файла все идентично. те вчера была такая логика (получения списка). редис-база (подготовленный json)-непосредственно запрос к базе сегодня такая логика. редис-непосредственно запрос к базе. и вот это и стало колом. с учетом того, что файлы еще по другому url скачивались. но они и вчера и сегодня скачивались ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 19:21 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
sergq Дмитрий Мух Простая вроде задачка: сделал запрос, сформировал json, отдал клиенту. Пока не понятно для чего тут кэш и тем более очередь. Какова нагрузка на чтение, сколько запросов в секунду? Сколько по времени выполняется запрос списка документов по клиенту? Чем коннекты были заняты? Может у вас просто коннекты не освобождаются после выполнения запроса? Кэш просто поэспериментировать ) когда табличка из json на клиенте отображается- клиент может скачать "пристегнутый " к позиции файл. файл лежит в базе. Знаю, что это плохо. но пока так. файлы относительно небольшие. до метра. а коннекты к базе освобождались после того, как файл из базы был отдан клиенту (pipe) но что вчера что сегодня в части скачивания пристегнутого файла все идентично. те вчера была такая логика (получения списка). редис-база (подготовленный json)-непосредственно запрос к базе сегодня такая логика. редис-непосредственно запрос к базе. и вот это и стало колом. с учетом того, что файлы еще по другому url скачивались. но они и вчера и сегодня скачивались При получении списка ещё и все файлы, что к нему "пристегнуты" выбираются из базы? То есть в запросе к БД за списком фигурирует BLOB поле, где данные файла хранятся? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 19:36 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух Я бы начал не с кэширования, а с того, почему пул коннектов к базе выбирается. как вариант - резвый клиент. посмотрел по логу - 20 файлов "заказал" скачивать за 2 секунды. а файлы в базе.... Но. почему вчера до смены логики такого не было. хотя в логике просто убрался промежуточный слой к базе хожу с использованием node-firebird. показывало, что все коннекты заняты. есть у этого компонента еще свойство pending. массив. описания не нашел. но оно было по размеру примерно на порядок больше, чем количество занятых коннектов к базе ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 19:36 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух hVostt пропущено... Если важно всегда 100% получать актуальные, то этого тоже недостаточно. Нужна блокировка. Блокировка чего и зачем? 1. Логика, которая приводит к изменениям данных 2. Инвалидируется кеш 3. Данные сохраняются в БД Между 2 и 3 другой клиент может выполнить запрос, который приведёт к заполнению кеша, уже не верными данными. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 19:59 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
sergq Дмитрий Мух Я бы начал не с кэширования, а с того, почему пул коннектов к базе выбирается. как вариант - резвый клиент. посмотрел по логу - 20 файлов "заказал" скачивать за 2 секунды. а файлы в базе.... Но. почему вчера до смены логики такого не было. хотя в логике просто убрался промежуточный слой 20 файлов за 2 секунды? Бот какой-то что-ли? Если до смены логики проблемы не было, то скорее всего вы сами что-то и сломали. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 19:59 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух Я бы начал не с кэширования, а с того, почему пул коннектов к базе выбирается. +, делать кеш привентивно -- плохая идея. Сначала нужно найти затык, кеш это один из инструментов повышения производительности, но единственный. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:01 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Дмитрий Мух пропущено... Блокировка чего и зачем? 1. Логика, которая приводит к изменениям данных 2. Инвалидируется кеш 3. Данные сохраняются в БД Между 2 и 3 другой клиент может выполнить запрос, который приведёт к заполнению кеша, уже не верными данными. Если просто на это взглянуть, то данные будут верные. Они ещё не попали в БД, после успешного сохранения в БД мы кладём актуальные данные в кэш. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:08 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух Если просто на это взглянуть, то данные будут верные. Они ещё не попали в БД, после успешного сохранения в БД мы кладём актуальные данные в кэш. Между 2 и 3 кеш заполнится неверными данными при запросе через декоратор. Так как ты почистил его перед внесением изменений, а не после. Или я что-то не правильно понял в твоей схеме. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:13 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух после успешного сохранения в БД мы кладём актуальные данные в кэш И зачем класть в кеш, он же по запросу заполняется. Любые изменения сразу класть в кеш, такая себе схема по умолчанию. При таком подходе тебе всю БД 100% нужно кешировать, какой-то прогрев делать. Может не стоит этим заниматься раньше времени? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:15 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Дмитрий Мух после успешного сохранения в БД мы кладём актуальные данные в кэш И зачем класть в кеш, он же по запросу заполняется. Потому как Декоратор декарирует оба метода Репозитория: и Get, и Set. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:17 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух Потому как Декоратор декарирует оба метода Репозитория: и Get, и Set. Set непонятно зачем делать без нужды? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:20 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Дмитрий Мух Потому как Декоратор декарирует оба метода Репозитория: и Get, и Set. Set непонятно зачем делать без нужды? Точнее Set должен инвалидировать кеш после сохранения. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:20 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух, Да и откуда репозиторий знает что там и в каком виде лежит в кеше? Если будет знать, это большая связанность. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:21 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Любые изменения сразу класть в кеш, такая себе схема по умолчанию. Что же в ней не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:24 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Дмитрий Мух Потому как Декоратор декарирует оба метода Репозитория: и Get, и Set. Set непонятно зачем делать без нужды? Да, не понятно зачем делать IRepository.Save(SomeEntity entity) без нужды :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:26 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Дмитрий Мух, Да и откуда репозиторий знает что там и в каком виде лежит в кеше? Если будет знать, это большая связанность. Репозиторий не знает, Декоратор знает. Так что нет никакой связанности. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:27 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух hVostt Любые изменения сразу класть в кеш, такая себе схема по умолчанию. Что же в ней не так? Да всё не так. У меня 10 млн. пользователей в БД. Когда пользователь заходит в прилагу, для него установлены разные параметры, в том числе скидка. Это дело запрашивается в из БД и кладётся в кеш, чтобы использовать данные в разных сценариях без лишних запросов в БД. Потом заходит манагер и по случаю карантина всем скидос увеличивает на 10%. Т.е. у меня теперь у всех 10 млн. пользователей данные в кеш залезут при изменении? Нафига? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:28 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух hVosttSet непонятно зачем делать без нужды? Да, не понятно зачем делать IRepository.Save(SomeEntity entity) без нужды :) Метод инвалидируют все кеши, которые как-то зависят от SomeEntity. Например, по событию. Мне что в репо поддерживать все эти зависимости? Непонимать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:30 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Ну и кеш однозначно отражает данные запроса. Если мне нужно обновить кеш при изменении, значит после выполненных изменений, мне нужно выполнить запрос, аналогичный Get. По сути, Set должен вызвать Get, чтобы он заполнил кеш. Нахрена оно мне упало, не все запросы на изменения предполагают автоматическое последующее чтение. А если я его итак буду делать, зачем мне это делать в Set? Какое-то избиение солид ногами. Я бы ещё понял, если было бы сделано намеренно для оптимизации конкретного сценария. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:34 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Дмитрий Мух пропущено... Что же в ней не так? Да всё не так. У меня 10 млн. пользователей в БД. Когда пользователь заходит в прилагу, для него установлены разные параметры, в том числе скидка. Это дело запрашивается в из БД и кладётся в кеш, чтобы использовать данные в разных сценариях без лишних запросов в БД. Потом заходит манагер и по случаю карантина всем скидос увеличивает на 10%. Т.е. у меня теперь у всех 10 млн. пользователей данные в кеш залезут при изменении? Нафига? ) Стоп. Ты не разобравшись, начинаешь спорить. Декоратор над репозиторием при сохранении сущности обновляет только эту сужность в кэше. Когда происходят операции типа "по случаю карантина всем скидос увеличивает на 10%", тогда иначе. Например делаем, чтобы какой-то хэш в ключе кэширования сменился, следовательно по ключу в кэше уже ничего находится не будет и он заполнится актуальными данными. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:35 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух Стоп. Ты не разобравшись, начинаешь спорить. Декоратор над репозиторием при сохранении сущности обновляет только эту сужность в кэше. Когда происходят операции типа "по случаю карантина всем скидос увеличивает на 10%", тогда иначе. Например делаем, чтобы какой-то хэш в ключе кэширования сменился, следовательно по ключу в кэше уже ничего находится не будет и он заполнится актуальными данными. Окей. Значит Set за каким-то лезет в кеш и что-то там проверяет. Почему обычной инвалидации недостаточно? Она достаточно абстрактна и тебе пофигу что там в кеше лежит, по какому ключу, и может у тебя вообще 2 уровня кеша: локальный и распределённый. Во всех будешь ковыряться? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:36 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Дмитрий Мух пропущено... Да, не понятно зачем делать IRepository.Save(SomeEntity entity) без нужды :) Метод инвалидируют все кеши, которые как-то зависят от SomeEntity. Например, по событию. Мне что в репо поддерживать все эти зависимости? Непонимать. Какие зависимости в репо ты собрался поддерживать? Репо знает только то, что должен знать: как достать из хранилища и вызвать маппинг на SomeEntity. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:38 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух, Ну и кеширование сущностей недостаточно. Кроме сущностей, могут быть различные проекции. Ты их не собираешься все обновить в своём репо? )) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:38 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух Какие зависимости в репо ты собрался поддерживать? Репо знает только то, что должен знать: как достать из хранилища и вызвать маппинг на SomeEntity. Непонятен профит. Зачем мне это делать в Set, если это прекрасно уже делается в Get. Заполнение кеша при чтении. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:39 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Дмитрий Мух Стоп. Ты не разобравшись, начинаешь спорить. Декоратор над репозиторием при сохранении сущности обновляет только эту сужность в кэше. Когда происходят операции типа "по случаю карантина всем скидос увеличивает на 10%", тогда иначе. Например делаем, чтобы какой-то хэш в ключе кэширования сменился, следовательно по ключу в кэше уже ничего находится не будет и он заполнится актуальными данными. Окей. Значит Set за каким-то лезет в кеш и что-то там проверяет. Почему обычной инвалидации недостаточно? Она достаточно абстрактна и тебе пофигу что там в кеше лежит, по какому ключу, и может у тебя вообще 2 уровня кеша: локальный и распределённый. Во всех будешь ковыряться? ) Давай примитивный пример репозитория: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
и примитивный пример декоратора: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:47 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Дмитрий Мух Какие зависимости в репо ты собрался поддерживать? Репо знает только то, что должен знать: как достать из хранилища и вызвать маппинг на SomeEntity. Непонятен профит. Зачем мне это делать в Set, если это прекрасно уже делается в Get. Заполнение кеша при чтении. Ну к примеру не лепить блокировки :) Да и просто исключить лишнее обращение к БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:48 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух, Чем хуже такой вариант? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:50 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух Ну к примеру не лепить блокировки :) Да и просто исключить лишнее обращение к БД. Ну ведь это только на самых банальных, чисто учебных примерах так. В реальных приложениях есть проекции данных, которые кешируются. Например, скидка, которая рассчитывается из множества данных, размещённых в разных агрегатах. Какой толк от этой реализации? Инвалидация нужна. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:52 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt, ты прикалываешься? :) а зачем вообще кэшировать что-то, если оно вдруг никому не понадобится? обычно кэшируют то, что часто запрашивается и редко изменяется если что-то больше не понадобится, то будет вызван метод IRepository.Delete думаю ты легко догадаешься как он выглядит в RepositoryCacheDecorator ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:55 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Дмитрий Мух Ну к примеру не лепить блокировки :) Да и просто исключить лишнее обращение к БД. Ну ведь это только на самых банальных, чисто учебных примерах так. В реальных приложениях есть проекции данных, которые кешируются. Например, скидка, которая рассчитывается из множества данных, размещённых в разных агрегатах. Какой толк от этой реализации? Инвалидация нужна. в реальных приложениях есть и то, о чём я пишу, и то, о чём ты... и во втором случае именно инвалидация происходит ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:56 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
sergq Максимум что скудный умишко подсказывает — ставить в редисе ttl записи минут 20. В итоге запись протухнет через 20 минут и при следующем запросе данные подскребутся с базы Есть еще одна схема кеширования. Если твоя БД легко трекает дату изменения документа (легче чем формирование его в response) то можно сделать такой вот тег в запросе. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Modified-Since Но это потребует от клиента хранения времени актуальности последнего обращения ну и трекать коды 200 и 304 соотв. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 20:59 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух в реальных приложениях есть и то, о чём я пишу, и то, о чём ты... и во втором случае именно инвалидация происходит В твоём примере кода нет важной проверки, что ты не должен делать Set, если данных в кеше нет. Так и должно быть? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:01 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух, Всё же, запись в кеш при изменении, даёт реальный боевой профит? Понимаю, что вроде как нет лишнего запроса в БД, но один лишний запрос не является проблемой, важно поддержать все остальные тысячи запросов, а не один несчастный запрос ) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:03 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
mayton Есть еще одна схема кеширования. Если твоя БД легко трекает дату изменения документа (легче чем формирование его в response) то можно сделать такой вот тег в запросе. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Modified-Since Но это потребует от клиента хранения времени актуальности последнего обращения ну и трекать коды 200 и 304 соотв. Лучше ETag использовать, вроде. Жаль, что разработчики АПИ очень редко поддерживают эти теги. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:04 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Дмитрий Мух в реальных приложениях есть и то, о чём я пишу, и то, о чём ты... и во втором случае именно инвалидация происходит В твоём примере кода нет важной проверки, что ты не должен делать Set, если данных в кеше нет. Так и должно быть? Есть такая проверка: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:11 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt mayton Есть еще одна схема кеширования. Если твоя БД легко трекает дату изменения документа (легче чем формирование его в response) то можно сделать такой вот тег в запросе. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Modified-Since Но это потребует от клиента хранения времени актуальности последнего обращения ну и трекать коды 200 и 304 соотв. Лучше ETag использовать, вроде. Жаль, что разработчики АПИ очень редко поддерживают эти теги. Да это хороший вариант когда идет тесная дружба фронта с Amazon-S3. Там все ресурсы независимо от разработки уже имеют расчетное поле md5 и его остается только взять из атрибута объекта и передать в responce. В других случаях расчет хеша может быть затруднительным. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:17 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух Есть такая проверка: Так это проверка в Get, а не в Set. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:19 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
mayton В других случаях расчет хеша может быть затруднительным. Так е-таг можно и время записать, и вообще что угодно, это не обязательно должен быть именно хеш :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:20 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Дмитрий Мух Есть такая проверка: Так это проверка в Get, а не в Set. А в Set она зачем? Просто кладём актуальные данные в кэш. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:21 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух А в Set она зачем? Просто кладём актуальные данные в кэш. Так, погоди. Дмитрий Мух Когда происходят операции типа "по случаю карантина всем скидос увеличивает на 10%", тогда иначе. Например делаем, чтобы какой-то хэш в ключе кэширования сменился, следовательно по ключу в кэше уже ничего находится не будет и он заполнится актуальными данными. Т.е. мы должны реализацию кеша менять? А если это просто аспект? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:22 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух, Просто у тебя, получается, изменение обязательно кладёт сущность в кеш. А нафига она там в любом случае? Массовые изменения тоже будут заполнять кеш? В общем, профит до сих пор непонятен. Кеш решает задачу снижения большого количества обращений в БД, а не одного единственного на сущность. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:24 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Дмитрий Мух А в Set она зачем? Просто кладём актуальные данные в кэш. Так, погоди. Дмитрий Мух Когда происходят операции типа "по случаю карантина всем скидос увеличивает на 10%", тогда иначе. Например делаем, чтобы какой-то хэш в ключе кэширования сменился, следовательно по ключу в кэше уже ничего находится не будет и он заполнится актуальными данными. Т.е. мы должны реализацию кеша менять? А если это просто аспект? Зачем реализацию кэша менять? И почему именно кэша? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:25 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух, Тот же EF, конечно кладёт сущность в кеш при записи. Но это кеш первого уровня, вполне логично. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:25 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Просто у тебя, получается, изменение обязательно кладёт сущность в кеш. Если мы кэшируем сущности определённого типа, то да изменение отдельной сущности попадает в кэш. Что не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:26 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух Зачем реализацию кэша менять? И почему именно кэша? Ну я беру репо, меняю сущность, сохраняю в БД. Это же единственная точка для изменения данных. Блин, всё равно непонятно. Понятно, что это работать будет, непонятно зачем. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:26 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух hVostt Просто у тебя, получается, изменение обязательно кладёт сущность в кеш. Если мы кэшируем сущности определённого типа, то да изменение отдельной сущности попадает в кэш. Что не так? Смысл какой? Глобально кешируется чтение, а не запись. Запись инвалидирует. Зачем тут отступать и содержать две разных базовых логики? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:27 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Кеш решает задачу снижения большого количества обращений в БД, а не одного единственного на сущность. Ну у нас большое количество сущностей определённого типа, к ним часто обращаются, мы их кэшируем и решаем "задачу снижения большого количества обращений в БД" :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:29 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух hVostt Кеш решает задачу снижения большого количества обращений в БД, а не одного единственного на сущность. Ну у нас большое количество сущностей определённого типа, к ним часто обращаются, мы их кэшируем и решаем "задачу снижения большого количества обращений в БД" :) Так это конкретный кейс, точечная оптимизация. Хотя непонятно, какого профита вы достигаете. Если вы уберёте запись в кеш при изменении, будет ли деградация ощутима и будет ли она вообще? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:30 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Дмитрий Мух Зачем реализацию кэша менять? И почему именно кэша? Ну я беру репо, меняю сущность, сохраняю в БД. Это же единственная точка для изменения данных. Да, единственная. И она завёрнута в простой кэш Декоратор :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:31 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух Да, единственная. И она завёрнута в простой кэш Декоратор :) В общем вы из первого уровня кеша сделали второй ) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:33 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Хотя непонятно, какого профита вы достигаете. Меньше обращений к БД, не надо лепить блокировки. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:33 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt Дмитрий Мух Да, единственная. И она завёрнута в простой кэш Декоратор :) В общем вы из первого уровня кеша сделали второй ) Да, это кэш второго уровня. Хочется, чтобы все машины в ферме получали актуальные данные, минуя БД, и как можно быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:35 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
hVostt mayton В других случаях расчет хеша может быть затруднительным. Так е-таг можно и время записать, и вообще что угодно, это не обязательно должен быть именно хеш :) Да можно. Можно туда просто ложить sequence. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:36 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Но схема с стандартной хеш функцией интересна тем что клиент и сервер ее могут вычислить независмо друг от друга и тогда протокол может быть (теоретически) вообще без передачи документа. Вот такой уровень секретности ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:37 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух hVostt Хотя непонятно, какого профита вы достигаете. Меньше обращений к БД, не надо лепить блокировки. При инвалидации тоже не нужно лепить блокировки. Данные в БД обновились, следом из кеша данные удалились. Лепить блокировки нужно, только если нужно обеспечить абсолютную гарантию, что в момент выполнения изменений, остальные клиенты должны дождаться обновлённых данных, прям момент в момент. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:37 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух То есть в запросе к БД за списком фигурирует BLOB поле, где данные файла хранятся? нет. только его ИД. скачивается отдельным запросом hVostt 1. Логика, которая приводит к изменениям данных 2. Инвалидируется кеш 3. Данные сохраняются в БД Между 2 и 3 другой клиент может выполнить запрос, который приведёт к заполнению кеша, уже не верными данными. именно так. вот по этому в сторону очереди и посмотрел Дмитрий Мух 20 файлов за 2 секунды? Бот какой-то что-ли? нет ) слишком резвый клиент ) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 21:42 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
sergq Дмитрий Мух То есть в запросе к БД за списком фигурирует BLOB поле, где данные файла хранятся? нет. только его ИД. скачивается отдельным запросом значит запрос должен быть быстрым снова возвращаемся к вопросу: кто выжрал пул коннектов? резвый клиент, скачивающий файлы? тогда как поможет кэширование списка? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 22:07 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Дмитрий Мух sergq пропущено... нет. только его ИД. скачивается отдельным запросом значит запрос должен быть быстрым снова возвращаемся к вопросу: кто выжрал пул коннектов? резвый клиент, скачивающий файлы? тогда как поможет кэширование списка? Выжрал пул, к сожалению, я) забыл сделать detach базы пула) И все ж вопрос по кешированию. Хочется , как говорится , заморочиться) Допустим со стороны сервера добавляются документы. Можно их ид и ид клиента закидывать в тот же rabbit. И с другой стороны очереди читать и в redis изменять объект. Пишется это все в js. И вроде как он не дает гарантии последовательности выполнения? Допустим со стороны сервера почти одновременно возникает ситуация добавления документа с каким то ид клиента и ситуация удаления документа с ид того же клиента. Со стороны сервера кидаем в rabbit инфу о добавлении и инфу о удалении. А вот как гарантировать, что в очередь станет сначала информация о добавлении, а потом об удалении? В js я относительно недавно. И , полагаю , может возникнуть такая ситуация, что даже если все будет добавляться в очередь последовательно (добавление ид клиента, удаление ид клиента) то эти два события могут стать в очередь наоборот? Или я ошибаюсь? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2020, 22:32 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
sergq А вот как гарантировать, что в очередь станет сначала информация о добавлении, а потом об удалении? Почитайте про оптимистичную блокировку. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 00:32 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
>sergq, вчера, 22:32 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1324233&msg=22115111][22115111] >… Допустим со стороны сервера почти одновременно ... < 1. Допустим в базе данных есть таблица <клиент, json>. 2. Сервер делает UPDATE строк по завершению записи новых документов. 3. Клиенты только читают <клиент, json> строки . ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 12:16 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
sergq Выжрал пул, к сожалению, я) забыл сделать detach базы пула) А уже потом кэшированием с очередями заморачиваться :) sergq И , полагаю , может возникнуть такая ситуация, что даже если все будет добавляться в очередь последовательно (добавление ид клиента, удаление ид клиента) то эти два события могут стать в очередь наоборот? Используйте timestamp, выбирайте из очереди пачку событий, сортируйте их по времени. Вот только в чём смысл? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 13:36 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
ВМоисеев >sergq, вчера, 22:32 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1324233&msg=22115111][22115111] >… Допустим со стороны сервера почти одновременно ... < 1. Допустим в базе данных есть таблица <клиент, json>... У него нет в базе таблицы <клиент, json>. Он писал выше, что в базе, а где json. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 14:19 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
>Дмитрий Мух, сегодня, 14:19 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1324233&msg=22115404][22115404] >У него нет в базе таблицы <клиент, json>. Он писал выше, что в базе, а где json. < Он писал "Пока сделал так." Если ввести таблицу <клиент, json>, то зачем всё эти редисы и декораторы? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 15:05 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
ВМоисеев Если ввести таблицу <клиент, json>, то зачем всё эти редисы и декораторы? а щоб было! ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 15:48 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
ВМоисеев >Дмитрий Мух, сегодня, 14:19 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1324233&msg=22115404][22115404] >У него нет в базе таблицы <клиент, json>. Он писал выше, что в базе, а где json. < Он писал "Пока сделал так." Если ввести таблицу <клиент, json>, то зачем всё эти редисы и декораторы? И зачем ему таблица <клиент, json>? Поясните? У него есть все необходимые таблицы, данные из которых выбираются, преобразуются в JSON и отдаются в таком виде клиенту. ТС хочет полученный JSON кэшировать в редисе, чтобы не напрягать базу лишний раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 16:49 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
There are only two hard things in Computer Science: cache invalidation and naming things. (c) Кто-то великий ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 17:04 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
mayton There are only two hard things in Computer Science: cache invalidation and naming things. (c) Кто-то великий Именно. Я в общем не зря поднимал этот вопрос ) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 18:23 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Давайте красиво подытожим. В строительстве кешей мы забыли что есть внутри hardware эталонные и красивые реализации кеширующих протоколов (очень тайм-критичных) и надёжных настолько что еслибы они сбоили хотябы 1 раз в мильон циклов - то работать с CPU/Memory было бы невозможно. Сюда до кучи ключевые слова Cache Coherency, MSI, MESI e.t.c. К сожалению прикладные разработчики этой частью инженерии знаний никогда не интересуются и велосипедят свои прикладные велосипеды основанные на TTL/тегах и различного рода эвристиках и частных случаях (система ребутается раз в сутки все равно). Возможно моё предложение нелепо с точки зрения возможностей (есть ли обратная интеракция между сервером и клиентом АКА веб-сокет?) или я ошибаюсь в количественных характеристиках микросекунды заменяю на милисекунды и утверждаю что все будет летать чики-пики. Если я ошибаюсь качественно - то прошу доказать. И если я ошибаюсь количественно - то прошу провести какие-то числовые выкладки. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 18:58 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
Короче кэш с очередями тут не нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 19:19 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
В плане, заниматься вопросом кеширования, когда в этом есть необходимость -- согласен. А когда этот вопрос становится актуален, значит уже есть соответствующая нагрузка и цифры, на которых уже можно делать какие-то числовые выкладки. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2020, 03:10 |
|
Вопрос по кешированию
|
|||
---|---|---|---|
#18+
>mayton, 13 апр 20, 18:58 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1324233&msg=22115582][22115582] >...Сюда до кучи ключевые слова Cache Coherency, MSI, MESI e.t.c... < Может быть имеет смысл посмотреть на это и на это ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2020, 15:56 |
|
|
start [/forum/topic.php?all=1&fid=33&tid=1547108]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
111ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 217ms |
0 / 0 |