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

7

我有一个对象数组想要存储在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都是单独存储的哈希表的键。 - Eric Grossman
4个回答

7

我发现有效的方法是将键作为唯一标识符存储,并在存储数据时将整个对象字符串化,而在提取数据时应用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不会很大,但在采用这种方法时需要牢记这一点。

1
感谢您验证这个解决方案,我也在考虑做同样的事情。 - Anthony

2
Redis是一个相当简单的键值存储。是的,它有其他数据结构,如集合,但其查询功能非常有限。例如,如果您想通过名称查找数据,则必须执行以下操作:
SET Name "对象的序列化数据"
SET Name2 "对象2的序列化数据"
SET Name3 "对象3的序列化数据"
然后:
GET Name 将返回数据。
当然,这意味着您不能使用相同的名称存储两个条目。
您可以使用http://redis.io/commands/scan对键进行有限的文本匹配。
总之,我认为您应该使用其他工具进行复杂查询。

嘿 @kiss-web,我还能使用哪些其他技术? - Saras Arya
非关系型数据库允许对其内容进行查询,例如:https://pl.wikipedia.org/wiki/MongoDB(原生支持JSON)。 - my-nick

0

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

在Redis中,数据的唯一访问点是通过其键。正如Kiss所说,也许你应该寻找其他工具。


你所说的其他工具是指什么?能给一些例子吗? - Saras Arya

0
如果你想要存储一个形如[ {}, {}, {} ]的对象数组,
只需将数据按原样设置,并在检索时进行解析,希望这样能够起作用。

原帖(OP)的问题比那个更加微妙。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接