如何在 Redis 中存储对象数组?

Posted

技术标签:

【中文标题】如何在 Redis 中存储对象数组?【英文标题】:How to store array of objects in Redis? 【发布时间】:2016-12-09 09:30:37 【问题描述】:

我有一个要存储在 Redis 中的对象数组。我可以分解数组部分并将它们存储为对象,但我不知道如何获得类似

0 : "foo" :"bar", "qux" : "doe", 1 : "name" "Saras", "age" : 23 

然后根据名称搜索数据库并取回请求的密钥。我需要这样的东西。但无法接近正确。

incr id //correct
(integer) 3
get id //correct
"3"
SADD id "name" : "Saras" //wrong 
SADD myset "name" : "Saras" //correct
(integer) 1

首先是正确处理这部分。

其次是以某种方式从值中获取密钥,即

if name==="Saras"  
then key=1

我觉得这很难。或者我可以将它直接存储为对象数组并使用简单的 for 循环。

 for (var i = 0; i < userCache.users.length; i++) 
            if (userCache.users[i].userId == userId && userCache.users[i].deviceId == deviceId) 
                return i;
            
        

请建议哪条路线最适合某些实施?

【问题讨论】:

您可以存储一组唯一 id,每个 id 都是单独存储的哈希的键。 【参考方案1】:

我发现的工作是将密钥存储为唯一标识符,并在存储数据时对整个对象进行字符串化,并在提取数据时应用 JSON.parse。

示例代码:

client
    .setAsync(obj.deviceId.toString(), JSON.stringify(obj))
    .then((doc) => 
        return client.getAsync(obj.deviceId.toString());
    )
    .then((doc) => 
        return JSON.parse(doc);
    ).catch((err) => 
        return err;
    );

虽然字符串化然后将其解析回来是一项计算量很大的操作,并且如果 JSON 的大小变大,会阻塞 Node.js 服务器。我可能已经准备好尝试降低复杂性,因为我知道我的 JSON 不会很大,但是在采用这种方法时需要牢记这一点。

【讨论】:

感谢您将此验证为我正在考虑做同样事情的解决方案【参考方案2】:

Redis 是非常简单的键值存储。是的,还有其他数据结构,如集合,但它的查询能力非常有限。例如,如果您想按名称查找数据,那么您将不得不这样做:

SET Name“对象的序列化数据”

SET Name2 "object2的序列化数据"

SET Name3 "object3的序列化数据"

然后:

获取名称

将返回数据。

当然,这意味着您不能存储两个具有相同名称的条目。

您可以使用以下方式对键进行有限的文本匹配:http://redis.io/commands/scan

总结一下:我认为你应该使用其他工具来处理复杂的查询。

【讨论】:

嘿@kiss-web 我还可以使用哪些其他技术? 允许查询其内容的非关系数据库,例如:pl.wikipedia.org/wiki/MongoDB(对 json 的本机支持)。【参考方案3】:

你遇到的第一个问题,SADD id "name" : "Saras" //错误,很明显,因为“id”键不是类型集,它是字符串类型。

在 redis 中,唯一的数据访问点是通过它的 key。 正如kiss所说,也许您应该寻找其他工具。

【讨论】:

其他工具是什么意思?能举个例子吗?

以上是关于如何在 Redis 中存储对象数组?的主要内容,如果未能解决你的问题,请参考以下文章

Jedis存储Java对象(Java序列化为byte数组方式)

REACT 如何在 setState 中存储对象而不是对象数组?

如何在本地存储中保存对象数组

如何将对象列表存储在数组中?

对象数组如何存储在内存中?

值类型数组如何存储在 .NET 对象堆中?