RedisTemplate - 哈希按键集获取多个条目

时间:2015-10-21 11:47:25

标签: spring redis

我使用spring的RedisTemplate。

我在redis中有一个哈希值。

我想使用模板查询redis,以获取其密钥在某组密钥中的所有条目。

我注意到了这个方法:

Map<Object, Object> entries = redisTemplate.opsForHash().multiGet(HASH_NAME, keySet);

但是,遗憾的是,此方法仅返回值,而没有匹配的键。

我也可以这样做:

Map<Object, Object> entries = redisTemplate.opsForHash().entries(HASH_NAME);
for(Object key : keySet){
    System.out.println(entries.get(key));
}

但这意味着我将从redis获取所有条目到我的本地机器并迭代它们。

难道我没有更好的方法吗?

4 个答案:

答案 0 :(得分:4)

如果您正在使用RedisTemplate,则可以使用opsForHash().entries(H key)来获取所有哈希值(键和值)。

例如......

Map messageGroupMetadata = redisTemplate.opsForHash().entries(H key);

除此之外,还需要设置RedisTemplate序列化程序来完成此操作。

redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());

答案 1 :(得分:3)

来自HMGET的文档:

  

数组回复:与给定字段关联的值列表   与他们要求的订单相同。

Spring Redis Hash multiGet的文档中,您可以看到它返回一个列表(不是地图),该列表应与您发送的密钥的顺序相同。

示例代码:

List<Object> values = redisTemplate.opsForHash().multiGet(HASH_NAME, keySet);
int i = 0;
for (String k: keySet) {
    // k is the key
    // and here is the value corresponding to the key k
    Object value = values.get(i++);
}

答案 2 :(得分:0)

我也有同样的问题。即使方法说明说multiget应该以与输入相同的顺序返回数据,但事实并非如此。它以Map返回的方式返回它。我想为此打开一个错误,但在spring.io上看不到任何选择。

答案 3 :(得分:-1)

不确定弹簧,但Redis有一个满足这种需求的原生解决方案。 您可以使用SORT命令:

SORT index_set BY nosort get # get *->hash_field1 get *->hash_field2 ...

第一个get #将返回set元素,在您的情况下是哈希键名称。