是否可以查询Hazelcast缓存?如果是,该怎么办?

时间:2018-11-19 06:34:07

标签: java spring caching hazelcast hazelcast-imap

我正在尝试使用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 :(得分:0)

请查看Hazelcast提供的MapLoader。 https://docs.hazelcast.org/docs/3.8/javadoc/com/hazelcast/core/MapLoader.html

您将必须实现loadAll,这将是对findAllGames()的调用,该调用会将密钥另存为对象的gameType。

任何要加载的调用都应该是findGameByTypes调用,如果它无法在缓存中找到数据,则将调用该调用。

请访问此博客,以确保您了解所涉及的陷阱。 https://dzone.com/articles/hazelcasts-maploader-pitfalls

答案 1 :(得分:0)

您可以使用谓词或SqlQuery查询Hazelcast映射/缓存。在此处查看详细文档:https://docs.hazelcast.org/docs/3.11/manual/html-single/index.html#distributed-query

答案 2 :(得分:0)

如@wildnez所建议,您可以使用PRedicate和/或SQLQuery。另外,由于您使用的是Spring,因此您还可以受益于Spring-Data-Hazelcast项目,该项目会自动从方法名称https://github.com/hazelcast/spring-data-hazelcast

为您生成查询

但是您需要更改缓存方式。您应该使用键findAllGames将所有游戏存储在一个集合中,而不是在缓存中仅包含一个条目,而应将所有条目分别存储在缓存中,gameId作为键,Game作为值。这样,您可以使用任何一种方法查询值。