You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 01:24:00