是否可以查询 Hazelcast 缓存?如果是,该怎么做?
Is it possible to query Hazelcast Cache? If yes, How to do it?
我正在尝试使用 hazelcast 实现缓存。
这是我的代码。我的问题是,当 findAllGames() 被执行时,我正在缓存 "gamesCache" 中的所有游戏,当 findGameByTypes() 被执行时,我希望它查询 "gamesCache" 而不是访问数据库和 return结果。
@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属性作为标准来查询地图吗?
有什么办法可以实现吗?我也愿意接受其他建议。
请看一下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
您可以使用 Predicate 或 SqlQuery 查询 Hazelcast Map/Cache。在此处查看详细文档:https://docs.hazelcast.org/docs/3.11/manual/html-single/index.html#distributed-query
正如@wildnez 所建议的,您可以使用 PRedicate and/or SQLQuery。此外,由于您使用的是 Spring,您还可以受益于 Spring-Data-Hazelcast 项目,它会根据方法名称自动为您生成查询:https://github.com/hazelcast/spring-data-hazelcast
但是你需要改变你的缓存方式。与其在缓存中只有一个条目,键 findAllGames
并将所有游戏存储在一个集合中,不如将所有条目单独存储在缓存中,gameId
作为键,Game
作为值.这样您就可以使用其中一种方法查询值。
我正在尝试使用 hazelcast 实现缓存。
这是我的代码。我的问题是,当 findAllGames() 被执行时,我正在缓存 "gamesCache" 中的所有游戏,当 findGameByTypes() 被执行时,我希望它查询 "gamesCache" 而不是访问数据库和 return结果。
@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属性作为标准来查询地图吗?
有什么办法可以实现吗?我也愿意接受其他建议。
请看一下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
您可以使用 Predicate 或 SqlQuery 查询 Hazelcast Map/Cache。在此处查看详细文档:https://docs.hazelcast.org/docs/3.11/manual/html-single/index.html#distributed-query
正如@wildnez 所建议的,您可以使用 PRedicate and/or SQLQuery。此外,由于您使用的是 Spring,您还可以受益于 Spring-Data-Hazelcast 项目,它会根据方法名称自动为您生成查询:https://github.com/hazelcast/spring-data-hazelcast
但是你需要改变你的缓存方式。与其在缓存中只有一个条目,键 findAllGames
并将所有游戏存储在一个集合中,不如将所有条目单独存储在缓存中,gameId
作为键,Game
作为值.这样您就可以使用其中一种方法查询值。