Redis中如何根据值查询hash数据

In Redis, how to query hash data based on the value

我正在使用 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

但我想按字段值查询 -

Find all cities starting with 'N'

Find all countries matching the pattern 'U*'

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

没有 Redis 命令可以按散列上的值进行扫描。 HSCAN 扫描字段名称,而不是值。

HSCAN 做 return 字段和值,所以你可以用它来 return 所有城市或国家,使用像 "address[*].city" 这样的模式,并且然后在本地进行过滤。

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

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

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