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 - 通过键集散列获取多个条目的主要内容,如果未能解决你的问题,请参考以下文章

redisTemplate通过setNx实现分布式锁

RedisTemplate操作命令 - list

linux 进程间通信 dbus-glib实例详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)

在RedisTemplate中使用scan代替keys指令

S1/C#语言和数据库技术基础/06-程序数据集散地:数据库

使用RedisTemplate实现Redis分布式锁出现的一些列问题(避坑)