我使用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获取所有条目到我的本地机器并迭代它们。
难道我没有更好的方法吗?
答案 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元素,在您的情况下是哈希键名称。