2016-08-03 32 views
2

我有一个我想要在Redis中存储的对象数组。我可以分解数组部分并将它们存储为对象,但我没有得到如何获得像{0}这样的东西:{“foo”:“bar”,“qux”:“doe”},{1}:{ “name”“Saras”,“age”:23},然后根据名称搜索数据库并获取请求的密钥。我需要这样的东西。但不能接近正确。如何在Redis中存储对象数组?

增量ID //正确 (整数)3 获取ID //正确 “3” SADD ID { “名”: “萨拉斯”} //错误 SADD MYSET { “名”: “萨拉斯” } //正确 (整数)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; 
      } 
     } 

请提示哪些路线最适合一些实施?

回答

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; 
    }); 

虽然字符串化,然后解析它后面是一个计算繁重操作,将阻止Node.js的服务器如果JSON的尺寸变大。我可能已经准备好让复杂性降低了,因为我知道我的JSON不会很大,但在采用这种方法时需要记住这一点。

+1

感谢您验证这是一个解决方案,我正在考虑做同样的事情 – Antoine

0

Redis是非常简单的键值存储。是的,还有像集合这样的其他数据结构,但它具有非常有限的查询功能。例如,如果你想获得按名称查找数据,那么你就必须以类似的东西:

集名称

SET名称2“对象的序列化数据”,“对象2的串行数据”

GET名称

将返回数据:

SET NAME3

然后 “object3的序列化数据”。

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

你可以用做键有限的文本匹配:http://redis.io/commands/scan

总结:我觉得你应该对于复杂的查询使用其他工具。

+0

嘿@ kiss-web我可以使用哪些其他技术? –

+0

允许查询其内容的非关系数据库,如: https://pl.wikipedia.org/wiki/MongoDB(本机支持json)。 –

0

你有第一个问题,SADD ID {“name”:“Saras”} //错误,因为“id”键不是类型集,它是一个字符串类型。

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

+0

通过其他工具你是什么意思?你能举一些例子吗? –