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"
这样的模式,并且然后在本地进行过滤。
HSCAN
是 opsForHash().scan(H key, ScanOptions options)
。
如果不能接受本地过滤,您可以:
- 使用 Lua 脚本过滤 Redis 服务器端的值。
- 创建一个二级结构,一个 Redis 集(集存储唯一值),例如
employee:cities
您在其中存储(再次)这些可查询值 SSCAN
。
- 在您的 Redis 上安装 RediSearch 模块并移动您的数据以将其用作文档。
- 创建您自己的 Redis 模块。
我正在使用 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"
这样的模式,并且然后在本地进行过滤。
HSCAN
是 opsForHash().scan(H key, ScanOptions options)
。
如果不能接受本地过滤,您可以:
- 使用 Lua 脚本过滤 Redis 服务器端的值。
- 创建一个二级结构,一个 Redis 集(集存储唯一值),例如
employee:cities
您在其中存储(再次)这些可查询值SSCAN
。 - 在您的 Redis 上安装 RediSearch 模块并移动您的数据以将其用作文档。
- 创建您自己的 Redis 模块。