【问题标题】:Is it possible to query Hazelcast Cache? If yes, How to do it?是否可以查询 Hazelcast 缓存?如果是,该怎么做?
【发布时间】:2018-11-19 06:34:07
【问题描述】:

我正在尝试使用 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 属性作为条件来查询地图。

有什么方法可以实现吗?我也愿意接受其他建议。

【问题讨论】:

    标签: java spring caching hazelcast hazelcast-imap


    【解决方案1】:

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

    但是你需要改变你的缓存方式。与其在缓存中只有一个条目,使用键 findAllGames 并将所有游戏存储在一个集合中,不如将所有条目单独存储在缓存中,gameId 作为键,Game 作为值。这样您就可以使用任一方法查询值。

    【讨论】:

      【解决方案2】:

      您可以使用 Predicate 或 SqlQuery 查询 Hazelcast Map/Cache。在此处查看详细文档:https://docs.hazelcast.org/docs/3.11/manual/html-single/index.html#distributed-query

      【讨论】:

      • 是的,我已经调查过了。我按照使用标准 Api 进行查询中的员工示例进行操作。但是我怀疑这会返回 hazelcastInstance.getMap("findAllGames") 吗?以“findAllGames”为键,以 List 为值的地图。如果是,如何构造谓词来查询缓存?
      【解决方案3】:

      请查看 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

      【讨论】:

      • 我已为问题添加了更多详细信息。它可以让我对我想要达到的目标有一个公平的想法。您能否详细说明您的答案或提供一个示例?
      • 感谢您的澄清。 Hazelcast 确实支持基于条件的查询。 docs.hazelcast.org/docs/3.7/manual/html-single/… 。您需要设置一个谓词。我还没有尝试过复合对象,但对于简单的对象,它应该可以工作。请试一试,让我们知道
      • 我已经浏览了那个链接。这里我的缓存名称是“gamesCache”,我使用的键是“findAllGames”。在“使用 Criteria Api 查询”部分的链接中提供的示例中,他们执行此操作 IMap map = hazelcastInstance.getMap("employee");我很难理解这会返回什么。我的意思是这张地图的键和值是什么?
      • 您正在使用键作为方法名称创建缓存。取而代之的是,您可以使用检索到的游戏数据继续查询存储库,并将它们保存到 Hazelcast 地图中,其中 gameId 作为键,游戏作为对象。 Hazelcast 将其数据存储在地图中,因此您需要将数据与相同的模式对齐
      猜你喜欢
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      相关资源
      最近更新 更多