RedisTemplate - 通过键集散列获取多个条目
Posted
技术标签:
【中文标题】RedisTemplate - 通过键集散列获取多个条目【英文标题】:RedisTemplate - hash get multiple entries by key set 【发布时间】:2015-10-21 11:47:25 【问题描述】:我用的是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 获取所有条目到我的本地计算机,并对其进行迭代。
难道我没有更好的方法吗?
【问题讨论】:
【参考方案1】:如果您使用的是 RedisTemplate,您可以使用 opsForHash().entries(H key)
来获取所有哈希(键和值)。
例如...
Map messageGroupMetadata = redisTemplate.opsForHash().entries(H key);
另外需要设置 RedisTemplate 序列化器来完成这个操作。
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
【讨论】:
【参考方案2】:来自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++);
【讨论】:
【参考方案3】:我也有同样的问题。即使方法描述说 multiget 应该以与输入相同的顺序返回数据,但事实并非如此。它以 Map 返回的方式返回它。我想为此打开一个错误,但我在 spring.io 上看不到任何选项。
【讨论】:
【参考方案4】:不确定 spring,但是 Redis 有针对这种需求的原生解决方案。 你可以使用SORT 命令:
SORT index_set BY nosort get # get *->hash_field1 get *->hash_field2 ...
第一个 get #
将返回 set 元素,在您的情况下是哈希键名称。
【讨论】:
这很有趣,但没有解决 op 的问题。以上是关于RedisTemplate - 通过键集散列获取多个条目的主要内容,如果未能解决你的问题,请参考以下文章
linux 进程间通信 dbus-glib实例详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)