Hash Redis哈希表的用法

Hash Redis哈希表的用法,hash,redis,Hash,Redis,我想使用类似redis的Nosql数据库,我有如下想法 假设我有3张桌子 1 - user 2 - post 3 - comment 我为每个表创建哈希,如下所示 hset user _usr_100 {"id":"_usr_100","name":"john","username"="jhn","age":25} hset user _usr_101 {"id":"_usr_101","name":"adam","username"="adm","age":26} hset user _us

我想使用类似redis的Nosql数据库,我有如下想法

假设我有3张桌子

1 - user
2 - post
3 - comment
我为每个表创建哈希,如下所示

hset user _usr_100 {"id":"_usr_100","name":"john","username"="jhn","age":25}
hset user _usr_101 {"id":"_usr_101","name":"adam","username"="adm","age":26}
hset user _usr_102 {"id":"_usr_102","name":"eric","username"="erc","age":27}

hset post _post_100 {"id":"_post_100","title":"title","content":"testpost","userid"="_usr_100"}
hset post _post_101 {"id":"_post_101","title":"title","content":"testpost","userid"="_usr_101"}
hset post _post_102 {"id":"_post_102","title":"title","content":"testpost","userid"="_usr_102"}

hset comment _comment_100 {"id":"_comment_100","content":"testpost","userid"="_usr_100","postid":"_post_100"}    
hset comment _comment_101 {"id":"_comment_101","content":"testpost","userid"="_usr_101","postid":"_post_101"}    
hset comment _comment_102 {"id":"_comment_102","content":"testpost","userid"="_usr_102","postid":"_post_102"}
当我想从redis获取用户(_user_100)时

hget user _usr_100
{"id":"_usr_100","name":"john","username"="jhn","age":25}
当我想要获得用户时

hgetall user
{"id":"_usr_100","name":"john","username"="jhn","age":25}
{"id":"_usr_101","name":"adam","username"="adm","age":26}
{"id":"_usr_102","name":"eric","username"="erc","age":27}
在用pne逐个反序列化json字符串并将其填入列表后,我有了一个列表,这样我就可以执行一些操作(搜索、分组、排序、分页…),并且我可以对另一个哈希(post、注释)执行相同的操作

我可以删除,更新用户与

hdel user _usr_101 // deleted _usr_101
hset user _usr_100 {"id":"_usr_100","name":"john","username"="jhn","age":26} //updated age
hset user _usr_103 {"id":"_usr_103","name":"max","username"="max","age":15} //new user

hgetall user
{"id":"_usr_100","name":"john","username"="jhn","age":26}
{"id":"_usr_102","name":"eric","username"="erc","age":27}
{"id":"_usr_103","name":"max","username"="max","age":15}

这种用法的缺点是什么?您能否建议另一种使用类似redis的nosql表的哈希方法。

根据您的业务规则/模型,此选项“可能”有效,但它可能不是您所在领域的最佳/接近最佳解决方案。在大多数
关系
域的需要中使用键/值存储会导致您做出可能对您不利的权衡

当您的
用户
类有新字段并且需要查询这些字段时,您需要创建更多的“空间”以减少“时间”。您一直在对数据进行非规范化处理,以实现单个查询。您将尝试在键/值存储世界中实现关系数据库。当你只需要用一个简单的语句更新你的用户101时

UPDATE users SET username = 'mynewusername' where id = 101;
在您的情况下,您需要通过所有哈希/集合/列表找到所有相关的键/字段,并更新它们以确保数据完整性。保留
age
作为一个字段可能不是一个好主意,您需要使用生日,或者如果您的企业需要获取今天生日的用户列表,则需要创建新密钥,复制大部分数据,将所有现有用户迁移到该字段以获取今天的生日。最好记住这一点,您需要按天和月查询以获取生日-这意味着您必须将用户保留在单独的集合中,例如
用户:生日:01:01
用户:生日:02:05
用户:生日:11:08
,以获取它们。如果用户想要更新他们的生日(取决于业务),那么您需要手动在这些集合之间移动用户,同时也更新其他集合

向用户添加
主动
/
被动
将是另一种痛苦。我不确定您是否需要获取所有用户,您可能需要对他们进行分页,并且在使用哈希时-这将很难,您将需要另一个排序集/列表来获得它

用户的帖子评论、用户的最后25条评论、拥有最多帖子的用户的最新评论或搜索用户的帖子等也是如此。您的产品经理会提出这个想法,让我们在每篇文章中添加
标签
,您将需要
将其与新的数据结构关联到您的数据模型中

这些是关系数据,最好保持它们的关系。当您开始在非关系数据库中对数据进行建模时,所有提供给您的
弹性
关系数据库管理系统
都将消失,它将被数据层和应用层上的
复杂性
所取代

在这个问题上,一个postgresql可能比redis更好地帮助您解决问题。Redis有很好的功能来解决问题,但用户/帖子/评论不是其中之一


这也可能提供一些见解

当我需要更新一个用户时,我需要再次设置json字符串,即使它用于一个字段(即:用户名)。我在使用哈希之前存储了json值,例如(set usr_100{“json of user”}),但很难(几乎不可能)进行搜索、排序、分页,但通过哈希,我可以获得所有用户并转换为列表,然后我可以使用列表操作完成所有操作。我完全同意你的想法。这个场景不适合redis,但我需要使用它,因为我不想去磁盘获取值。@YusufKayikci这主要取决于业务规模,比如100万用户或1000人。这就是我在答案中多次使用“业务”的原因:)。谢谢你的回复&祝你好运