Redis的是,我用传统的SQL数据库的概念不同,我想弄清楚它是否适合我的项目。我一直在四处寻找,但似乎无法找到一个回答我的问题。
我有一组我需要存储,每一个与之相关联的唯一的ID和几个值(如他们的名字)的用户。 好像我可以简单地存储这些作为哈希:
user:fef982dcfe1a7bcba4849b4c281bba95
"username" "andrewm" "name" "Andrew"
我也有一堆我要存储,每一个都具有一些属性,如发件人和收件人的邮件:
message:1a7bcba4849b4c281bfef98a952dcfeb
"sender" "fef982dcfe1a7bcba4849b4c281bba95" "recipient" "82dcfe1a7bcba4849b4c281bba95fef9" "message" "Hi!"
我的问题是,我将如何去检索所有由特定用户(通过其指定的哈希)发送的消息。 我应该使用传统的关系型数据库,而不是,或甚至是的NoSQL数据库MongoDB的一样(我以前使用过)? 如果是这样,没有任何人有高性能店有什么建议? 我不会做任何真正的搜索(即MySQL的LIKE
查询) -刚刚键值查找,真的。
这当然是可能的这些数据与Redis的模式,但你需要考虑在数据结构和存取路径的任期。 随着Redis的访问路径不含蓄管理(如在RDBMS / MongoDB的索引)。
对于所提供的例子,你可以有:
user:<user hash> -> hash of user properties
user:<user hash:sent -> set of <msg hash>
user:<user hash>:received -> set of <msg hash>
message:<msg hash> -> hash of message properties
添加/删除的消息将意味着维持*:发送和*:接收对应于所述发件人和收件人套,上添加/删除消息对象本身的顶部。
检索发送或接收的消息给定用户仅仅是一个SMEMBERS命令,或者如果你也想找回在同一时间的信息属性排序:
# Get a list of message hash codes only in one roundtrip
smembers user:<user hash>:received
# Get a list of message contents in one roundtrip
sort user:<user hash>:received by nosort get message:*->sender get message:*->message
有关使用排序的理由,请参阅:
- 充分利用Redis的多个键值
- 需要帮助的Redis / NoSQL的概念化
注1:使用Redis的是更好地使用整数作为键,而不是UUID或哈希码(尤其是在套),因为它们被存储在一个更有效的方式。
注2:如果您需要订购的消息,则列表必须被用来代替套。 结果是只有最旧的消息可以被去除,并且只有newset消息可以以有效的方式进行添加。 你可能还添加全局列表的所有邮件。