Node-redis: 将json数据存储在redis中

创建于 2015-08-25  ·  9评论  ·  资料来源: NodeRedis/node-redis

我对 redis 很陌生。 所以我想要的是存储从数据库中检索到的数据。 现在我必须对数据库返回的每个键值对使用 client.set() 还是有其他方法可以用一个命令保存所有数据? 数据格式如下:
<br i="6"/> {<br i="7"/> "member_username": "nikhil567",<br i="8"/> "member_gender": "Male",<br i="9"/> "member_dob": 0,<br i="10"/> "member_country": "",<br i="11"/> }<br i="12"/>

question

最有用的评论

@stockholmux我尝试使用 flat 并且它给了我错误:最大调用堆栈大小超出 ..
你有什么想法吗?

所有9条评论

您可能想在 Redis 中使用散列。 通过散列,您可以使用client.hmset更多信息)来存储您的对象。

需要注意的是,JS 对象可以嵌套,但 Redis 哈希只是一层。 因此,如果您的数据如下所示:

{ member_name : 'johndoe', address : { street: '123 Any Street', city: 'Anytown' } }

在将其存储在 redis 中之前,您需要使用flat 。 我写了一篇关于这个过程

@stockholmux我的数据存储在变量成员中。 那我该怎么办呢?
var member={member_name:'svf',address:'cvbjnk'}
你能给我示例查询吗?

正确的方法是散列的,如上所述,平的,也解释过。 虽然那个模块对我来说是新的。
有一个快捷方式,通常是不赞成的(tldr 会使以后分析数据的爬行速度变慢),但有时可能是合适的:JSON.stringify 您的对象并将其作为字符串存储在普通键中。

member_string = JSON.stringify member
redis_client.set 'your_key', member_string
# something like that
# if your object is already flat then you can (just):
redis_client.hmset 'hash_key', member
# something like that, been awhile

@abhinav76这实际上取决于您访问数据的方式,但您可能希望通过member_name ,对吗? 所以,把它拉进钥匙。

var member={member_name:'svf',address:'cvbjnk'};

client.hmset('members:'+member.member_name, member, function(err) { ... });

稍后,如果您想获得该哈希值以及您需要执行的所有字段:

client.hgetall('members:svf', function(err,values) { ... });

您可能还想查看某种二级商店来跟踪您的所有member:*哈希值 - 类似于 redis 集或列表

感谢@kulicuu@stockholmux

我的 redis 数据如下所示:
现在如何更新此数据中的任何字段?
@kulicuu @stockholmux

<br i="10"/> "{\"f_name\":\"\",\"profile\":{\"member_username\":\"nikhil371\",\"member_gender\":\"Male\",\"member_dob\":0,\"member_country\":\"\",\"state\":\"\",\"city\":\"\",\"hair_colour\":\"\",\"hairstyle\":\"\",\"eye_colour\":\"\",\"eyesight\":\"\",\"complexion\":\"\",\"height\":\"\",\"body_ENGINE\":\"\",\"exercise\":\"\",\"religion\":\"\",\"religious_beliefs\":\"\",\"education\":\"\",\"occupation\":\"\",\"annual_income\":\"\",\"ethnicity\":\"\",\"nationality\":\"\",\"languages\":\"\",\"diet\":\"\",\"smoke\":\"\",\"drink\":\"\",\"current_relationship_status\":\"\",\"preferred_relationship\":\"\",\"profile_tagline\":\"\",\"screened\":\"N\",\"photo_status\":\"None\",\"hidden\":\"N\",\"record_date\":0,\"update_date\":0,\"ip\":\"\",\"member_id\":10548,\"time_stamp\":0,\"photo_key\":\"\",\"profile_personality\":{\"member_username\":\"nikhil371\",\"feature\":\"xcvbnkm\",\"zodiac\":\"vbnim\",\"favorites\":\"qerrb\",\"motto\":\"cvbn\",\"irritated\":\"aguweihjok\",\"sexiest\":\"atwvyebuinmo\",\"good_evening\":\"ywsbciobnom\",\"like_to_do\":\"vdsfd371\",\"outgoing\":\"ev\",\"prefer_to\":\"ebvjnk\",\"record_date\":371,\"update_date\":372,\"profile_other_info\":{\"id\":10516,\"member_username\":\"nikhil371\",\"describe_yourself\":\"tyuh\",\"views\":371,\"admin_login\":\"\",\"screening_assigned_to\":\"\"}}}}"<br i="11"/>

@kulicuu如果您使用JSON.stringify ,则需要使用JSON.parse反序列化数据,更新您的字段,然后您需要将其重新写入相同的密钥JSON.stringify 。 在 CPU 和空间效率方面都非常浪费。

使用哈希,您可以通过执行类似client.hset('my:key:name','member_gender','female')来更新单个字段。 如果您使用flat取消嵌套您的对象,您可以使用client.hset('my:key:name','profile_personality.member_username','asdf')更新单个文件。

我同意这是不受欢迎的 - 感谢@stockholmux详细讨论为什么会这样 - 但值得一提的是它是一种捷径。

对于上下文,这是我大约 8 个月前写的内容。 我不得不推迟将大部分模型移到 Redis 的 Lua 脚本中的主要重构。
https://github.com/Terebinth/britvic/blob/deprecated_version/server/models/user_iced.iced
(变量d是redis客户端)
也看看其他一些模型。 @abhinav76

@stockholmux我尝试使用 flat 并且它给了我错误:最大调用堆栈大小超出 ..
你有什么想法吗?

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

mikhailsidorov picture mikhailsidorov  ·  18评论

xtianus79 picture xtianus79  ·  10评论

brucejcw picture brucejcw  ·  40评论

dmitry-saritasa picture dmitry-saritasa  ·  9评论

paulsheldrake picture paulsheldrake  ·  18评论