Можно ли запросить Hazelcast Cache? Если да, как это сделать? - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь реализовать кэширование с помощью hazelcast.

Вот мой код. Мой вопрос заключается в том, что при выполнении findAllGames () я кэширую все игры в "gamesCache", а когда выполняется findGameByTypes (), я хочу, чтобы он запрашивал "gamesCache" вместо обращения к базе данных и возвращал результат.

@Cacheable(cacheNames = "gamesCache", key = "#root.methodName")
public List<Game> findAllGames() {
    List<Game>  games = gamesDao.getAllGames(); // dao call
    //some database call
}

public List<Game> findGameByTypes(GameType gameType) {
    List<Game> games = gamesDao.getGamesByType(gameType); // dao call
    //some logic
}

public class Game implements Serializable {
    private long gameId;
    private String gameName;
    private GameType gameType;
}

public class GameType implements Serializable {
   private long gameId;
   private String gameGenre;
   private Boolean status;
}

findAllGames () всегда вызывается первым, чем findGamesByTypes ().

Теперь кешированная карта генерируется с ключом findAllGames и списком игр в качестве значения. Есть ли способ сделать запрос карты, используя атрибуты GameType в качестве критерия.

Есть ли способ реализовать это? Я открыт и для других предложений.

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Вы можете запросить Hazelcast Map / Cache, используя Predicate или SqlQuery. Ознакомьтесь с подробной документацией здесь: https://docs.hazelcast.org/docs/3.11/manual/html-single/index.html#distributed-query

0 голосов
/ 20 ноября 2018

Как рекомендует @wildnez, вы можете использовать PRedicate и / или SQLQuery. Кроме того, поскольку вы используете Spring, вы также можете воспользоваться проектом Spring-Data-Hazelcast, который автоматически генерирует для вас запросы из имени метода: https://github.com/hazelcast/spring-data-hazelcast

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

0 голосов
/ 19 ноября 2018

Пожалуйста, ознакомьтесь с MapLoader, предоставленным Hazelcast.https://docs.hazelcast.org/docs/3.8/javadoc/com/hazelcast/core/MapLoader.html

Вы должны будете реализовать loadAll, который будет вызывать ваш findAllGames (), который сохранит ключ как gameType для объекта.

Любой вызов для загрузки должен бытьвызовите findGameByTypes, который будет вызван, если он не сможет найти данные в кэше.

Загляните в этот блог, чтобы убедиться, что вы понимаете все подводные камни.https://dzone.com/articles/hazelcasts-maploader-pitfalls

...