powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Хороший у меня кеш получился?
39 сообщений из 39, показаны все 2 страниц
Хороший у меня кеш получился?
    #38647674
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какие плюсы/минусы в такой реализации?
Будет ли он вообще безопасно работать в многопоточной среде?

Код: 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.
public class Data{

    private volatile Map data = new HashMap();

   public void updateData(.....){
       Map tmpData = new HashMap();
       // fill tmpData
       data = tmpData;
   }

   public Item getData_1(someKey1){
      tmpData = data;
      // find data in tmpData 

      return mapItem;
   }

   public Item getData_2(someKey2){
      tmpData = data;
      // find data in tmpData 

      return mapItem;
   }
}
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647685
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647698
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz Copy on Write Map ?

А как в этом случае быть с обновлением мапы? Мне ее сначала надо все очистить, и потом заново записть туда данные, получается, что в какой-то момент методы getData могут получить пустую или незаполненную мапу. Не?
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647710
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zuА как в этом случае быть с обновлением мапы?

Посмотреть реализацию в существующих примерах?

zig zuМне ее сначала надо все очистить, и потом заново записть туда данные, получается, что в какой-то момент методы getData могут получить пустую или незаполненную мапу. Не?
Вы сами не понимаете как работает то что написали? Мапу зачем чистить?
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647773
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz Мапу зачем чистить?

Чтобы ее обновить. Приходят новые данные для мапы, старые все удаляем, записываем новые.
Или вы предлагаете усложнить процесс обновления мапы и каждый раз в цикле сравнивать старые и новые данные?
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647801
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zuЧтобы ее обновить. Приходят новые данные для мапы, старые все удаляем, записываем новые.
Или вы предлагаете усложнить процесс обновления мапы и каждый раз в цикле сравнивать старые и новые данные?
Тогда я не понял что у вас за кэш вообще. Идея Copy on Write в том что бегущие потоки используют старую версию данных, что вполне безопасно. А "новые" потоки, посетившие кэш уже получат новую копию. Таким образом нет никакого промежуточного состояния, когда поток может увидеть невалидный кэш.

Если вы имели ввиду что-то другое, то я не совсем понимаю что ваш код должен вообще делать.
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647810
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz
Если вы имели ввиду что-то другое, то я не совсем понимаю что ваш код должен вообще делать.

Код делает следующее: получили данные, сохранили их(updateData()), пользуемся данными из нескольких потоков(getData()). Раз в сутки обновляем данные, опять через updateData().
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647849
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zuКод делает следующее: получили данные, сохранили их(updateData()), пользуемся данными из нескольких потоков(getData()). Раз в сутки обновляем данные, опять через updateData().
Тогда у меня для вас вот ещё схема вечного двигателя.
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647872
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczТогда у меня для вас вот ещё схема вечного двигателя.


Стареете?
Сначала не разобравшись в проблеме CopyOnWriteMap посоветовали.
Потом еще раз не разобравшись картинку не в тему выложили.
Жду от вас какой-нибудь смешной ролик из ютуба.
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647880
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zuСтареете?

Переходите на личности?

zig zuСначала не разобравшись в проблеме CopyOnWriteMap посоветовали.

Чтобы в чем-то разобраться, нужно что-то в чем можно было бы разобраться.

zig zuПотом еще раз не разобравшись картинку не в тему выложили.

Это намек на то что рассуждения о кешировании в этой теме, пока что на уровне обсуждения вот этой реализации вечного двигателя.
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647896
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczzig zuСтареете?

Переходите на личности?


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

Не знаю как еще подробнее объяснить задачу.

Попробую еще раз. Давайте уберем из обсуждения пока слово кеш, может оно сбило вас с толку.

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

Как вариант, можно еще использовть ehcache, но хотелось пока сделать что-нибудь попроще.
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647928
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zuКод делает следующее: получили данные, сохранили их(updateData()), пользуемся данными из нескольких потоков(getData()). Раз в сутки обновляем данные, опять через updateData().Вам уже ответили, что ConcurrentHashMap уже реализует нужную вам фунциональность:
BlazkowiczИдея Copy on Write в том что бегущие потоки используют старую версию данных, что вполне безопасно. А "новые" потоки, посетившие кэш уже получат новую копию
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647949
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
For AllВам уже ответили, что ConcurrentHashMap уже реализует нужную вам фунциональность:


Это я видел и задал вопрос про обновление этой мапы, ответа пока не получил.

Zig ZuА как в этом случае быть с обновлением мапы? Мне ее сначала надо все очистить, и потом заново записть туда данные, получается, что в какой-то момент методы getData могут получить пустую или незаполненную мапу. Не?
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647956
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У мапы есть метод put - предназначен для обновлений данных
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647962
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
For AllУ мапы есть метод put - предназначен для обновлений данных

Как удалить старые данные?
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647965
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
метод remove - там вверху страницы все методы перечислены (и для добавления, и для удаления, и для замены и т.д.)
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647967
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zig zu,
не ведитесь, для русских форумов это нормальная ситуация вместо ответа получить кучу мнений.
Приведенный код вполне подходит для решения поставленной задачи.
Запись и последующее чтение volatile поля связаны отношением happens-before
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647969
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто zig zu никак не может понять, что вместо его собственного класса Data (код которого он привёл в первом сообщении) ему рекомендуют использовать (или хотябы ознакомиться) готовый, идущий в составе JDK, класс ConcurrentHashMap
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647978
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
For Allметод remove - там вверху страницы все методы перечислены (и для добавления, и для удаления, и для замены и т.д.)

У меня есть мапа с данными, я получил новые данные, вы мне предалагаете мержить даннные??? Нафиг мне это надо, проще удалить все данные из мапы и залить новые. Не? Так вот как ваша ConcurrentHashMap поможешь? Приведите код. Я свой код привел, там как раз есть решение этой проблемы с использованием копирования volatile ссылки при чтении и записи.
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647980
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вы не ругайтесь 20 страниц а просто приведите usecase когда его код будет делать damage
или overhead.
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647984
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zuЯ свой код привел, там как раз есть решение этой проблемы с использованием копирования volatile ссылки при чтении и записи.Привели, да не совсем. Вот кусок вашего кода:
Код: java
1.
2.
3.
4.
5.
  public void updateData(.....){
       Map tmpData = new HashMap();
       // fill tmpData
       data = tmpData;
   }

Прежде, чем спрашиватьzig zuТак вот как ваша ConcurrentHashMap поможешь?нужно вместо многоточий в аргументах updateData(.....) написать нечто более конкретное
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647997
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
For Allнужно вместо многоточий в аргументах updateData(.....) написать нечто более конкретное

А что там непонятного? Сначала создается новая мапа, а потом ее ссылка сбрасывается вместо устаревшей основной.

Как пример:
Код: java
1.
2.
3.
4.
5.
6.
7.
  public void updateData(List<User> data){
       Map tmpData = new HashMap();
       for(User user: data){
           tmpData.put(user.getId, user);
       }
       data = tmpData;
   }
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38647999
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zu,
Ну а в чём тогда вопрос? Молодец ли вы, что такой класс написали? Ну Ок - молодец
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38648002
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zuНет, просто мне кажется, что вы надо мной издеваетесь.

Ну, у меня аналогичные ощущения.
Вы привели код, который почти ничего не иллюстрирует, но отказываетесь его объяснить.
Код похож на концепцию copy-on-write, но вы это почему-то отрицаете, тоже не пытаясь объяснить причину.
Вы говорите о какой-то "очистке", которой в вашем коде нет, и которая особо не нужна. И тоже не объясняете для чего нужна эта "очистка".

zig zuНе знаю как еще подробнее объяснить задачу.

Задача - кеш в многопоточной среде.
Плюсы и минусы - изучаем copy on write и читаем про плюсы и минусы.
Будет ли он вообще безопасно работать в многопоточной среде? Сложно сказать, потому что не рассмотрены все сценарии использования - например совершенно неожиданно всплыли суточные обновления. Если данные обновлять раз в сутки, то вообще до одного места как там кеш реализован, можно спокойно в ReadWriteLock обернуть.

zig zuПопробую еще раз. Давайте уберем из обсуждения пока слово кеш, может оно сбило вас с толку.

Вот это поворот.

zig zuДелаем запрос через веб сервис, получаем немаленький ответ, сохраняем его в мапе. Далее потоки, которым нужны данные из ответа, берут его из мапы, а не делают каждый раз запрос к веб сервису.
В самом веб сервисе данные иногда обновляются и нам соотвтественно надо нашу мапу тоже обновлять.
Свое решение я привел в коде в самом первом посте.
Ну, так-то на много лучше. Что мешало сразу расписать сценарий использования?
Не понятно на сколько критично получать актуальные данные. Не понятно зачем два метода getData() и зачем в них хранить ссылку в локальной переменной.

zig zuКак вариант, можно еще использовть ehcache, но хотелось пока сделать что-нибудь попроще.
Его, например, можно сразу персистить, в отличие от велосипеда. Но надо оно вам или нет, мы не знаем.
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38648010
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА вы не ругайтесь 20 страниц а просто приведите usecase когда его код будет делать damage
или overhead.
- updateData() стоило бы объявить synchronized, если там подразумеваются долгие вычисления. Если нет, то не понятно кто будет гарантировать, что "тяжелые" вычисления не будут запускаться параллельно.
- локальная переменная в get-методе лишняя, как и 2й get-метод
- сбивает с толку использование Map - так как там по задаче выходит любой бизнес-объкт. Так же как и применение сюда термина "кеш", который в комбинации с Map, обычно служит совершенно иным задачам.
- ну, и с обновлениями раз в сутки, оптимизировать что либо особого смысла нет. Достаточно следить за тем чтобы чтение не блокировалось и тяжелые вычисления не запускались параллельно. И если не блокируемое чтение мы тут видим, то что там как с обновлением приведенный код не особо объясняет.
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38648014
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zuКак пример:

Всё равно не очевидно. Вижу минимум 2 варианта.

Код: java
1.
2.
3.
4.
5.
  public void updateData(Object ... args){
       Map tmpData = new HashMap();
       tmpData.put(runLongCalculations(args));
       data = tmpData;
   }


Или
Код: java
1.
2.
3.
4.
5.
  public void updateData(MyLongToCalculateObjects obj){
       Map tmpData = new HashMap();
       tmpData.putAll(obj);
       data = tmpData;
   }
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38648020
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz- updateData() стоило бы объявить synchronized, если там подразумеваются долгие вычисления. Если нет, то не понятно кто будет гарантировать, что "тяжелые" вычисления не будут запускаться параллельно.
- локальная переменная в get-методе лишняя, как и 2й get-метод


Так вся суть как раз в том, чтобы нигде synchronized не было. Мой класс Data вообще не блокирующий не для читающих ни для пишущего потока. Для этого и локальные ссылки нужны в методах.
Обновлять может только один поток, более подробный код метода обновления я привел выше.
Несколько методов get осуществляют поиск по разным ключам.
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38648025
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zuОбновлять может только один потокВ приведеном коде ничто не мешает двум потокам обновить данные
zig zuболее подробный код метода обновления я привел выше.Не самый лучший вариант кстати - зависимость класса Data на класс User - плохо
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38648027
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zuТак вся суть как раз в том, чтобы нигде synchronized не было.

Для записи раз в сутки очень важно чтобы методы записи были не блокирующими. Так?

zig zuМой класс Data вообще не блокирующий не для читающих ни для пишущего потока.

Я вижу. Поэтому объясняю к чем это приведет.

zig zuДля этого и локальные ссылки нужны в методах.

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

zig zuОбновлять может только один поток
"Я так сказал". Да? Других причин почему это так нет? Если без иронии, то вопрос простой. Кто гарантирует что это только один поток?

zig zuНесколько методов get осуществляют поиск по разным ключам.
Возможно это важно в вашем проекте, но приведенный код никак не объясняет зачем это сделано.
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38648029
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczНе понятно зачем два метода getData() и зачем в них хранить ссылку в локальной переменной.

Вот это правильное замечание, локальная ссылка в методах get может действительно не нужна?
Я правильно понимаю, что при вызове метода get в стеке потока будет создана копия ссылки на мапу data?

П.С. А разные методы get ищут по разным ключам.
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38648032
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zuВот это правильное замечание, локальная ссылка в методах get может действительно не нужна?

Зависит от реализации метода, которую вы опустили.

zig zuЯ правильно понимаю, что при вызове метода get в стеке потока будет создана копия ссылки на мапу data?

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

zig zuП.С. А разные методы get ищут по разным ключам.
Вариант сделать ключ аргуметом метода не рассматривается?
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38648057
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
For AllВам уже ответили, что ConcurrentHashMap уже реализует нужную вам фунциональность:
BlazkowiczИдея Copy on Write в том что бегущие потоки используют старую версию данных, что вполне безопасно. А "новые" потоки, посетившие кэш уже получат новую копию1) ConcurrentHashMap к copy-on-write никакого отношения не имеет, это два совершенно разных подхода.
2) Автору не нужны конкурентные обновления конкретных элементов, ему нужно иногда обновлять ВСЕ элементы. Поэтому и ConcurrentHashMap ему не нужен.
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38648061
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz- updateData() стоило бы объявить synchronized, если там подразумеваются долгие вычисления. Если нет, то не понятно кто будет гарантировать, что "тяжелые" вычисления не будут запускаться параллельно.Учитывая логику этого метода - полная перезапись всей мапы - synchronized здесь не нужен совершенно.

Blazkowicz- локальная переменная в get-методе лишняя, как и 2й get-методЛокальная переменная здесь кака раз таки является ключевым местом. Она вместе с модификатором volatile на data позволяет работать вообще без синхронизации.

BlazkowiczТак же как и применение сюда термина "кеш", который в комбинации с Map, обычно служит совершенно иным задачам.Отнюдь, код, приведенный автором, - как раз таки является классическим кэшем, только вместо операции put у него bulk update.[/quot]
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38648064
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
For AllНе самый лучший вариант кстати - зависимость класса Data на класс User - плохоНе зная контекста задачи такие выводы делать нельзя. Изначально ничего плохого в этом нет.
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38648068
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zig zuЯ правильно понимаю, что при вызове метода get в стеке потока будет создана копия ссылки на мапу data?Нет, не будет. Поэтому локальная переменная обязательна, если вы обращаетесь в get-методе к data больше, чем один раз, так как в противном случае вы рискуете нарваться на race condition, когда одна операция выполнена на одной мапе, а вторая уже на другой.
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38648069
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DEVcoachBlazkowicz- локальная переменная в get-методе лишняя, как и 2й get-методЛокальная переменная здесь кака раз таки является ключевым местом. Она вместе с модификатором volatile на data позволяет работать вообще без синхронизации.Отбой, это я про первый метод написал
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38648114
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoachУчитывая логику этого метода - полная перезапись всей мапы - synchronized здесь не нужен совершенно.
Не нужен здесь, значит нужен где-то ещё. Потому как автор хочет тяжелые вычисления делать где-то единственным потоком.

DEVcoachОтнюдь, код, приведенный автором, - как раз таки является классическим кэшем, только вместо операции put у него bulk update.
Кешем оно не является вообще, так как код автора сводиться к одному единственному volatile полю, в итоге. Смотри.
HashMap к вопросу отношения не имеет. Значит это любой бизнес объект.
Заполнять бизнес объект в методе updateData тоже смысла нет, можно заполнить и снаружи, передавая готовое значение. Ведь метод не synchronized, значит тяжелые вычисления делаются вне его.
Точно так же getData это лишь делегат для volatileField.get();

В итоге, всё сводиться к тому что кроме объявления волатайл поля, весь остальной код это шум. Поэтому назвать поле кэшем у меня язык не поворачивается.
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38648545
zig zu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczzig zuОбновлять может только один поток
"Я так сказал". Да? Других причин почему это так нет? Если без иронии, то вопрос простой. Кто гарантирует что это только один поток?

Я гарантирую. Это мое упущение при описании требований к моему кешу.
Есть специальный поток, который вызывает веб сервис и передает данные в полученном виде в метод updateData, там уже происходит конвертация и сохранение во внутреннею мапу.
В плане реализации это будет singleton ejb timer или спринговый шедулер.

В целом я убедился, что предложенный мной подход в первом посте будет работать. Всем спасибо.
...
Рейтинг: 0 / 0
Хороший у меня кеш получился?
    #38648567
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zig zuЯ гарантирую.

Ну, вот и я о том же.

zig zuЕсть специальный поток, который вызывает веб сервис и передает данные в полученном виде в метод updateData, там уже происходит конвертация и сохранение во внутреннею мапу.
В плане реализации это будет singleton ejb timer или спринговый шедулер.

Ню-ню.
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Хороший у меня кеш получился?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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