【问题标题】:In Redis, how to query hash data based on the valueRedis中,如何根据value查询hash数据
【发布时间】:2020-04-22 06:40:47
【问题描述】:

我正在使用 Spring Data Redis(SDR) 开发 Redis。我想根据值(不是字段名)查询我的哈希数据。

这是我的哈希数据 -

    Address address1 = Address.builder()
            .city("New York")
            .country("USA")
            .build();
    
    Address address2 = Address.builder()
            .city("New Jersy")
            .country("USA")
            .build();
    
    Address address3 = Address.builder()
            .city("Ohio")
            .country("USA")
            .build();

    Set<Address> addresses = Sets.newHashSet(address1, address2, address3);
    
    Person person = Person.builder()
            .firstname("John")
            .lastname("Leo")
            .address(addresses)
            .build();

    redisTemplate.opsForHash().putAll("employee", jacksonMapper.toHash(person));

现在我们有 API 可以通过映射键、字段名称进行查询,如下所示

Map<String, Object> entries = redisTemplate.opsForHash().entries("employee"); //query by map  key

Object object = redisTemplate.opsForHash().get("employee", "address[0].city"); //query by field name

但我想按字段值查询-

查找所有以“N”开头的城市

查找与模式“U*”匹配的所有国家

感谢您提供这方面的任何帮助。

【问题讨论】:

  • @shreyas-k 你考虑过使用 RediSearch 吗?

标签: java redis jedis spring-data-redis key-value-store


【解决方案1】:

没有 Redis 命令可以按哈希值进行扫描。 HSCAN 扫描字段名称,而不是值。

HSCAN 确实返回字段和值,因此您可以使用它返回所有城市或国家,使用类似"address[*].city" 的模式,然后在本地进行过滤。

HSCANopsForHash().scan(H key, ScanOptions options)

如果本地过滤不可接受,您可以:

  • 使用 Lua 脚本过滤 Redis-server-side 的值。
  • 创建一个二级结构,一个 Redis 集(集存储唯一值),例如 employee:cities,您可以在其中使用 SSCAN 存储(再次)这些可查询的值。
  • 在您的 Redis 上安装 RediSearch 模块并移动您的数据以将其用作文档。
  • 创建您自己的 Redis 模块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-29
    • 2014-11-18
    • 2021-12-28
    • 2021-10-02
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多