|
|
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
Какие плюсы/минусы в такой реализации? Будет ли он вообще безопасно работать в многопоточной среде? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 15:08 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Copy on Write Map ? А как в этом случае быть с обновлением мапы? Мне ее сначала надо все очистить, и потом заново записть туда данные, получается, что в какой-то момент методы getData могут получить пустую или незаполненную мапу. Не? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 15:29 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
zig zuА как в этом случае быть с обновлением мапы? Посмотреть реализацию в существующих примерах? zig zuМне ее сначала надо все очистить, и потом заново записть туда данные, получается, что в какой-то момент методы getData могут получить пустую или незаполненную мапу. Не? Вы сами не понимаете как работает то что написали? Мапу зачем чистить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 15:36 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Мапу зачем чистить? Чтобы ее обновить. Приходят новые данные для мапы, старые все удаляем, записываем новые. Или вы предлагаете усложнить процесс обновления мапы и каждый раз в цикле сравнивать старые и новые данные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 16:06 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
zig zuЧтобы ее обновить. Приходят новые данные для мапы, старые все удаляем, записываем новые. Или вы предлагаете усложнить процесс обновления мапы и каждый раз в цикле сравнивать старые и новые данные? Тогда я не понял что у вас за кэш вообще. Идея Copy on Write в том что бегущие потоки используют старую версию данных, что вполне безопасно. А "новые" потоки, посетившие кэш уже получат новую копию. Таким образом нет никакого промежуточного состояния, когда поток может увидеть невалидный кэш. Если вы имели ввиду что-то другое, то я не совсем понимаю что ваш код должен вообще делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 16:17 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Если вы имели ввиду что-то другое, то я не совсем понимаю что ваш код должен вообще делать. Код делает следующее: получили данные, сохранили их(updateData()), пользуемся данными из нескольких потоков(getData()). Раз в сутки обновляем данные, опять через updateData(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 16:25 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
zig zuКод делает следующее: получили данные, сохранили их(updateData()), пользуемся данными из нескольких потоков(getData()). Раз в сутки обновляем данные, опять через updateData(). Тогда у меня для вас вот ещё схема вечного двигателя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 16:53 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczТогда у меня для вас вот ещё схема вечного двигателя. Стареете? Сначала не разобравшись в проблеме CopyOnWriteMap посоветовали. Потом еще раз не разобравшись картинку не в тему выложили. Жду от вас какой-нибудь смешной ролик из ютуба. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 17:08 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
zig zuСтареете? Переходите на личности? zig zuСначала не разобравшись в проблеме CopyOnWriteMap посоветовали. Чтобы в чем-то разобраться, нужно что-то в чем можно было бы разобраться. zig zuПотом еще раз не разобравшись картинку не в тему выложили. Это намек на то что рассуждения о кешировании в этой теме, пока что на уровне обсуждения вот этой реализации вечного двигателя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 17:13 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczzig zuСтареете? Переходите на личности? Нет, просто мне кажется, что вы надо мной издеваетесь. Не знаю как еще подробнее объяснить задачу. Попробую еще раз. Давайте уберем из обсуждения пока слово кеш, может оно сбило вас с толку. Делаем запрос через веб сервис, получаем немаленький ответ, сохраняем его в мапе. Далее потоки, которым нужны данные из ответа, берут его из мапы, а не делают каждый раз запрос к веб сервису. В самом веб сервисе данные иногда обновляются и нам соотвтественно надо нашу мапу тоже обновлять. Свое решение я привел в коде в самом первом посте. Как вариант, можно еще использовть ehcache, но хотелось пока сделать что-нибудь попроще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 17:26 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
zig zuКод делает следующее: получили данные, сохранили их(updateData()), пользуемся данными из нескольких потоков(getData()). Раз в сутки обновляем данные, опять через updateData().Вам уже ответили, что ConcurrentHashMap уже реализует нужную вам фунциональность: BlazkowiczИдея Copy on Write в том что бегущие потоки используют старую версию данных, что вполне безопасно. А "новые" потоки, посетившие кэш уже получат новую копию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 17:50 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
For AllВам уже ответили, что ConcurrentHashMap уже реализует нужную вам фунциональность: Это я видел и задал вопрос про обновление этой мапы, ответа пока не получил. Zig ZuА как в этом случае быть с обновлением мапы? Мне ее сначала надо все очистить, и потом заново записть туда данные, получается, что в какой-то момент методы getData могут получить пустую или незаполненную мапу. Не? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 17:56 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
У мапы есть метод put - предназначен для обновлений данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 18:01 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
For AllУ мапы есть метод put - предназначен для обновлений данных Как удалить старые данные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 18:03 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
метод remove - там вверху страницы все методы перечислены (и для добавления, и для удаления, и для замены и т.д.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 18:06 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
zig zu, не ведитесь, для русских форумов это нормальная ситуация вместо ответа получить кучу мнений. Приведенный код вполне подходит для решения поставленной задачи. Запись и последующее чтение volatile поля связаны отношением happens-before ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 18:11 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
Просто zig zu никак не может понять, что вместо его собственного класса Data (код которого он привёл в первом сообщении) ему рекомендуют использовать (или хотябы ознакомиться) готовый, идущий в составе JDK, класс ConcurrentHashMap ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 18:16 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
For Allметод remove - там вверху страницы все методы перечислены (и для добавления, и для удаления, и для замены и т.д.) У меня есть мапа с данными, я получил новые данные, вы мне предалагаете мержить даннные??? Нафиг мне это надо, проще удалить все данные из мапы и залить новые. Не? Так вот как ваша ConcurrentHashMap поможешь? Приведите код. Я свой код привел, там как раз есть решение этой проблемы с использованием копирования volatile ссылки при чтении и записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 18:27 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
А вы не ругайтесь 20 страниц а просто приведите usecase когда его код будет делать damage или overhead. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 18:28 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
zig zuЯ свой код привел, там как раз есть решение этой проблемы с использованием копирования volatile ссылки при чтении и записи.Привели, да не совсем. Вот кусок вашего кода: Код: java 1. 2. 3. 4. 5. Прежде, чем спрашиватьzig zuТак вот как ваша ConcurrentHashMap поможешь?нужно вместо многоточий в аргументах updateData(.....) написать нечто более конкретное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 18:33 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
For Allнужно вместо многоточий в аргументах updateData(.....) написать нечто более конкретное А что там непонятного? Сначала создается новая мапа, а потом ее ссылка сбрасывается вместо устаревшей основной. Как пример: Код: java 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 18:48 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
zig zu, Ну а в чём тогда вопрос? Молодец ли вы, что такой класс написали? Ну Ок - молодец ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 18:50 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
zig zuНет, просто мне кажется, что вы надо мной издеваетесь. Ну, у меня аналогичные ощущения. Вы привели код, который почти ничего не иллюстрирует, но отказываетесь его объяснить. Код похож на концепцию copy-on-write, но вы это почему-то отрицаете, тоже не пытаясь объяснить причину. Вы говорите о какой-то "очистке", которой в вашем коде нет, и которая особо не нужна. И тоже не объясняете для чего нужна эта "очистка". zig zuНе знаю как еще подробнее объяснить задачу. Задача - кеш в многопоточной среде. Плюсы и минусы - изучаем copy on write и читаем про плюсы и минусы. Будет ли он вообще безопасно работать в многопоточной среде? Сложно сказать, потому что не рассмотрены все сценарии использования - например совершенно неожиданно всплыли суточные обновления. Если данные обновлять раз в сутки, то вообще до одного места как там кеш реализован, можно спокойно в ReadWriteLock обернуть. zig zuПопробую еще раз. Давайте уберем из обсуждения пока слово кеш, может оно сбило вас с толку. Вот это поворот. zig zuДелаем запрос через веб сервис, получаем немаленький ответ, сохраняем его в мапе. Далее потоки, которым нужны данные из ответа, берут его из мапы, а не делают каждый раз запрос к веб сервису. В самом веб сервисе данные иногда обновляются и нам соотвтественно надо нашу мапу тоже обновлять. Свое решение я привел в коде в самом первом посте. Ну, так-то на много лучше. Что мешало сразу расписать сценарий использования? Не понятно на сколько критично получать актуальные данные. Не понятно зачем два метода getData() и зачем в них хранить ссылку в локальной переменной. zig zuКак вариант, можно еще использовть ehcache, но хотелось пока сделать что-нибудь попроще. Его, например, можно сразу персистить, в отличие от велосипеда. Но надо оно вам или нет, мы не знаем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 18:55 |
|
||
|
Хороший у меня кеш получился?
|
|||
|---|---|---|---|
|
#18+
maytonА вы не ругайтесь 20 страниц а просто приведите usecase когда его код будет делать damage или overhead. - updateData() стоило бы объявить synchronized, если там подразумеваются долгие вычисления. Если нет, то не понятно кто будет гарантировать, что "тяжелые" вычисления не будут запускаться параллельно. - локальная переменная в get-методе лишняя, как и 2й get-метод - сбивает с толку использование Map - так как там по задаче выходит любой бизнес-объкт. Так же как и применение сюда термина "кеш", который в комбинации с Map, обычно служит совершенно иным задачам. - ну, и с обновлениями раз в сутки, оптимизировать что либо особого смысла нет. Достаточно следить за тем чтобы чтение не блокировалось и тяжелые вычисления не запускались параллельно. И если не блокируемое чтение мы тут видим, то что там как с обновлением приведенный код не особо объясняет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2014, 19:02 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38647949&tid=2127151]: |
0ms |
get settings: |
6ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
194ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
91ms |
get tp. blocked users: |
2ms |
| others: | 238ms |
| total: | 569ms |

| 0 / 0 |
