powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Вопрос по кешированию
93 сообщений из 93, показаны все 4 страниц
Вопрос по кешированию
    #39945673
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Начитался тут https://m.habr.com/ru/company/oleg-bunin/blog/316652/

У меня вроде как аналогично. Ну только разве что масштабы не те) и без memcached

Клиент делает запрос, если в редисе нет данных— берет с базы и по пути складывает в redis. Последующий заход — сразу из редиса
Тут вроде как все более менее понятно.

А вот со стороны сервера данные, которые относятся к конкретному клиенту могут меняться в базе за сутки раз 10. Вернее добавляться новые.
Пока сделал так. Если данные клиента добавлены— после добавления в базу удаляется запись из редиса

Ну и если клиент зайдет чуть позже , то не найдет ничего в редисе. Ну а далее по алгоритму что выше описан.

Вроде как все красиво более менее.
Только смущает что данные клиента как уже писал за сутки могут раз 10 поменяться. Причем внутри суток все может быть размазано почти равномерно.

В итоге получается, что может возникнуть такая ситуация, что будет постоянно со стороны сервера будут добавляться данные и грохаться запись редиса. А клиент будет постоянно «долбиться», не находить ничего в редисе и брать все из базы.

Иди я слегка перемудрил?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945674
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Максимум что скудный умишко подсказывает — ставить в редисе ttl записи минут 20.

В итоге запись протухнет через 20 минут и при следующем запросе данные подскребутся с базы
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945710
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergq
В итоге получается, что может возникнуть такая ситуация, что будет постоянно со стороны сервера будут добавляться данные и грохаться запись редиса. А клиент будет постоянно «долбиться», не находить ничего в редисе и брать все из базы.


Ну а в чём проблема? Это абсолютно нормально. Вы можете поставить метрики на эти операции и следить как часто используется кеш для передачи данных клиенту.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945711
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergq
Максимум что скудный умишко подсказывает — ставить в редисе ttl записи минут 20.


Тогда в течение 20 минут клиент может получать не актуальные данные. Если по бизнесу это ок, делайте так.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945811
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>sergq, сегодня, 02:32 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1324233&msg=22113944][22113944]
>...Если данные клиента добавлены— после добавления в базу удаляется запись из редиса ...
<
А если так:
1. после добавления в базу меняется запись в редисе по клиенту, если она там есть (у клиента суррогатный ключ).
2. запрос клиента.
ЕСЛИ
нет в кеше
ТО {
//--у каждой записи в кеше имеется параметр - время крайнего обращения
ЕСЛИ
есть место в кеше
ТО
запись с сервера в кеш
ИНАЧЕ {
удаляем ту запись из кеша, которая имеет максимальное время не использования;
запись с сервера в кеш
}
}
берем из кеша.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945846
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergq
Иди я слегка перемудрил?

Скорее слегка не додумали.

При изменении вы удаляете запись из редиса - это правильно.

Но делать это надо не после сохранения в базе, а до.
Чтобы, если непосредственно что-то упадёт при сохранении в бд, то в кэше не остались старые данные.

А после сохранения следует поместить актуальные данные в редис, так, как вы это делаете при чтении.

Это называется Декоратор: вы оборачиваете работу с БД логикой работы с кэшем.

На чём код пишите?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945893
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
Но делать это надо не после сохранения в базе, а до.
Чтобы, если непосредственно что-то упадёт при сохранении в бд, то в кэше не остались старые данные.


Если важно всегда 100% получать актуальные, то этого тоже недостаточно. Нужна блокировка.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945911
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
sergq
Иди я слегка перемудрил?

Скорее слегка не додумали.

При изменении вы удаляете запись из редиса - это правильно.

Но делать это надо не после сохранения в базе, а до.
Чтобы, если непосредственно что-то упадёт при сохранении в бд, то в кэше не остались старые данные.

А после сохранения следует поместить актуальные данные в редис, так, как вы это делаете при чтении.

Это называется Декоратор: вы оборачиваете работу с БД логикой работы с кэшем.

На чём код пишите?


nodejs на сервере.

чуток я не так описал как было с клиентом.
приходит. если в редисе нет - формирует запрос табличке, где уже подготовленные json лежат. если и там нет - запрос в базу, кладется в табличку json и в редис.

вчера убрал эту промежуточную таблицу с подготовленными json и огреб ступор сервера. те когда на сервере что то добавлялось, то удалялось и редиса и в следующий раз клиенту приходилось делать полный запрос к базе.
Все стало раком

а схема основная не понравилась потому, что замечал такое, что в промежуточной табличке с json для клиента ничего не было, а в редисе было. но уже протухшее. приходилось отдельный скрипт запускать чтоб все актуализировать.


А протухало думаю по такой причине. тк все идет параллельно. и на сервере добавляется и клиенты читают

если выполняется в такой последовательности

Клиент:Считал старое из базы. json в промежуточной таблице
Сервер(идет добавление инфы относящейся к клиенту): удалил json в промежуточной таблице
Транзакции разные. Значит теоретически видно и старое и новое значение json в таблице
сервер(идет добавление инфы относящейся к клиенту): удалил из редиса
клиент: положил в редис старое что считалось

В итоге в редисе старое . В базу никто не ходит . Для клиентов это актуальное значение

ну по крайней мере количество записей в редисе не совпадало с количеством записей в промежуточной таблице где json хранятся
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945914
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух
Но делать это надо не после сохранения в базе, а до.
Чтобы, если непосредственно что-то упадёт при сохранении в бд, то в кэше не остались старые данные.


Если важно всегда 100% получать актуальные, то этого тоже недостаточно. Нужна блокировка.



в том то и дело, что когда сменил логику (выше описал), то огреб большое количество запросов к базе.
тк, допустим, в минуту на сервере может добавиться инфа, относящаяся к клиенту раз 10-15. и все в разных "транзакциях"


не знаю на сколько это правильно, но есть еще мысль.
когда в базу добавляется со стороны сервера что то, относящееся к клиенту - брать из редиса json, добавлять в него данные и класть обратно в редис

Хотя врятли это тоже будет работать, тк может получиться так.
1. на сервере добавилась запись для клиента
2. сервер взял из редиса json, добавляет данные
3. в это ж время еще записи добавились для клиента.
4. сервер опять забрал json из редиса. но получается в данном случае оригинальный-первичный. и тоже добавляет.

В итоге рассинхрон (

Можно чуть подробней про блокировку )
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945917
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
воспользовался темой как диалогом )


я правильно додумал, что чтоб рассинхрона не произошло, то можно, например, использовать кролика.
при добавлении на сервер данные кидать в очередь. и обрабатывать ее. получится последовательно. и никакого рассинхрона
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945933
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух
Но делать это надо не после сохранения в базе, а до.
Чтобы, если непосредственно что-то упадёт при сохранении в бд, то в кэше не остались старые данные.


Если важно всегда 100% получать актуальные, то этого тоже недостаточно. Нужна блокировка.

Блокировка чего и зачем?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945936
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergq,

что-то не понимаю я ваших проблем...
седьмой год используем Декоратор поверх Репозитория

Hit Ratio 98-100% и в кэше всегда актуальные данные за исключением тех редких случаев, когда кто-то напрямую в базу полез и что-то там изменил ручками, или скриптом
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945937
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergq
hVostt
пропущено...


Если важно всегда 100% получать актуальные, то этого тоже недостаточно. Нужна блокировка.



в том то и дело, что когда сменил логику (выше описал), то огреб большое количество запросов к базе.
тк, допустим, в минуту на сервере может добавиться инфа, относящаяся к клиенту раз 10-15. и все в разных "транзакциях"


не знаю на сколько это правильно, но есть еще мысль.
когда в базу добавляется со стороны сервера что то, относящееся к клиенту - брать из редиса json, добавлять в него данные и класть обратно в редис

Хотя врятли это тоже будет работать, тк может получиться так.
1. на сервере добавилась запись для клиента
2. сервер взял из редиса json, добавляет данные
3. в это ж время еще записи добавились для клиента.
4. сервер опять забрал json из редиса. но получается в данном случае оригинальный-первичный. и тоже добавляет.

В итоге рассинхрон (

Можно чуть подробней про блокировку )

зачем из редиса брать json?
в каком виде вы данные кладёте в редис? из чего их получаете (сериализуете)?
и что это вообще за данные?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945940
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergq
воспользовался темой как диалогом )


я правильно додумал, что чтоб рассинхрона не произошло, то можно, например, использовать кролика.
при добавлении на сервер данные кидать в очередь. и обрабатывать ее. получится последовательно. и никакого рассинхрона

поясните, что такое "данные, которые относятся к конкретному клиенту могут меняться в базе за сутки раз 10"?
чем вы оперируете: Сущностями, агрегатами, командами?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945943
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945948
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
sergq
пропущено...



в том то и дело, что когда сменил логику (выше описал), то огреб большое количество запросов к базе.
тк, допустим, в минуту на сервере может добавиться инфа, относящаяся к клиенту раз 10-15. и все в разных "транзакциях"


не знаю на сколько это правильно, но есть еще мысль.
когда в базу добавляется со стороны сервера что то, относящееся к клиенту - брать из редиса json, добавлять в него данные и класть обратно в редис

Хотя врятли это тоже будет работать, тк может получиться так.
1. на сервере добавилась запись для клиента
2. сервер взял из редиса json, добавляет данные
3. в это ж время еще записи добавились для клиента.
4. сервер опять забрал json из редиса. но получается в данном случае оригинальный-первичный. и тоже добавляет.

В итоге рассинхрон (

Можно чуть подробней про блокировку )

зачем из редиса брать json?
в каком виде вы данные кладёте в редис? из чего их получаете (сериализуете)?
и что это вообще за данные?


В редисе лежит json. Имя ключа — ид клиента. В json данные дляотображения на клиенте в виде таблицы. Если упрощенно— журнал документов в которых фигурирует клиент
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945949
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
sergq
воспользовался темой как диалогом )


я правильно додумал, что чтоб рассинхрона не произошло, то можно, например, использовать кролика.
при добавлении на сервер данные кидать в очередь. и обрабатывать ее. получится последовательно. и никакого рассинхрона

поясните, что такое "данные, которые относятся к конкретному клиенту могут меняться в базе за сутки раз 10"?
чем вы оперируете: Сущностями, агрегатами, командами?


Документы, в которых фигурирует клиент. На сервер за минуту— две может добавиться 10 документов, в которых данный клиент (его ид) имеется.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945974
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergq
Дмитрий Мух
пропущено...

поясните, что такое "данные, которые относятся к конкретному клиенту могут меняться в базе за сутки раз 10"?
чем вы оперируете: Сущностями, агрегатами, командами?


Документы, в которых фигурирует клиент. На сервер за минуту— две может добавиться 10 документов, в которых данный клиент (его ид) имеется.

А если кэшировать сами документы, а не составлять из них JSON?

Что вообще такое этот JSON? Некий отчёт, или что?
По идее простой запрос списка документов, в которых фигурирует клиент, не должен вводить сервер в ступор.
Откуда вдруг он случился? Пробовали понять?

Вообщем будет лучше если вы толком объясните задачу, которую решаете.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945979
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
sergq
пропущено...


Документы, в которых фигурирует клиент. На сервер за минуту— две может добавиться 10 документов, в которых данный клиент (его ид) имеется.

А если кэшировать сами документы, а не составлять из них JSON?

Что вообще такое этот JSON? Некий отчёт, или что?
По идее простой запрос списка документов, в которых фигурирует клиент, не должен вводить сервер в ступор.
Откуда вдруг он случился? Пробовали понять?

Вообщем будет лучше если вы толком объясните задачу, коорую решаете.


Откуда он случился понять не осилил) Или скорее не успел. ибо погряз в сообщениях и звонках. Как одну из простых мер увеличил пул коннектов к базе в три раза— ушло в ступор через 15 минут. Все коннекты в пуле были заняты. Ну и соответственно последующему запросу клиента приходилось ждать, пока в пуле появится свободный коннект. Пришлось вернуть предидущую версию сервера.

В базе хранятся стандартные документы. Две таблицы. Шапка, тело.
Со стороны сервера ( скорее один тип клиентов) идет добавление этих документов. Это один экземпляр nodejs со своим пулом коннектов к базе.

Внешние клиенты(другой экземпляр nodejs) заходят и должны видеть в виде таблицы в каких введенных документах они фигурируют. По этому и формируется json. На клиенте на его основе отображается таблица. Даже если брать напрямую из тех двух таблиц данные, то все равно возвращать клиенту json.


Те задача сводится к: с одной стороны навводили документов. С другой стороны конкретный клиент смотрит в каких он есть


Подумал реализовать через rabbit. Те когда добавляется документ в кролика кидается инфа какие клиенты есть в документе. А с другой стороны consumer подгребает очередь, находит нужный ключ в редисе, добавляет в его json данные и обновляет значение ключа. Единственное обработка очереди должна идти последовательно
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945984
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergq
Дмитрий Мух
пропущено...

А если кэшировать сами документы, а не составлять из них JSON?

Что вообще такое этот JSON? Некий отчёт, или что?
По идее простой запрос списка документов, в которых фигурирует клиент, не должен вводить сервер в ступор.
Откуда вдруг он случился? Пробовали понять?

Вообщем будет лучше если вы толком объясните задачу, коорую решаете.


Откуда он случился понять не осилил) Или скорее не успел. ибо погряз в сообщениях и звонках. Как одну из простых мер увеличил пул коннектов к базе в три раза— ушло в ступор через 15 минут. Все коннекты в пуле были заняты. Ну и соответственно последующему запросу клиента приходилось ждать, пока в пуле появится свободный коннект. Пришлось вернуть предидущую версию сервера.

В базе хранятся стандартные документы. Две таблицы. Шапка, тело.
Со стороны сервера ( скорее один тип клиентов) идет добавление этих документов. Это один экземпляр nodejs со своим пулом коннектов к базе.

Внешние клиенты(другой экземпляр nodejs) заходят и должны видеть в виде таблицы в каких введенных документах они фигурируют. По этому и формируется json. На клиенте на его основе отображается таблица. Даже если брать напрямую из тех двух таблиц данные, то все равно возвращать клиенту json.


Те задача сводится к: с одной стороны навводили документов. С другой стороны конкретный клиент смотрит в каких он есть


Подумал реализовать через rabbit. Те когда добавляется документ в кролика кидается инфа какие клиенты есть в документе. А с другой стороны consumer подгребает очередь, находит нужный ключ в редисе, добавляет в его json данные и обновляет значение ключа. Единственное обработка очереди должна идти последовательно

Простая вроде задачка: сделал запрос, сформировал json, отдал клиенту.
Пока не понятно для чего тут кэш и тем более очередь.

Какова нагрузка на чтение, сколько запросов в секунду?
Сколько по времени выполняется запрос списка документов по клиенту?
Чем коннекты были заняты?
Может у вас просто коннекты не освобождаются после выполнения запроса?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945992
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы начал не с кэширования, а с того, почему пул коннектов к базе выбирается.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945993
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух

Простая вроде задачка: сделал запрос, сформировал json, отдал клиенту.
Пока не понятно для чего тут кэш и тем более очередь.

Какова нагрузка на чтение, сколько запросов в секунду?
Сколько по времени выполняется запрос списка документов по клиенту?
Чем коннекты были заняты?
Может у вас просто коннекты не освобождаются после выполнения запроса?


Кэш просто поэспериментировать )

когда табличка из json на клиенте отображается- клиент может скачать "пристегнутый " к позиции файл. файл лежит в базе. Знаю, что это плохо. но пока так. файлы относительно небольшие. до метра.

а коннекты к базе освобождались после того, как файл из базы был отдан клиенту (pipe)

но что вчера что сегодня в части скачивания пристегнутого файла все идентично.

те вчера была такая логика (получения списка). редис-база (подготовленный json)-непосредственно запрос к базе
сегодня такая логика. редис-непосредственно запрос к базе.
и вот это и стало колом. с учетом того, что файлы еще по другому url скачивались. но они и вчера и сегодня скачивались
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39945999
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergq
Дмитрий Мух

Простая вроде задачка: сделал запрос, сформировал json, отдал клиенту.
Пока не понятно для чего тут кэш и тем более очередь.

Какова нагрузка на чтение, сколько запросов в секунду?
Сколько по времени выполняется запрос списка документов по клиенту?
Чем коннекты были заняты?
Может у вас просто коннекты не освобождаются после выполнения запроса?


Кэш просто поэспериментировать )

когда табличка из json на клиенте отображается- клиент может скачать "пристегнутый " к позиции файл. файл лежит в базе. Знаю, что это плохо. но пока так. файлы относительно небольшие. до метра.

а коннекты к базе освобождались после того, как файл из базы был отдан клиенту (pipe)

но что вчера что сегодня в части скачивания пристегнутого файла все идентично.

те вчера была такая логика (получения списка). редис-база (подготовленный json)-непосредственно запрос к базе
сегодня такая логика. редис-непосредственно запрос к базе.
и вот это и стало колом. с учетом того, что файлы еще по другому url скачивались. но они и вчера и сегодня скачивались

При получении списка ещё и все файлы, что к нему "пристегнуты" выбираются из базы?
То есть в запросе к БД за списком фигурирует BLOB поле, где данные файла хранятся?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946000
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
Я бы начал не с кэширования, а с того, почему пул коннектов к базе выбирается.


как вариант - резвый клиент. посмотрел по логу - 20 файлов "заказал" скачивать за 2 секунды. а файлы в базе....

Но. почему вчера до смены логики такого не было. хотя в логике просто убрался промежуточный слой

к базе хожу с использованием node-firebird. показывало, что все коннекты заняты.
есть у этого компонента еще свойство pending. массив. описания не нашел. но оно было по размеру примерно на порядок больше, чем количество занятых коннектов к базе
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946003
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
hVostt
пропущено...


Если важно всегда 100% получать актуальные, то этого тоже недостаточно. Нужна блокировка.

Блокировка чего и зачем?


1. Логика, которая приводит к изменениям данных
2. Инвалидируется кеш
3. Данные сохраняются в БД

Между 2 и 3 другой клиент может выполнить запрос, который приведёт к заполнению кеша, уже не верными данными.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946004
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergq
Дмитрий Мух
Я бы начал не с кэширования, а с того, почему пул коннектов к базе выбирается.


как вариант - резвый клиент. посмотрел по логу - 20 файлов "заказал" скачивать за 2 секунды. а файлы в базе....

Но. почему вчера до смены логики такого не было. хотя в логике просто убрался промежуточный слой

20 файлов за 2 секунды? Бот какой-то что-ли?

Если до смены логики проблемы не было, то скорее всего вы сами что-то и сломали.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946006
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
Я бы начал не с кэширования, а с того, почему пул коннектов к базе выбирается.


+, делать кеш привентивно -- плохая идея. Сначала нужно найти затык, кеш это один из инструментов повышения производительности, но единственный.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946009
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух
пропущено...

Блокировка чего и зачем?


1. Логика, которая приводит к изменениям данных
2. Инвалидируется кеш
3. Данные сохраняются в БД

Между 2 и 3 другой клиент может выполнить запрос, который приведёт к заполнению кеша, уже не верными данными.

Если просто на это взглянуть, то данные будут верные.
Они ещё не попали в БД, после успешного сохранения в БД мы кладём актуальные данные в кэш.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946012
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
Если просто на это взглянуть, то данные будут верные.
Они ещё не попали в БД, после успешного сохранения в БД мы кладём актуальные данные в кэш.


Между 2 и 3 кеш заполнится неверными данными при запросе через декоратор. Так как ты почистил его перед внесением изменений, а не после.

Или я что-то не правильно понял в твоей схеме.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946013
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
после успешного сохранения в БД мы кладём актуальные данные в кэш


И зачем класть в кеш, он же по запросу заполняется.
Любые изменения сразу класть в кеш, такая себе схема по умолчанию. При таком подходе тебе всю БД 100% нужно кешировать, какой-то прогрев делать. Может не стоит этим заниматься раньше времени? )
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946016
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух
после успешного сохранения в БД мы кладём актуальные данные в кэш


И зачем класть в кеш, он же по запросу заполняется.

Потому как Декоратор декарирует оба метода Репозитория: и Get, и Set.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946018
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
Потому как Декоратор декарирует оба метода Репозитория: и Get, и Set.


Set непонятно зачем делать без нужды?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946019
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух
Потому как Декоратор декарирует оба метода Репозитория: и Get, и Set.


Set непонятно зачем делать без нужды?


Точнее Set должен инвалидировать кеш после сохранения.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946021
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух,

Да и откуда репозиторий знает что там и в каком виде лежит в кеше?
Если будет знать, это большая связанность.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946022
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Любые изменения сразу класть в кеш, такая себе схема по умолчанию.

Что же в ней не так?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946024
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух
Потому как Декоратор декарирует оба метода Репозитория: и Get, и Set.


Set непонятно зачем делать без нужды?

Да, не понятно зачем делать IRepository.Save(SomeEntity entity) без нужды :)
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946025
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух,

Да и откуда репозиторий знает что там и в каком виде лежит в кеше?
Если будет знать, это большая связанность.

Репозиторий не знает, Декоратор знает. Так что нет никакой связанности.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946026
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
hVostt
Любые изменения сразу класть в кеш, такая себе схема по умолчанию.

Что же в ней не так?


Да всё не так. У меня 10 млн. пользователей в БД. Когда пользователь заходит в прилагу, для него установлены разные параметры, в том числе скидка. Это дело запрашивается в из БД и кладётся в кеш, чтобы использовать данные в разных сценариях без лишних запросов в БД.

Потом заходит манагер и по случаю карантина всем скидос увеличивает на 10%. Т.е. у меня теперь у всех 10 млн. пользователей данные в кеш залезут при изменении?

Нафига? )
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946028
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
hVosttSet непонятно зачем делать без нужды?

Да, не понятно зачем делать IRepository.Save(SomeEntity entity) без нужды :)

Метод инвалидируют все кеши, которые как-то зависят от SomeEntity. Например, по событию. Мне что в репо поддерживать все эти зависимости? Непонимать.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946031
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и кеш однозначно отражает данные запроса. Если мне нужно обновить кеш при изменении, значит после выполненных изменений, мне нужно выполнить запрос, аналогичный Get. По сути, Set должен вызвать Get, чтобы он заполнил кеш. Нахрена оно мне упало, не все запросы на изменения предполагают автоматическое последующее чтение. А если я его итак буду делать, зачем мне это делать в Set? Какое-то избиение солид ногами. Я бы ещё понял, если было бы сделано намеренно для оптимизации конкретного сценария.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946032
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух
пропущено...

Что же в ней не так?


Да всё не так. У меня 10 млн. пользователей в БД. Когда пользователь заходит в прилагу, для него установлены разные параметры, в том числе скидка. Это дело запрашивается в из БД и кладётся в кеш, чтобы использовать данные в разных сценариях без лишних запросов в БД.

Потом заходит манагер и по случаю карантина всем скидос увеличивает на 10%. Т.е. у меня теперь у всех 10 млн. пользователей данные в кеш залезут при изменении?

Нафига? )

Стоп. Ты не разобравшись, начинаешь спорить.
Декоратор над репозиторием при сохранении сущности обновляет только эту сужность в кэше.
Когда происходят операции типа "по случаю карантина всем скидос увеличивает на 10%", тогда иначе.

Например делаем, чтобы какой-то хэш в ключе кэширования сменился, следовательно по ключу в кэше уже ничего находится не будет и он заполнится актуальными данными.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946033
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
Стоп. Ты не разобравшись, начинаешь спорить.
Декоратор над репозиторием при сохранении сущности обновляет только эту сужность в кэше.
Когда происходят операции типа "по случаю карантина всем скидос увеличивает на 10%", тогда иначе.

Например делаем, чтобы какой-то хэш в ключе кэширования сменился, следовательно по ключу в кэше уже ничего находится не будет и он заполнится актуальными данными.


Окей. Значит Set за каким-то лезет в кеш и что-то там проверяет. Почему обычной инвалидации недостаточно? Она достаточно абстрактна и тебе пофигу что там в кеше лежит, по какому ключу, и может у тебя вообще 2 уровня кеша: локальный и распределённый. Во всех будешь ковыряться? )
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946034
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух
пропущено...

Да, не понятно зачем делать IRepository.Save(SomeEntity entity) без нужды :)


Метод инвалидируют все кеши, которые как-то зависят от SomeEntity. Например, по событию. Мне что в репо поддерживать все эти зависимости? Непонимать.

Какие зависимости в репо ты собрался поддерживать?
Репо знает только то, что должен знать: как достать из хранилища и вызвать маппинг на SomeEntity.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946035
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух,

Ну и кеширование сущностей недостаточно. Кроме сущностей, могут быть различные проекции. Ты их не собираешься все обновить в своём репо? ))
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946036
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
Какие зависимости в репо ты собрался поддерживать?
Репо знает только то, что должен знать: как достать из хранилища и вызвать маппинг на SomeEntity.


Непонятен профит. Зачем мне это делать в Set, если это прекрасно уже делается в Get. Заполнение кеша при чтении.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946040
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух
Стоп. Ты не разобравшись, начинаешь спорить.
Декоратор над репозиторием при сохранении сущности обновляет только эту сужность в кэше.
Когда происходят операции типа "по случаю карантина всем скидос увеличивает на 10%", тогда иначе.

Например делаем, чтобы какой-то хэш в ключе кэширования сменился, следовательно по ключу в кэше уже ничего находится не будет и он заполнится актуальными данными.


Окей. Значит Set за каким-то лезет в кеш и что-то там проверяет. Почему обычной инвалидации недостаточно? Она достаточно абстрактна и тебе пофигу что там в кеше лежит, по какому ключу, и может у тебя вообще 2 уровня кеша: локальный и распределённый. Во всех будешь ковыряться? )

Давай примитивный пример репозитория:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class Repository: IRepository
{
    public SomeEntity Get(int id)
    {
        // достаём что-то там из базы и возвращаем        
        ...
        ...
        
        return entity;
    }

    public void Save(SomeEntity entity)
    {
        // сохраняем entity в базу
    }
}


и примитивный пример декоратора:
Код: 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.
class RepositoryCacheDecorator: IRepository
{
    public RepositoryCacheDecorator(IRepository repository, ISomeCache cache)
    {
        this.cache = cache;
        this.repository = repository;
    }

    public SomeEntity Get(int id)
    {
        var entity = this.cache.Get(id);

        if (entity != null)
        {
            return entity;
        }

        entity = this.repository.Get(id);

        if (entity != null)
        {
            this.cache.Set(entity);
        }

        return entity;
    }

    public void Save(SomeEntity entity)
    {
        this.cache.Remove(entity.Id);
        this.repository.Save(entity);
        this.cache.Set(entity);
    }
}
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946041
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух
Какие зависимости в репо ты собрался поддерживать?
Репо знает только то, что должен знать: как достать из хранилища и вызвать маппинг на SomeEntity.


Непонятен профит. Зачем мне это делать в Set, если это прекрасно уже делается в Get. Заполнение кеша при чтении.

Ну к примеру не лепить блокировки :)

Да и просто исключить лишнее обращение к БД.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946042
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух,

Чем хуже такой вариант?

Код: 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.
class RepositoryCacheDecorator: IRepository
{
    public RepositoryCacheDecorator(IRepository repository, ISomeCache cache)
    {
        this.cache = cache;
        this.repository = repository;
    }

    public SomeEntity Get(int id)
    {
        var entity = this.cache.Get(id);

        if (entity != null)
        {
            return entity;
        }

        entity = this.repository.Get(id);

        if (entity != null)
        {
            this.cache.Set(entity);
        }

        return entity;
    }

    public void Save(SomeEntity entity)
    {
        this.cache.Remove(entity.Id);
        this.repository.Save(entity);
        this.cache.Remove(entity);
        // а зачем мне в кеш пихать entity? откуда я знаю, понадобится ли он дальше?
        //this.cache.Set(entity);
    }
}
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946043
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
Ну к примеру не лепить блокировки :)

Да и просто исключить лишнее обращение к БД.


Ну ведь это только на самых банальных, чисто учебных примерах так. В реальных приложениях есть проекции данных, которые кешируются.

Например, скидка, которая рассчитывается из множества данных, размещённых в разных агрегатах.
Какой толк от этой реализации?

Инвалидация нужна.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946045
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

ты прикалываешься? :)
а зачем вообще кэшировать что-то, если оно вдруг никому не понадобится?
обычно кэшируют то, что часто запрашивается и редко изменяется

если что-то больше не понадобится, то будет вызван метод IRepository.Delete
думаю ты легко догадаешься как он выглядит в RepositoryCacheDecorator
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946046
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух
Ну к примеру не лепить блокировки :)

Да и просто исключить лишнее обращение к БД.


Ну ведь это только на самых банальных, чисто учебных примерах так. В реальных приложениях есть проекции данных, которые кешируются.

Например, скидка, которая рассчитывается из множества данных, размещённых в разных агрегатах.
Какой толк от этой реализации?

Инвалидация нужна.

в реальных приложениях есть и то, о чём я пишу, и то, о чём ты...
и во втором случае именно инвалидация происходит
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946047
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergq
Максимум что скудный умишко подсказывает — ставить в редисе ttl записи минут 20.

В итоге запись протухнет через 20 минут и при следующем запросе данные подскребутся с базы

Есть еще одна схема кеширования. Если твоя БД легко трекает дату изменения
документа (легче чем формирование его в response) то можно сделать такой
вот тег в запросе.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Modified-Since

Но это потребует от клиента хранения времени актуальности последнего обращения ну и трекать
коды 200 и 304 соотв.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946048
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
в реальных приложениях есть и то, о чём я пишу, и то, о чём ты...
и во втором случае именно инвалидация происходит


В твоём примере кода нет важной проверки, что ты не должен делать Set, если данных в кеше нет.
Так и должно быть?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946049
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух,

Всё же, запись в кеш при изменении, даёт реальный боевой профит? Понимаю, что вроде как нет лишнего запроса в БД, но один лишний запрос не является проблемой, важно поддержать все остальные тысячи запросов, а не один несчастный запрос )
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946050
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Есть еще одна схема кеширования. Если твоя БД легко трекает дату изменения
документа (легче чем формирование его в response) то можно сделать такой
вот тег в запросе.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Modified-Since

Но это потребует от клиента хранения времени актуальности последнего обращения ну и трекать
коды 200 и 304 соотв.


Лучше ETag использовать, вроде. Жаль, что разработчики АПИ очень редко поддерживают эти теги.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946052
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух
в реальных приложениях есть и то, о чём я пишу, и то, о чём ты...
и во втором случае именно инвалидация происходит


В твоём примере кода нет важной проверки, что ты не должен делать Set, если данных в кеше нет.
Так и должно быть?

Есть такая проверка:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    public SomeEntity Get(int id)
    {
        var entity = this.cache.Get(id);

        if (entity != null)
        {
            return entity;
        }

        entity = this.repository.Get(id);

        if (entity != null)
        {
            this.cache.Set(entity);
        }

        return entity;
    }
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946053
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
mayton
Есть еще одна схема кеширования. Если твоя БД легко трекает дату изменения
документа (легче чем формирование его в response) то можно сделать такой
вот тег в запросе.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Modified-Since

Но это потребует от клиента хранения времени актуальности последнего обращения ну и трекать
коды 200 и 304 соотв.


Лучше ETag использовать, вроде. Жаль, что разработчики АПИ очень редко поддерживают эти теги.

Да это хороший вариант когда идет тесная дружба фронта с Amazon-S3. Там все ресурсы
независимо от разработки уже имеют расчетное поле md5 и его остается только взять
из атрибута объекта и передать в responce.

В других случаях расчет хеша может быть затруднительным.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946054
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
Есть такая проверка:


Так это проверка в Get, а не в Set.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946055
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
В других случаях расчет хеша может быть затруднительным.


Так е-таг можно и время записать, и вообще что угодно, это не обязательно должен быть именно хеш :)
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946056
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух
Есть такая проверка:


Так это проверка в Get, а не в Set.

А в Set она зачем? Просто кладём актуальные данные в кэш.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946057
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
А в Set она зачем? Просто кладём актуальные данные в кэш.


Так, погоди.

Дмитрий Мух
Когда происходят операции типа "по случаю карантина всем скидос увеличивает на 10%", тогда иначе.

Например делаем, чтобы какой-то хэш в ключе кэширования сменился, следовательно по ключу в кэше уже ничего находится не будет и он заполнится актуальными данными.


Т.е. мы должны реализацию кеша менять? А если это просто аспект?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946058
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух,

Просто у тебя, получается, изменение обязательно кладёт сущность в кеш.
А нафига она там в любом случае?
Массовые изменения тоже будут заполнять кеш?
В общем, профит до сих пор непонятен.

Кеш решает задачу снижения большого количества обращений в БД, а не одного единственного на сущность.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946059
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух
А в Set она зачем? Просто кладём актуальные данные в кэш.


Так, погоди.

Дмитрий Мух
Когда происходят операции типа "по случаю карантина всем скидос увеличивает на 10%", тогда иначе.

Например делаем, чтобы какой-то хэш в ключе кэширования сменился, следовательно по ключу в кэше уже ничего находится не будет и он заполнится актуальными данными.


Т.е. мы должны реализацию кеша менять? А если это просто аспект?

Зачем реализацию кэша менять? И почему именно кэша?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946061
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух,

Тот же EF, конечно кладёт сущность в кеш при записи. Но это кеш первого уровня, вполне логично.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946063
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Просто у тебя, получается, изменение обязательно кладёт сущность в кеш.

Если мы кэшируем сущности определённого типа, то да изменение отдельной сущности попадает в кэш.

Что не так?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946064
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
Зачем реализацию кэша менять? И почему именно кэша?


Ну я беру репо, меняю сущность, сохраняю в БД. Это же единственная точка для изменения данных.

Блин, всё равно непонятно. Понятно, что это работать будет, непонятно зачем.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946065
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
hVostt
Просто у тебя, получается, изменение обязательно кладёт сущность в кеш.

Если мы кэшируем сущности определённого типа, то да изменение отдельной сущности попадает в кэш.

Что не так?


Смысл какой? Глобально кешируется чтение, а не запись. Запись инвалидирует. Зачем тут отступать и содержать две разных базовых логики?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946066
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Кеш решает задачу снижения большого количества обращений в БД, а не одного единственного на сущность.

Ну у нас большое количество сущностей определённого типа, к ним часто обращаются, мы их кэшируем и решаем "задачу снижения большого количества обращений в БД" :)
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946067
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
hVostt
Кеш решает задачу снижения большого количества обращений в БД, а не одного единственного на сущность.

Ну у нас большое количество сущностей определённого типа, к ним часто обращаются, мы их кэшируем и решаем "задачу снижения большого количества обращений в БД" :)


Так это конкретный кейс, точечная оптимизация. Хотя непонятно, какого профита вы достигаете. Если вы уберёте запись в кеш при изменении, будет ли деградация ощутима и будет ли она вообще?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946068
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух
Зачем реализацию кэша менять? И почему именно кэша?


Ну я беру репо, меняю сущность, сохраняю в БД. Это же единственная точка для изменения данных.

Да, единственная. И она завёрнута в простой кэш Декоратор :)
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946069
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
Да, единственная. И она завёрнута в простой кэш Декоратор :)


В общем вы из первого уровня кеша сделали второй )
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946070
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Хотя непонятно, какого профита вы достигаете.

Меньше обращений к БД, не надо лепить блокировки.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946071
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух
Да, единственная. И она завёрнута в простой кэш Декоратор :)


В общем вы из первого уровня кеша сделали второй )

Да, это кэш второго уровня.
Хочется, чтобы все машины в ферме получали актуальные данные, минуя БД, и как можно быстрее.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946072
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
mayton
В других случаях расчет хеша может быть затруднительным.


Так е-таг можно и время записать, и вообще что угодно, это не обязательно должен быть именно хеш :)

Да можно. Можно туда просто ложить sequence.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946073
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но схема с стандартной хеш функцией интересна тем что клиент и сервер ее могут
вычислить независмо друг от друга и тогда протокол может быть (теоретически)
вообще без передачи документа.

Вот такой уровень секретности
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946074
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
hVostt
Хотя непонятно, какого профита вы достигаете.

Меньше обращений к БД, не надо лепить блокировки.


При инвалидации тоже не нужно лепить блокировки.
Данные в БД обновились, следом из кеша данные удалились.

Лепить блокировки нужно, только если нужно обеспечить абсолютную гарантию, что в момент выполнения изменений, остальные клиенты должны дождаться обновлённых данных, прям момент в момент.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946075
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух

То есть в запросе к БД за списком фигурирует BLOB поле, где данные файла хранятся?

нет. только его ИД. скачивается отдельным запросом


hVostt

1. Логика, которая приводит к изменениям данных
2. Инвалидируется кеш
3. Данные сохраняются в БД

Между 2 и 3 другой клиент может выполнить запрос, который приведёт к заполнению кеша, уже не верными данными.


именно так. вот по этому в сторону очереди и посмотрел

Дмитрий Мух

20 файлов за 2 секунды? Бот какой-то что-ли?



нет ) слишком резвый клиент )
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946078
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergq
Дмитрий Мух

То есть в запросе к БД за списком фигурирует BLOB поле, где данные файла хранятся?

нет. только его ИД. скачивается отдельным запросом

значит запрос должен быть быстрым

снова возвращаемся к вопросу: кто выжрал пул коннектов?

резвый клиент, скачивающий файлы? тогда как поможет кэширование списка?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946437
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
sergq
пропущено...

нет. только его ИД. скачивается отдельным запросом

значит запрос должен быть быстрым

снова возвращаемся к вопросу: кто выжрал пул коннектов?

резвый клиент, скачивающий файлы? тогда как поможет кэширование списка?


Выжрал пул, к сожалению, я) забыл сделать detach базы пула)

И все ж вопрос по кешированию. Хочется , как говорится , заморочиться)
Допустим со стороны сервера добавляются документы. Можно их ид и ид клиента закидывать в тот же rabbit. И с другой стороны очереди читать и в redis изменять объект.
Пишется это все в js. И вроде как он не дает гарантии последовательности выполнения?
Допустим со стороны сервера почти одновременно возникает ситуация добавления документа с каким то ид клиента и ситуация удаления документа с ид того же клиента. Со стороны сервера кидаем в rabbit инфу о добавлении и инфу о удалении. А вот как гарантировать, что в очередь станет сначала информация о добавлении, а потом об удалении?
В js я относительно недавно. И , полагаю , может возникнуть такая ситуация, что даже если все будет добавляться в очередь последовательно (добавление ид клиента, удаление ид клиента) то эти два события могут стать в очередь наоборот?
Или я ошибаюсь?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946462
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergq
А вот как гарантировать, что в очередь станет сначала информация о добавлении, а потом об удалении?


Почитайте про оптимистичную блокировку.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946563
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>sergq, вчера, 22:32 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1324233&msg=22115111][22115111]
>… Допустим со стороны сервера почти одновременно ...
<
1. Допустим в базе данных есть таблица <клиент, json>.
2. Сервер делает UPDATE строк по завершению записи новых документов.
3. Клиенты только читают <клиент, json> строки .
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946598
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergq
Выжрал пул, к сожалению, я) забыл сделать detach базы пула)
Вот, надо сначала найти, где косяк, поправить, потестировать.

А уже потом кэшированием с очередями заморачиваться :)

sergq
И , полагаю , может возникнуть такая ситуация, что даже если все будет добавляться в очередь последовательно (добавление ид клиента, удаление ид клиента) то эти два события могут стать в очередь наоборот?
Может, но это разве проблема?

Используйте timestamp, выбирайте из очереди пачку событий, сортируйте их по времени.
Вот только в чём смысл?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946619
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев
>sergq, вчера, 22:32 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1324233&msg=22115111][22115111]
>… Допустим со стороны сервера почти одновременно ...
<
1. Допустим в базе данных есть таблица <клиент, json>...

У него нет в базе таблицы <клиент, json>. Он писал выше, что в базе, а где json.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946641
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Дмитрий Мух, сегодня, 14:19 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1324233&msg=22115404][22115404]
>У него нет в базе таблицы <клиент, json>. Он писал выше, что в базе, а где json.
<
Он писал "Пока сделал так."
Если ввести таблицу <клиент, json>, то зачем всё эти редисы и декораторы?
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946654
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев

Если ввести таблицу <клиент, json>, то зачем всё эти редисы и декораторы?

а щоб было!
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946674
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев
>Дмитрий Мух, сегодня, 14:19 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1324233&msg=22115404][22115404]
>У него нет в базе таблицы <клиент, json>. Он писал выше, что в базе, а где json.
<
Он писал "Пока сделал так."
Если ввести таблицу <клиент, json>, то зачем всё эти редисы и декораторы?

И зачем ему таблица <клиент, json>? Поясните?

У него есть все необходимые таблицы, данные из которых выбираются, преобразуются в JSON и отдаются в таком виде клиенту.
ТС хочет полученный JSON кэшировать в редисе, чтобы не напрягать базу лишний раз.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946680
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
There are only two hard things in Computer Science: cache invalidation and naming things.

(c) Кто-то великий
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946707
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
There are only two hard things in Computer Science: cache invalidation and naming things.

(c) Кто-то великий


Именно. Я в общем не зря поднимал этот вопрос )
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946722
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте красиво подытожим.

В строительстве кешей мы забыли что есть внутри hardware эталонные и красивые реализации
кеширующих протоколов (очень тайм-критичных) и надёжных настолько что еслибы они сбоили
хотябы 1 раз в мильон циклов - то работать с CPU/Memory было бы невозможно.

Сюда до кучи ключевые слова Cache Coherency, MSI, MESI e.t.c.

К сожалению прикладные разработчики этой частью инженерии знаний никогда не интересуются
и велосипедят свои прикладные велосипеды основанные на TTL/тегах и различного рода эвристиках
и частных случаях (система ребутается раз в сутки все равно).

Возможно моё предложение нелепо с точки зрения возможностей (есть ли обратная интеракция
между сервером и клиентом АКА веб-сокет?) или я ошибаюсь в количественных характеристиках
микросекунды заменяю на милисекунды и утверждаю что все будет летать чики-пики.

Если я ошибаюсь качественно - то прошу доказать.

И если я ошибаюсь количественно - то прошу провести какие-то числовые выкладки.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946734
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче кэш с очередями тут не нужен.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39946817
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В плане, заниматься вопросом кеширования, когда в этом есть необходимость -- согласен.
А когда этот вопрос становится актуален, значит уже есть соответствующая нагрузка и цифры, на которых уже можно делать какие-то числовые выкладки.
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39948083
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>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...
<
Может быть имеет смысл посмотреть на это
и на это
...
Рейтинг: 0 / 0
Вопрос по кешированию
    #39958498
AlexSader
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спс ребята та же проблема была, вроде решил, все ок)
...
Рейтинг: 0 / 0
93 сообщений из 93, показаны все 4 страниц
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Вопрос по кешированию
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]