powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Вытесняющий кэш для высоконагруженной системы?
96 сообщений из 96, показаны все 4 страниц
Вытесняющий кэш для высоконагруженной системы?
    #39911342
GrossmasteR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые форумчане, здравствуйте! С рождеством!
Нужен ваш совет.
Очень нужно сделать тестовое задание.
Уровень знаний: +- основы JDBC и сервлетов без Spring.
Задание по ссылке. В какую сторону копать, пожалуйста, подскажите?
https://drive.google.com/open?id=1kcLCYtCkzDwNs0cFpDIZ-VpyOiX_Y3ed
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39911355
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что именно не понятно? Если всё, то это не ваш уровень.
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39911358
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GrossmasteR,

1) Тут я бы посмотрел стандарт javax.cache и много ли там надо реализовывать интерфейсов. Возможно есть какие-то простые примеры имплементаций. А дальше фантазия: как это сделать хорошо, в отдельном ли процессе и т.п. Возможно какой-то стандарт попроще поискать, если совсем плохо будет)
2) Тут посмотрел в сторону aspectj (или каких-нибудь других реализация аспектов) или триггеров на уровне субд
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39911359
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett
А что именно не понятно? Если всё, то это не ваш уровень.
Ну вот я прочел, мне, к примеру, совершенно непонятен скоуп, т.е. там может быть и просто ConcurrentMap<Object[], Value<Object>> (ну тут очевидно что с мутабельностью ключей будет хрень), обвешанный различного рода костылями, а может быть и такое, что хотят JCache (тут просто API нарисовать - это нифига не неделя работы и не пара). Ну и само задание какое-то корявое само по себе, потому что:
  • во-первых, в проекте код вида:
    Код: java
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
  • public Object get(Object arg1, Object arg2,...) {
  • Object[] key = new Object[] {arg1, arg2};
  • Value<?> result = cache().get(key);
  • if (result == null) {
  • result = new Value(doGet(arg1, arg2));
  • cache().put(key, result);
  • }
  • return result.getValue();
  • }

  • будет выглядеть ну очень плохо и нужно сразу уходить в сторону AOP, IoC/DI или банальной кодогенерации,
  • во-вторых, что кешировать и как инвалидировать - это больше про бизнеслогику
  • в-третьих, есть пункты вообще "так себе", например "Структуры данных должны иметь возможность быть разделены между двумя Java процессами" - здесь если мы за данными лезем не в память, а куда-то еще - то это уже не кеш, а целый новый слой (ну вот мне совсем не очевидно, что сходить за ФИО пользователя в базу дороже чем в какой-то другой сервис, соответственно это означает, что чтобы был профит в "кеширующем слое" данные должны лежать в более другом виде чем в БД).
  • ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39911360
    Дмитрий Мух
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Андрей Панфилов,

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

    первое, что приходит на ум - это декоратор над репозиторием реализовать: один, что кэширует в памяти, другой, что к примеру в Redis
    их сочетание и покроет все пункты
    так не делают, потому что универсальный "декоратор" написать нельзя - нужно вводить какие-то конвенции на названия методов, возвращаемые значения, передаваемые аргументы (ну вот тот же update/insert/delete со стороны жавы ничем не отличается от select, потому что и то и другое возвращает данные) и контекст (очевидно что пользователя через стэк таскать так себе удовольствие, в транзакциях не получать мусор тоже не хочется) - а это уже проще через аннотации и AOP разруливать.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39911377
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Не понял. Это ТЗ с ОРМ как соотносится?
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39911381
    Дмитрий Мух
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Андрей Панфилов
    Дмитрий Мух

    первое, что приходит на ум - это декоратор над репозиторием реализовать: один, что кэширует в памяти, другой, что к примеру в Redis
    их сочетание и покроет все пункты
    так не делают, потому что универсальный "декоратор" написать нельзя - нужно вводить какие-то конвенции на названия методов, возвращаемые значения, передаваемые аргументы (ну вот тот же update/insert/delete со стороны жавы ничем не отличается от select, потому что и то и другое возвращает данные) и контекст (очевидно что пользователя через стэк таскать так себе удовольствие, в транзакциях не получать мусор тоже не хочется) - а это уже проще через аннотации и AOP разруливать.

    не универсальный декоратор, а две реализации интерфейса Repository
    одна над кэшем в памяти, другая над Redis

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

    Код: 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.
    25.
    26.
    27.
    28.
    29.
    30.
    31.
    32.
    33.
    34.
    35.
    36.
    37.
    38.
    39.
    40.
    41.
    42.
    43.
    44.
    45.
    46.
    @Entity
    class Division {
      
      long id;
      String name;
    
    }
    
    @Entity
    class User {
       
       long id;
       String login;
       String name;
       Division division;
    
    }
    
    interface UserRepository {
      
       User getUserByLogin(String login);
    
       boolean save(User user);
    
    }
    
    @Service
    class UserServiceImpl {
    
       private final UserRepository userRepository;
    
       User getDivisionByLogin(String login) {
          return userRepository.getUserByLogin(String login).getDivision();
       }
    
       String getNameByLogin(String login) {
         return userRepository.getUserByLogin(String login).getName();
       }
    
      boolean changeLogin(String login) {
        User user = userRepository.getUserByLogin(String login);
        user.setLogin(login);
        userRepository.save(user);
      }
    
    }
    



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

    первый попавшийся пример: https://riptutorial.com/design-patterns/example/12135/caching-decorator
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39911406
    Андрей Панфилов
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Дмитрий Мух
    Андрей Панфилов,

    первый попавшийся пример: https://riptutorial.com/design-patterns/example/12135/caching-decorator
    Ну т.е. PoC для моего пример ждать не стоит?

    А вы разве не видите, что код:
    Код: java
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
        public Product GetProduct(int id)
        {
            var cacheKey = GetKey(id);
            var product = _cache.Get<Product>(cacheKey);
            if (product == null)
            {
                product = _decoratedRepository.GetProduct(id);
                _cache.Set(cacheKey, product, DateTimeOffset.Now.AddHours(ExpirationInHours));
            }
            
            return product;
        }
    


    и:
    Код: java
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    public Object get(Object arg1, Object arg2,...) {
       Object[] key = new Object[] {arg1, arg2};
       Value<?> result = cache().get(key);
       if (result == null) {
          result = new Value(doGet(arg1, arg2));
          cache().put(key, result);
       }
       return result.getValue();
    }
    



    суть одно и то же, причем оба говно (в вашем примере еще почему-то считается что отсутсвие данных - это не результат )
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39911418
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39911419
    Фотография Valentin Kolesnikov
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    GrossmasteR
    Уважаемые форумчане, здравствуйте! С рождеством!
    Нужен ваш совет.
    Очень нужно сделать тестовое задание.
    Уровень знаний: +- основы JDBC и сервлетов без Spring.
    Задание по ссылке. В какую сторону копать, пожалуйста, подскажите?
    https://drive.google.com/open?id=1kcLCYtCkzDwNs0cFpDIZ-VpyOiX_Y3ed


    Код для вытесняющий кэш для высоконагруженной системы.

    Код: 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.
    25.
    26.
    27.
    28.
    public class LruCache<K, V> {
            private static final boolean SORT_BY_ACCESS = true;
            private static final float LOAD_FACTOR = 0.75F;
            private final Map<K, V> lruCacheMap;
            private final int capacity;
    
            public LruCache(int capacity) {
                this.capacity = capacity;
                this.lruCacheMap = new LinkedHashMap<K, V>(capacity, LOAD_FACTOR, SORT_BY_ACCESS);
            }
    
            public V get(K key) {
                return lruCacheMap.get(key);
            }
    
            public void put(K key, V value) {
                if (lruCacheMap.containsKey(key)) {
                    lruCacheMap.remove(key);
                } else if (lruCacheMap.size() >= capacity) {
                    lruCacheMap.remove(lruCacheMap.keySet().iterator().next());
                }
                lruCacheMap.put(key, value);
            }
        }
    
        public static <K, V> LruCache<K, V> createLruCache(final int capacity) {
            return new LruCache<K, V>(capacity);
        }
    



    Хорошего вам дня!
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39911468
    Андрей Панфилов
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Valentin Kolesnikov,

    а где API-то?
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39911475
    Фотография Valentin Kolesnikov
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Андрей Панфилов
    Valentin Kolesnikov,

    а где API-то?


    Методы get и put.

    Хорошего вам дня!
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39911742
    Фотография Где-то в степи
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    GrossmasteR,
    как бы так и хочется сказать redis or memcached
    но запилить свой фреймворк имхо не тестовый контекст, хотя можно взять и готовые ...
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39911745
    Фотография mayton
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    В первом посте приаттачено абсолютно "сферическое" задание. В нем нет цифр. Нет количества активных
    пользователей. Транзакций в секунду. Или сетевых сокетов.

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

    Вобщем мне вспоминается сказка Буратино где "Сова" и "Жаба" решали что поциент
    Буратино скорее жив чем мёртв или наоборот.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39911747
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Магазин цветов для новичка как ТЗ выглядит лучше.
    Ставлю на то что ТС здесь не появится.
    Если я прав то ТЗ не для новичков.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39911873
    gycb
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    PetroNotC Sharp
    Магазин цветов для новичка как ТЗ выглядит лучше.
    Ставлю на то что ТС здесь не появится.
    Если я прав то ТЗ не для новичков.

    однозначно не для новичков
    но вот мне чо то захотелось это сделать)
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39911910
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    gycb,
    Сабж захотел? Не сделаешь. Да и ТЗ дурное.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39911940
    Дмитрий Мух
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Андрей Панфилов
    Дмитрий Мух
    Андрей Панфилов,

    первый попавшийся пример: https://riptutorial.com/design-patterns/example/12135/caching-decorator
    Ну т.е. PoC для моего пример ждать не стоит?

    PoC? Proof of concept? Вы ожидаете доказательства факта, что декораторы работают? Серъёзно?
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39911946
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Дмитрий Мух,
    Не надо думать что подходы шарп работают в java. Или подходы java работают в плюсах.
    А вести переписку с заблокированным мембером это верх цинизма.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39911998
    Фотография skyANA
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    PetroNotC Sharp
    Дмитрий Мух,
    Не надо думать что подходы шарп работают в java. Или подходы java работают в плюсах.
    А вести переписку с заблокированным мембером это верх цинизма.
    Декоратор - это шаблон проектирования.
    К конкретному языку и платформе он не привязан.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912019
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    skyANA,
    К топику шаблон привязать не получится. Тем более не программисту.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912023
    Фотография skyANA
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    PetroNotC Sharp
    skyANA,
    К топику шаблон привязать не получится. Тем более не программисту.
    Не понял мысль.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912029
    Фотография skyANA
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Начнём с простого:
    Код: java
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    14.
    15.
    16.
    17.
    18.
    19.
    20.
    public class UserRepositoryCacheDecorator extends UserRepository {
    
        private Cache cache;
        private UserRepository decorated;
    
        public UserRepositoryCacheDecorator(UserRepository decorated, Cache cache) {
            this.cache = cache;
            this.decorated = decorated;
        }
    
        @Override
        public User getUserByLogin(String login) {
            if(cache.contains(login)){
                return cache.load(login);
            }
            User user = decorated.getUserByLogin(login);
            cache.save(login, user);
            return user;
        }
    }
    


    Как зарегистрировать это в IoC-контейнере показывать, или сами догадаетесь?
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912044
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    skyANA,
    Теперь тестами покажи что ТЗ выполнил.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912061
    SpringMan
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    skyANA
    Начнём с простого:

    Тут скорее вопрос не в том, можно ли это сделать через декораторы, а можно ли сделать "хорошее кэш апи" через декораторы. Для каждого сервиса/репозитория писать свой декоратор? Через АОП это решается гораздо удобнее. Тот же spring cache как неплохой пример.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912063
    Фотография skyANA
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    SpringMan
    skyANA
    Начнём с простого:

    Тут скорее вопрос не в том, можно ли это сделать через декораторы, а можно ли сделать "хорошее кэш апи" через декораторы. Для каждого сервиса/репозитория писать свой декоратор? Через АОП это решается гораздо удобнее. Тот же spring cache как неплохой пример.
    А покажите код, если не сложно.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912066
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    SpringMan,
    Ну и в хибере есть два кеша. Второй выключен.
    Выше писал, что про ОРМ в тз непонятно.
    Написана фраза "структуры данных")))))
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912068
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    SpringMan,
    То есть с ОРМ есть кеш в спринге, хибере два штуки. Без ОРМ есть кеш на клиенте от драйвера. То есть он будет на АппСервере реально.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912070
    SpringMan
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    skyANA, к примеру:
    https://spring.io/guides/gs/caching/
    Код: java
    1.
    2.
    3.
    4.
    5.
    6.
      @Override
      @Cacheable("books")
      public Book getByIsbn(String isbn) {
        simulateSlowService();
        return new Book(isbn, "Some book");
      }
    



    Все в итоге сводится к аннотации над методом. Есть аналогичные @CacheEvict для инвалидации кешей и прочие мелкие радости )
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912072
    SpringMan
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    PetroNotC Sharp
    SpringMan,
    То есть с ОРМ есть кеш в спринге, хибере два штуки. Без ОРМ есть кеш на клиенте от драйвера. То есть он будет на АппСервере реально.

    В моей жизни, в хибере обычно без второго уровня. Просто если надо, то кэшируют через спринг на уровне серисов.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912083
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    SpringMan,
    Да. Там JPA рулит
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912088
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    skyANA
    PetroNotC Sharp
    skyANA,
    К топику шаблон привязать не получится. Тем более не программисту.
    Не понял мысль.

    Уже говорил, но вы забыли. Весь ваш опыт в шарп идет лесом в java.
    Так как вместо JPA у вас NPA который не применяют.
    Вместо спринга у вас EF, который совсем не спринг.
    И так далее.
    Пишите цветочный магазин.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912094
    gycb
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    SpringMan
    skyANA, к примеру:
    https://spring.io/guides/gs/caching/
    Код: java
    1.
    2.
    3.
    4.
    5.
    6.
      @Override
      @Cacheable("books")
      public Book getByIsbn(String isbn) {
        simulateSlowService();
        return new Book(isbn, "Some book");
      }
    



    Все в итоге сводится к аннотации над методом. Есть аналогичные @CacheEvict для инвалидации кешей и прочие мелкие радости )
    тоесть если я правильно понял - то эта анотация делает следущее
    при образщении к этому методу создает кеш- и если при следущем обращении пользователь попросит ту же самую книгу -она достанется из кэша?
    и еще вопрос для каких систем это акутально - например для систем с ожидаемым количеством юзеров от 20 до 50 единомоментно есть смысл анотировать особо горячие методы?
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912103
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    gycb,
    Нет смысла и даже вредно.
    У тебя база ненормализована и этот факт съедает все разговоры об эффективности кеша.
    Тормозит база, а ты снаружи пришлепку кеша))
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912105
    SpringMan
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    gycb

    тоесть если я правильно понял - то эта анотация делает следущее
    при образщении к этому методу создает кеш- и если при следущем обращении пользователь попросит ту же самую книгу -она достанется из кэша?
    и еще вопрос для каких систем это акутально - например для систем с ожидаемым количеством юзеров от 20 до 50 единомоментно есть смысл анотировать особо горячие методы?

    Концептуально, да. По сути она должна использовать javax.cache api (тут на 100% не уверен, всегда ли так - надо смотреть отдельно). Что и когда надо кэшировать это индивидуально: иногда помогает сильно, иногда больше проблем из-за инвалидации кэша и т.п. Тяжелые запросы, которые часто вызываются и редко меняют результат, - потенциально хорошее место для кеширования
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912127
    Фотография skyANA
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    PetroNotC Sharp
    skyANA
    пропущено...
    Не понял мысль.

    Уже говорил, но вы забыли. Весь ваш опыт в шарп идет лесом в java.
    Так как вместо JPA у вас NPA который не применяют.
    Вместо спринга у вас EF, который совсем не спринг.
    И так далее.
    Пишите цветочный магазин.
    И где же тут логика, может кто-нибудь объяснить? :)
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912129
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    skyANA,
    Вы съехали с темы.
    Передложили паттерн, покажите что решает задачу.
    Просили код? Вам пример кода спринга дали.
    Дальше никто ничего не обязан разжёвывать.
    Все работают. Некогда.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912143
    Фотография skyANA
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Петя в своём репертуаре: флудит.
    В игнор.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912145
    Фотография skyANA
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    SpringMan
    skyANA, к примеру:
    https://spring.io/guides/gs/caching/
    Код: java
    1.
    2.
    3.
    4.
    5.
    6.
      @Override
      @Cacheable("books")
      public Book getByIsbn(String isbn) {
        simulateSlowService();
        return new Book(isbn, "Some book");
      }
    



    Все в итоге сводится к аннотации над методом. Есть аналогичные @CacheEvict для инвалидации кешей и прочие мелкие радости )А на Save своя аннотация?
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912151
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    skyANA
    Петя в своём репертуаре: флудит.
    В игнор.
    это в который раз обещания?
    Уже и на майке писал, и скрипты всем раздавал.
    Игнорируй!
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912152
    Фотография skyANA
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    PetroNotC Sharp
    skyANA
    Петя в своём репертуаре: флудит.
    В игнор.
    это в который раз обещания?
    Уже и на майке писал, и скрипты всем раздавал.
    Игнорируй!
    У мобильной версии разметка отличается от стандартного дизайна. Вот скрипт и не отрабатывают.
    Переключаюсь обратно на стандартный дизайн.
    Пока, Петя :)
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912157
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    skyANA,
    Еще раз попрощайся))))
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912188
    SpringMan
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    skyANA
    А на Save своя аннотация?

    По сути с кешом что можно делать: положить значение для какого-то уникального ключа и сказать удалить его. Аннотации это и делают. @Cacheable - кладет в кэш (или берет, если уже есть), @CacheEvict - удаляет из кэша. Вот на save и надо @CacheEvict. Есть еще @CachePut, который всегда обновляет кэш - я им не пользовался, но по идее его над save-ом тоже можно/нужно использовать.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912204
    Фотография mayton
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Ну дай бох. Spring для нас всегда создавал иллюзию полного контроля. Только вот где та самая золотая "середина"?
    С одной стороны можешь всю БД в себя втянуть. И с другой стороны сделать этот механизм бесполезным передаточным
    звеном.

    P.S. There are only two hard things in Computer Science: cache invalidation and naming things.

    -- Phil Karlton
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912207
    вадя
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    mayton
    С одной стороны можешь всю БД в себя втянуть
    и нефиг какие-то базы использовать, что в них толку, только место занимают. то ли дело всё в памяти хранить, быстрее всё равно ничего нет.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912209
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    mayton

    P.S. There are only two hard things in Computer Science: cache invalidation and naming things.
    -- Phil Karlton

    "Сложнее всего в мире достигнуть простоты — это крайняя граница опыта и последнее усилие гения". © George Sand.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912211
    GrossmasteR
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    Valentin Kolesnikov
    GrossmasteR
    Уважаемые форумчане, здравствуйте! С рождеством!
    Нужен ваш совет.
    Очень нужно сделать тестовое задание.
    Уровень знаний: +- основы JDBC и сервлетов без Spring.
    Задание по ссылке. В какую сторону копать, пожалуйста, подскажите?
    https://drive.google.com/open?id=1kcLCYtCkzDwNs0cFpDIZ-VpyOiX_Y3ed


    Код для вытесняющий кэш для высоконагруженной системы.

    Код: 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.
    25.
    26.
    27.
    28.
    public class LruCache<K, V> {
            private static final boolean SORT_BY_ACCESS = true;
            private static final float LOAD_FACTOR = 0.75F;
            private final Map<K, V> lruCacheMap;
            private final int capacity;
    
            public LruCache(int capacity) {
                this.capacity = capacity;
                this.lruCacheMap = new LinkedHashMap<K, V>(capacity, LOAD_FACTOR, SORT_BY_ACCESS);
            }
    
            public V get(K key) {
                return lruCacheMap.get(key);
            }
    
            public void put(K key, V value) {
                if (lruCacheMap.containsKey(key)) {
                    lruCacheMap.remove(key);
                } else if (lruCacheMap.size() >= capacity) {
                    lruCacheMap.remove(lruCacheMap.keySet().iterator().next());
                }
                lruCacheMap.put(key, value);
            }
        }
    
        public static <K, V> LruCache<K, V> createLruCache(final int capacity) {
            return new LruCache<K, V>(capacity);
        }
    



    Хорошего вам дня!


    Здравствуйте. Может быть у вас есть возможность объяснить, как это работает? Или что нужно читать/смотреть/изучать, чтобы в этом разобраться?

    Признаться, я когда получил это задание, первая мысль была, это что, на древнеегипетском?
    Это были небольшие оффлайн-курсы, после которых одна организация, в случае успешной защиты итогового проекта, обещалась позвать на собеседование. Итоговый проект был веб-сервис без использования Spring поисковая система: загружаешь текстовые файлы, вводишь поисковый запрос, получаешь файл со строчками в которых содержится поисковый запрос, желательно с многопоточностью.
    После итогового, они сказали, мол, ну будем считать, что на ваш код мы посмотрели, теперь дадим вам задание, чтобы посмотреть, как выдумаете.
    Серьезно? Это вот это вот посмотреть, как мы думаем? Над чем? Это что, новогодний розыгрыш был? Ну типа люди знали наш уровень, что мы худо бедно что-то понимаем в Java Syntax, Core, Collections, имеем какое-то отдаленное представление о Multithreading, SQL, JAVA EE. И дают вот такое задание, которое не похоже на задание для предJunior/Junior.
    Я до сих пор допускаю мысль, что они либо перепутали ТЗ, либо сделали это специально, чтобы нас слить по какой-то причине.

    Ладно с лирическим отступлением все. Как это изучить? Может быть какие-то книги/курсы есть?

    P.S. "...По времени жёсткой привязки нет, главное что бы соискатели озвучили срок и уложились в него..." А препод по курсам нам сказал: "По задачкам : они на самом деле не сложные, вам нужно просто:
    1. Загуглить все умные слова и понять, что они значат
    2. Упростить задачу (не переусложнять решение) - на самом деле оно на поверхности и достаточно просто гуглится (нужно будет изучить штук 5-6 ссылок в результатах Google)"
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912215
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    GrossmasteR,
    Что вам мешает прямо сейчас начать демку проект?
    Именно так тут один мембер разобрался со spring MVC).
    Либо через пару дней будет ясно что вы не тянете.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912217
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Нельзя изучать кеш, если под ним нет работающего проекта.
    Так как сабж это тюнинг.
    Пригоняют машину и вы ее тюните.
    А тут и машины то нет. Только бла бла бла.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912219
    Фотография mayton
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Господин который писал статью на Хабре про 2Q, хотя-бы гнал тесты на своем Андроидном приложении.
    Это кстати очень сильный поинт. Кеш - тюнится под конкретную специфику потока данных:
    1) Гистограмму
    2) Авто-корреляцию данных
    В случае с 2Q сыграло свойство оконных приложений и UI. Если пользователь смотрел картинку и через пару
    интеракций еще раз эту картинку - следовательно она - hot с точки зрения приложения. Это как раз и есть
    авто-корреляция. Или некое специфичное поведение API.

    Если-бы он просто искал идеальный кеш без привязки к чему либо - ну использовал бы LRU до сих пор.
    LRU хорошо закрывает глобальную гистограмму но плохо реагируют на изменения в динамике.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912238
    gycb
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    GrossmasteR,
    тебе ж сказали созадай базу ,пиши репу
    в сервисах вешай на методы Кеш анотации
    дел на час

    а вообще конечно задание не на джуна это 100% хоть оно и легкое - но как тут верно заметили -это тюнинг,а прежде чем тюнить ,нужно научиться строить фундамент ,стены ,окна и двери)
    что за контора то не ЕПУМ случаем ?
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912247
    Локшин Марк
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    GrossmasteR
    Уважаемые форумчане, здравствуйте! С рождеством!
    Нужен ваш совет.
    Очень нужно сделать тестовое задание.
    Уровень знаний: +- основы JDBC и сервлетов без Spring.
    Задание по ссылке. В какую сторону копать, пожалуйста, подскажите?
    https://drive.google.com/open?id=1kcLCYtCkzDwNs0cFpDIZ-VpyOiX_Y3ed

    По первому заданию - изучить guava cache , отрезать от него лишнее.
    По второму заданию - я бы не сказал, что оно сложнее, но человек, который его формулировал путается в показаниях. В начале им нужен алгоритм контроля изменения схемы данных, потом они хотят (вроде бы) контролировать изменения самих данных.
    Один из вариантов решения - только код на Java, тогда какие могут быть оценки планов исполнения запросов?
    Создается впечатление, что человек, который писал задание, не понимает, что он хочет. Я вот перечитал задание несколько раз, и так и не понял, какую проблему пытаются решить.
    Не знаю, хотят ли вас "слить" после курсов (я так понимаю, что лучших обещали трудоустроить), но работать с такими чудаками - себе дороже.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912248
    Локшин Марк
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    gycb
    GrossmasteR,
    тебе ж сказали созадай базу ,пиши репу
    в сервисах вешай на методы Кеш анотации
    дел на час

    А если сперва задание прочитать? Ему нужно написать свой собственный кэш. База для этого ему не нужна от слова совсем.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912249
    gycb
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    Локшин Марк
    gycb
    GrossmasteR,
    тебе ж сказали созадай базу ,пиши репу
    в сервисах вешай на методы Кеш анотации
    дел на час

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

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

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

    а если сперва автора почитать? на джуна писать свой кэш?))

    Я прочитал
    GrossmasteRЯ до сих пор допускаю мысль, что они либо перепутали ТЗ, либо сделали это специально, чтобы нас слить по какой-то причине.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912281
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    gycb

    что за контора то не ЕПУМ случаем ?

    Автор топика своеобразный.
    Заходи раз в страницу, топик не сопровождает, на вопросы не отвечает.
    Только выкладывает много букв не по теме, а о жизни.
    Думаю проект не начнёт.))
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912316
    gycb
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    Локшин Марк,ну и у тебя еще есть вопросы?
    ТЗ не адекватное для джуна-джун не должен знать и уметь тюнить приложение,он должен уметь его для начала построить
    Посему либо перепутали ТЗ,либо культурно нах послали
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912322
    Локшин Марк
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    gycb, Если это Java джун, а в программировании опыт есть, то задания +- нормальные. Если человек начал изучать программирование с Java пойдя на эти курсы, то он такое не потянет. Может они таланты таким образом ищут, а может и нах. послали, кто их знает.
    Но. Если прочитать 2 задание, то для меня вполне очевидно, что не следует с ними связываться. Т.к. если у них такого уровня ТЗ, то потом по-любому будешь кругом в дураках.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912363
    GrossmasteR
    А препод по курсам нам сказал: "По задачкам : они на самом деле не сложные, вам нужно просто:
    1. Загуглить все умные слова и понять, что они значат
    2. Упростить задачу (не переусложнять решение) - на самом деле оно на поверхности и достаточно просто гуглится (нужно будет изучить штук 5-6 ссылок в результатах Google)"


    http://www.javaspecialist.ru/2012/02/java-lru-cache.html
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912378
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    сладкий бубалех
    GrossmasteR
    А препод по курсам нам сказал: "По задачкам : они на самом деле не сложные, вам нужно просто:
    1. Загуглить все умные слова и понять, что они значат
    2. Упростить задачу (не переусложнять решение) - на самом деле оно на поверхности и достаточно просто гуглится (нужно будет изучить штук 5-6 ссылок в результатах Google)"


    http://www.javaspecialist.ru/2012/02/java-lru-cache.html

    Походу ТЗ на поиски архитектора а не программиста.
    Так широко его можно толковать.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912393
    gycb
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    Локшин Марк
    gycb, Если это Java джун, а в программировании опыт есть, то задания +- нормальные. Если человек начал изучать программирование с Java пойдя на эти курсы, то он такое не потянет. Может они таланты таким образом ищут, а может и нах. послали, кто их знает.
    Но. Если прочитать 2 задание, то для меня вполне очевидно, что не следует с ними связываться. Т.к. если у них такого уровня ТЗ, то потом по-любому будешь кругом в дураках.

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

    что за контора то не ЕПУМ случаем ?

    Автор топика своеобразный.
    Заходи раз в страницу, топик не сопровождает, на вопросы не отвечает.
    Только выкладывает много букв не по теме, а о жизни.
    Думаю проект не начнёт.))

    У него - 4 поста в статистике. Я таких называю - "рыболовами". Постят один и тот-же пост в много сайтов-форумов. Потом сидят и ждут когда
    какой-то наивный лопух им все распишет и сделает их курсовую.

    Убежден что если вы погуглите - найдете дубли его постов в rsdn/cyberforum e.t.c.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912629
    Фотография Valentin Kolesnikov
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    mayton
    PetroNotC Sharp
    пропущено...

    Автор топика своеобразный.
    Заходи раз в страницу, топик не сопровождает, на вопросы не отвечает.
    Только выкладывает много букв не по теме, а о жизни.
    Думаю проект не начнёт.))

    У него - 4 поста в статистике. Я таких называю - "рыболовами". Постят один и тот-же пост в много сайтов-форумов. Потом сидят и ждут когда
    какой-то наивный лопух им все распишет и сделает их курсовую.

    Убежден что если вы погуглите - найдете дубли его постов в rsdn/cyberforum e.t.c.


    Кстати, да.

    Хорошего вам вечера!
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912632
    Фотография mayton
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Тема кешей - вялая получилась. Надо - закрывать как в Stackoverflow. С резолюцией - нечего обсуждать.

    Напишу модератору.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912634
    вадя
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    mayton
    Надо - закрывать как в Stackoverflow. С резолюцией - нечего обсуждать.
    там это любят. вот только закрывальщики там нифига не понимают в том что закрывают.
    всё-таки здесь намного лучше чем на ruSO и хабре
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39912657
    andreykaT
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    gycb
    Локшин Марк,ну и у тебя еще есть вопросы?
    ТЗ не адекватное для джуна-джун не должен знать и уметь тюнить приложение,он должен уметь его для начала построить
    Посему либо перепутали ТЗ,либо культурно нах послали

    либо хотят не джуна но будут обзывать его джуном.

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

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

    ну или если типовое тз как у тех вилей (гуглится на раз-два в инете тз) - берем копипастим чутка обфусцируем и пусть втыкают.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916183
    Андрей Панфилов
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    skyANA
    Начнём с простого:
    Код: java
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    14.
    15.
    16.
    17.
    18.
    19.
    20.
    public class UserRepositoryCacheDecorator extends UserRepository {
    
        private Cache cache;
        private UserRepository decorated;
    
        public UserRepositoryCacheDecorator(UserRepository decorated, Cache cache) {
            this.cache = cache;
            this.decorated = decorated;
        
  • }
  • @Override public User getUserByLogin(String login) {
  • if(cache.contains(login)){
  • return cache.load(login);
  • }
  • User user = decorated.getUserByLogin(login); cache.save(login, user); return user;
  • }
  • }


  • Как зарегистрировать это в IoC-контейнере показывать, или сами догадаетесь?


    Ну давайте отрезюмируем:
    • на один метод +10 строк кода
    • поскольку появляются новые поля, то вероятность ошибки довольно высока (ну начинаем тянуть не из того кеша, а ключи пересекаются) - под такие кейсы нужно специально тесты продумывать
    • изначально просили API, API никакого нет (ну вот примера с evict я не увидел)
    • тема мутабельных ключей не раскрыта
    • тема мутабельного результата не раскрыта
    • вот это вообще песня:
      Код: java
      1.
      2.
      3.
      4.
    • if(cache.contains(login)){
    • return cache.load(login);
    • }

  • можно просто на return null заменить - работать будет гораздо стабильнее и быстрее
  • ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916196
    Фотография skyANA
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Андрей Панфилов
    skyANA
    Начнём с простого:
    Код: java
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    14.
    15.
    16.
    17.
    18.
    19.
    20.
    21.
    
    public class UserRepositoryCacheDecorator extends UserRepository {
    
        private Cache cache;
        private UserRepository decorated;
    
        public UserRepositoryCacheDecorator(UserRepository decorated, Cache cache) {
            this.cache = cache;
            this.decorated = decorated;
        
  • }
  • @Override public User getUserByLogin(String login) {
  • if(cache.contains(login)){
  • return cache.load(login);
  • }
  • User user = decorated.getUserByLogin(login); cache.save(login, user); return user;
  • }
  • }
  • Как зарегистрировать это в IoC-контейнере показывать, или сами догадаетесь?
    Ну давайте отрезюмируем:
    • на один метод +10 строк кода
    • поскольку появляются новые поля, то вероятность ошибки довольно высока (ну начинаем тянуть не из того кеша, а ключи пересекаются) - под такие кейсы нужно специально тесты продумывать
    • изначально просили API, API никакого нет (ну вот примера с evict я не увидел)
    • тема мутабельных ключей не раскрыта
    • тема мутабельного результата не раскрыта
    • вот это вообще песня:
      Код: java
      1.
      2.
      3.
      4.
    • if(cache.contains(login)){
    • return cache.load(login);
    • }
    можно просто на return null заменить - работать будет гораздо стабильнее и быстрее
    Критикуешь - покажи как надо. Давай, раскрой полностью свою идею с примерами кода, отражающими то, что ты ожидаешь от других.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916200
    Фотография skyANA
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Андрей Панфилов,

    у нас на проекте используются и аннотации, и декораторы
    метрики показывают, что все очень стабильно, и очень быстро

    можешь продолжать дальше злорадствовать :)
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916203
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    skyANA,
    Твой опыт в шарпе нельзя проецировать на Java.
    И метрики ваши тоже.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916212
    Андрей Панфилов
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    skyANA
    Критикуешь - покажи как надо.
    Давай, раскрой полностью свою идею с примерами кода, отражающими то, что ты ожидаешь от других.
    Зачем? я на первой странице вполне недвусмысленно объяснил, что там должен быть или AOP или кодогенерация, но кто-то до сих пор зашорен паттернами, да еще и любит обсираться, я конечно понимаю, что agile это наше все и нужно всенепременно всем ссать в уши про его преимущества - но конкретно этот форум не про это.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916227
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Дмитрий Мух,
    Самоутвержайся кодом, раз в гостях.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916271
    Андрей Панфилов
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    PetroNotC Sharp
    Твой опыт в шарпе нельзя проецировать на Java.
    в шарпе
    Код: java
    1.
    2.
    3.
            if(cache.contains(login)){
                return cache.load(login);
            }
    

    разве вернет что-то отличное от мусора? как-то не верится.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916274
    Фотография skyANA
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Андрей Панфилов
    PetroNotC Sharp
    Твой опыт в шарпе нельзя проецировать на Java.
    в шарпе
    Код: java
    1.
    2.
    3.
            if(cache.contains(login)){
                return cache.load(login);
            }
    


    разве вернет что-то отличное от мусора? как-то не верится.

    Хорошо, давай пойдём дальше:
    Код: java
    1.
    2.
    3.
            if(cache.contains(cacheKey)){
                return cache.load(cacheKey);
            }
    


    Так устраивает?
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916285
    PetroNotC Sharp
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Андрей Панфилов,
    Вы правы конечно про кусок кода.
    Я про его остальные "доказательства" типа: "у меня в шарпе всё работает и машина у меня самая крутая").
    Сразу перешел на терминологию "сам ты такой и слив защитан и т.д.
    Разговаривать предметно с шарпистами очень тяжело так как ЯП проще чем java. Наши трудятся в свободное время, а они отдыхают)
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916291
    Андрей Панфилов
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    skyANA
    Хорошо, давай пойдём дальше:
    Код: java
    1.
    2.
    3.
            if(cache.contains(cacheKey)){
                return cache.load(cacheKey);
            }
    


    Так устраивает?
    А что поменялось-то? Сколько спринтов нужно чтобы увидеть ошибку?
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916297
    Фотография skyANA
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Андрей Панфилов
    skyANA
    Хорошо, давай пойдём дальше:
    Код: java
    1.
    2.
    3.
            if(cache.contains(cacheKey)){
                return cache.load(cacheKey);
            }
    



    Так устраивает?
    А что поменялось-то?

    Получили для сущности ключ кэширования, что будет другим, если что-то изменится.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916303
    Андрей Панфилов
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    skyANA
    Получили для сущности ключ кэширования, что будет другим, если что-то изменится.
    Ладно, вот наводящие вопросы для особо одаренных:
    • почему здесь утверждается что API - это get и put?
    • почему здесь мне в голову не пришло использовать containsKey, а вместо этого какой-то стремный Value<?>?
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916320
    Фотография skyANA
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Андрей Панфилов
    skyANA
    Получили для сущности ключ кэширования, что будет другим, если что-то изменится.
    Ладно, вот наводящие вопросы для особо одаренных:
    • почему здесь утверждается что API - это get и put?
    • почему здесь мне в голову не пришло использовать containsKey, а вместо этого какой-то стремный Value<?>?
    О, наконец-то я понял суть придирки.

    Хорошо, буду возвращать некий OperationResult, имеющий статус успешно всё прошло, или ключ не найден, или таймаут, или...
    Куча других статусов.

    Для вызывающего сервиса-то какая разница?
    У него как был интерфейс Repository, что возвращает сущности, так и остался.

    О том, что есть некий декоратор, знает только IoC-контейнер.

    С другой стороны Cache - это тоже просто интерфейс.
    Реализацией может быть кэш в памяти, кэш в Redis, Couchbase, Memcached.
    Многоуровневый кэш, являющийся их комбинацией.

    И вся ботва с обработкой OperationResult и отображением на сущности будет скрыта внутри реализаций.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916327
    Андрей Панфилов
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    skyANA

    О, наконец-то я понял суть придирки.
    ..
    И вся ботва с обработкой OperationResult и отображением на сущности будет скрыта внутри реализаций.
    Расскажите, в вашем абрикосе все такие "одаренные" или только вы?

    Код: java
    1.
    2.
    3.
    if(cache.contains(cacheKey)){ // здесь вернулось true, потому что на момент запроса там что-то действительно было
        return cache.load(cacheKey); // тут вернулся null потому что объект успел мутировать
    }
    



    Андрей Панфилов
    Сколько спринтов нужно чтобы увидеть ошибку?
    Итого, за 4 тыканья носом в 3 строчки кода ошибка так и не была локализована, так что у заказчика с нытьем "оно иногда работает как-то не так" вообще нет никаких шансов. аджайл такой аджайл...
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916331
    Фотография skyANA
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Андрей Панфилов
    skyANA

    О, наконец-то я понял суть придирки.
    ..
    И вся ботва с обработкой OperationResult и отображением на сущности будет скрыта внутри реализаций.
    Расскажите, в вашем абрикосе все такие "одаренные" или только вы?

    Код: java
    1.
    2.
    3.
    if(cache.contains(cacheKey)){ // здесь вернулось true, потому что на момент запроса там что-то действительно было
        return cache.load(cacheKey); // тут вернулся null потому что объект успел мутировать
    }
    




    Андрей Панфилов
    Сколько спринтов нужно чтобы увидеть ошибку?
    Итого, за 4 тыканья носом в 3 строчки кода ошибка так и не была локализована, так что у заказчика с нытьем "оно иногда работает как-то не так" вообще нет никаких шансов. аджайл такой аджайл...

    И зачем быть таким мудаком, интересно )))

    Хорошо, пример не кошерный вышел, он был просто иллюстрацией того, что есть декоратор.

    Так устроит?
    Код: java
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    var entity = cache.get(id);
    
    if (entity != null) {
        return entity;
    }
    
    entity = decorated.get(id);
    
    if (entity != null) {
        cache.set(entity);
    }
    
    return entity;
    
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916335
    Фотография skyANA
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    За исключением нескольких дополнительных проверок у нас работает по сути именно такой код.
    За более чем 6 лет его эксплуатации не было ни одного случая "оно иногда работает как-то не так".

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

    skyANA
    Так устроит?
    Код: java
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    var entity = cache.get(id);
    
    if (entity != null) {
        return entity;
    }
    
    entity = decorated.get(id);
    
    if (entity != null) {
        cache.set(entity);
    }
    
    return entity;
    

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

    Код был просто иллюстрацией. Я же не знал, что вы его за продакшн реди сочтёте.
    Теперь буду знать :)
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916340
    Фотография skyANA
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Андрей Панфилов
    skyANA
    Так устроит?
    Код: java
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    var entity = cache.get(id);
    
    if (entity != null) {
        return entity;
    }
    
    entity = decorated.get(id);
    
    if (entity != null) {
        cache.set(entity);
    }
    
    return entity;
    


    Ошибку сами найдете или тоже придется ткнуть носом?

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

    почитал на сайте у вас про вашу методологию, тоже итеративная с элементами SCRUM
    любопытно, что не так?
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39916344
    Фотография skyANA
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    skyANA
    За исключением нескольких дополнительных проверок у нас работает по сути именно такой код.
    За более чем 6 лет его эксплуатации не было ни одного случая "оно иногда работает как-то не так".

    Системой пользуется более 26000 организаций на данный момент. Десятки миллионов пользователей ежедневно.

    В среднем 750 op. per second (500-1000), 99.8% hit ratio
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39919619
    GrossmasteR
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    Уважаемые форумчане, здравствуйте.
    Нужен ваш совет.

    Я взял реализацию уважаемого Валентина Колесникова,
    22054598
    Изучил статью, которую посоветовал уважаемый сладкий бубалех
    22056341
    И добавил в конструктор
    Код: java
    1.
    2.
    3.
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {  
      return size() > MAX_CAPACITY;   
        }
    


    а также завернул в
    Код: java
    1.
    Collections.synchronizedMap();
    



    Получилась вот такая простая реализация Java LRU cache:
    Код: 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.
    25.
    26.
    27.
    28.
    29.
    30.
    31.
    32.
    33.
    34.
    35.
    36.
    37.
    38.
    39.
    40.
    41.
    42.
    43.
    44.
    45.
    46.
    47.
    48.
    49.
    50.
    51.
    52.
    53.
    54.
    55.
    56.
    57.
    58.
    59.
    60.
    61.
    62.
    63.
    64.
    65.
    66.
    67.
    68.
    69.
    70.
    71.
    72.
    73.
    74.
    75.
    76.
    import java.util.Collections;
    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.Objects;
    
    /**
     * An LRU cache, based on LinkedHashMap
     * This cache has a fixed maximum number of elements (<code>mCapacity</code>).
     * If the cache is full and another entry is added, the LRU (least recently used) entry is dropped.
     *
     * @param <K> the type of the cache keys
     * @param <V> the type of the cache values
     */
    
    public class LruCache<K, V> {
        private static final boolean sSORT_BY_ACCESS = true;
        private static final float sLOAD_FACTOR = 0.75F;
        private final Map<K, V> mLruCacheMap;
        private final int mCapacity;
    
        /**
         * Constructor
         * <p>
         * If the cache is to be used by multiple threads, the cache must be wrapped with code to synchronize the methods
         *
         * @param capacity the limit of objects that are kept in the cache
         */
    
        public LruCache(int capacity) {
            this.mCapacity = capacity;
            this.mLruCacheMap = Collections.synchronizedMap(new LinkedHashMap<K, V>(capacity, sLOAD_FACTOR, sSORT_BY_ACCESS) {
                public boolean removeEldestEntry(Map.Entry eldest) {
                    return size() > capacity;
                }
            });
        }
    
        /**
         * Returns the object to which this object cache maps the specified key
         *
         * @param key key with which the specified value is to be associated
         * @return the value to which this object cache maps the specified key, or null if the object cache contains no mapping for the key
         */
    
        public V get(K key) {
            Objects.requireNonNull(key, "key == null");
            synchronized (this) {
                V value = mLruCacheMap.get(key);
                if (value != null) {
                    return value;
                }
            }
            return null;
        }
    
        /**
         * Associates the specified value with the specified key in this object cache. If the object cache previously contained a mapping for this key, the old value is replaced
         *
         * @param key   key with which the specified value is to be associated
         * @param value value to be associated with the specified key
         */
    
        public boolean put(K key, V value) {
            boolean exist = false;
            Objects.requireNonNull(key, "key == null");
            Objects.requireNonNull(value, "value == null");
            if (mLruCacheMap.containsKey(key)) {
                exist = true;
                mLruCacheMap.remove(key);
            } else if (mLruCacheMap.size() >= mCapacity) {
                mLruCacheMap.remove(mLruCacheMap.keySet().iterator().next());
            }
            mLruCacheMap.put(key, value);
            return exist;
        }
    }
    



    Вопрос, а как мне написать юнит тесты? На что тестировать?
    Пробую как-то так:
    Код: java
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    @Test
        void get() {
            LruCache<Object, Object> test = new LruCache<>(1);
            {
                assertNull(test.get(1));
            }
            {
                test.put(1, "one");
                assertEquals("one", test.get(1));
            }
        }
    



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

    P.S. И кстати, вопрос, а если я делаю так
    Код: java
    1.
    2.
    3.
    4.
    5.
     this.mLruCacheMap = Collections.synchronizedMap(new LinkedHashMap<K, V>(capacity, sLOAD_FACTOR, sSORT_BY_ACCESS) {
                public boolean removeEldestEntry(Map.Entry eldest) {
                    return size() > capacity;
                }
            })
    



    то нужна ли мне вообще логика в методе put?
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39919625
    Фотография mayton
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    GrossmasteR, если ты дошел до того что начал делать LRU-кеши - то у тебя видимо есть какая-то перформансная
    проблема. Иначе тебе-б LRU был-бы не нужен. Верно?

    В этом случае ты делаешь 2 имплементации твоей бизнес-логики. Без LRU. И с использованием LRU.
    И в конце просто делаешь некое общее утверждение что время работы стало на 200% быстрее (к примеру).

    На этом пожалуй всё. Придумать какие-то синтетические тесты на LRU очень сложно.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39919633
    Leonid Kudryavtsev
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    mayton
    начал делать LRU-кеши - то у тебя....

    нехватает памяти
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39919634
    Leonid Kudryavtsev
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    mayton
    Придумать какие-то синтетические тесты на LRU очень сложно.

    банальное: кол-во put и get из разных потоков в секунду

    как меряют всякие message queue, получая сотни миллионов сферических мессаджей в секунду )))
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39919639
    Фотография mayton
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Leonid Kudryavtsev
    mayton
    начал делать LRU-кеши - то у тебя....

    нехватает памяти

    Это две стороны одной медали.
    ...
    Рейтинг: 0 / 0
    Вытесняющий кэш для высоконагруженной системы?
        #39919643
    Фотография mayton
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Leonid Kudryavtsev
    mayton
    Придумать какие-то синтетические тесты на LRU очень сложно.

    банальное: кол-во put и get из разных потоков в секунду

    как меряют всякие message queue, получая сотни миллионов сферических мессаджей в секунду )))

    А с чем сравнивать? Должен быть какой-то baseline. Или какая-то мера.

    Иначе как ты примешь решение о том что кеш реализован эффективно?
    Просто работает? Correctness - это не наш вопрос. У нас вопрос эффективности.
    ...
    Рейтинг: 0 / 0
    96 сообщений из 96, показаны все 4 страниц
    Форумы / Java [игнор отключен] [закрыт для гостей] / Вытесняющий кэш для высоконагруженной системы?
    Целевая тема:
    Создать новую тему:
    Автор:
    Закрыть
    Цитировать
    Найденые пользователи ...
    Разблокировать пользователей ...
    Читали форум (0):
    Пользователи онлайн (0):
    x
    x
    Закрыть


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