如何在 Redis 中存储对象数组?
How to store array of objects in Redis?
我有一组对象要存储在 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;
}
}
请建议哪条路线最适合某些实施?
Redis 是非常简单的键值存储。是的,还有其他数据结构,如集合,但它的查询能力非常有限。例如,如果你想通过名称查找数据,那么你将不得不这样做:
SET名称"serialized data of object"
SET 名称 2 "serialized data of object2"
SET Name3 "serialized data of object3"
然后:
获取名称
会 return 数据。
当然这意味着您不能存储两个具有相同名称的条目。
您可以使用以下键对键进行有限的文本匹配:http://redis.io/commands/scan
总而言之:我认为您应该使用其他工具进行复杂查询。
你遇到的第一个问题,SADD id {"name" : "Saras"} //错误,很明显,因为 "id" 键不是 set 类型,它是一个字符串类型。
在 Redis 中,访问数据的唯一途径是通过它的键。
正如 kiss 所说,也许你应该寻找其他工具。
我发现有用的方法是将密钥存储为唯一标识符,并在存储数据时将整个对象字符串化,并在提取数据时应用 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 不会很大,但是在采用这种方法时需要牢记这一点。
我有一组对象要存储在 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;
}
}
请建议哪条路线最适合某些实施?
Redis 是非常简单的键值存储。是的,还有其他数据结构,如集合,但它的查询能力非常有限。例如,如果你想通过名称查找数据,那么你将不得不这样做:
SET名称"serialized data of object"
SET 名称 2 "serialized data of object2"
SET Name3 "serialized data of object3"
然后:
获取名称
会 return 数据。
当然这意味着您不能存储两个具有相同名称的条目。
您可以使用以下键对键进行有限的文本匹配:http://redis.io/commands/scan
总而言之:我认为您应该使用其他工具进行复杂查询。
你遇到的第一个问题,SADD id {"name" : "Saras"} //错误,很明显,因为 "id" 键不是 set 类型,它是一个字符串类型。
在 Redis 中,访问数据的唯一途径是通过它的键。 正如 kiss 所说,也许你应该寻找其他工具。
我发现有用的方法是将密钥存储为唯一标识符,并在存储数据时将整个对象字符串化,并在提取数据时应用 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 不会很大,但是在采用这种方法时需要牢记这一点。