Apache Ignite:如何实现单条缓存条目支持多键查询
Apache Ignite 多检索键查询实现方案
首先明确结论:Apache Ignite 不支持单条缓存条目直接绑定多个原生主键,但有成熟的实现方案可以满足 userId、username 双维度查询需求,可根据业务场景选择:
方案1:二级索引方案(绝大多数场景最优)
这是开发和维护成本最低的方案,适配90%以上的常规业务场景:
- 缓存主键依旧使用
userId,给用户实体类的username字段添加@QuerySqlField(index = true)注解,将其标记为二级索引 - 写入缓存时仅需写入一次以
userId为键的用户条目即可,无需额外处理 - 按
userId查询时直接调用cache.get(userId),性能和原生主键查询完全一致 - 按
username查询时,直接使用 SQL 查询走二级索引过滤即可,性能足以支撑十万级QPS需求
示例代码:
// 用户实体类定义 public class User { private Long userId; @QuerySqlField(index = true) private String username; // 其他字段、getter/setter 省略 } // username 查询示例 SqlQuery<Long, User> unameQuery = new SqlQuery<>(User.class, "where username = ?"); List<Cache.Entry<Long, User>> users = userCache.query(unameQuery.setArgs("test_user")).getAll();
小提示:如果业务要求 username 全局唯一,写入数据前先通过 username 索引查询判重即可。
方案2:双缓存映射方案(极致性能场景可选)
如果要求 username 查询性能和主键查询完全持平,且写入QPS不高的场景可以选用:
- 新增独立的映射缓存
unameToIdCache,结构为key: username, value: userId - 写入用户数据时,同时操作两个缓存:先写入用户主缓存(userId 为键),再写入映射缓存,建议放在同一个事务内执行,保证数据一致性
- 更新或删除用户数据时,同步更新或删除映射缓存的对应条目
- 按 username 查询时,先查映射缓存拿到对应 userId,再查主缓存拿到完整用户数据即可
内容的提问来源于stack exchange,提问作者netcoredev6
相关产品推荐
相关产品推荐

