Redis 在概念上与我使用的传统 SQL 数据库不同,我试图弄清楚它是否适合我的项目......我一直在四处寻找,但似乎找不到我的问题的答案。
我需要存储一组用户,每个用户都有一个唯一的 ID 和多个与其关联的值(例如他们的姓名)。看来我可以简单地将它们存储为哈希:
user:fef982dcfe1a7bcba4849b4c281bba95
"username" "andrewm" "name" "Andrew"
我还想存储一堆消息,每条消息都有一些属性,例如发件人和收件人:
message:1a7bcba4849b4c281bfef98a952dcfeb
"sender" "fef982dcfe1a7bcba4849b4c281bba95" "recipient" "82dcfe1a7bcba4849b4c281bba95fef9" "message" "Hi!"
我的问题是,我将如何检索特定用户(由其哈希指定)发送的所有消息。我应该使用传统的关系数据库,还是像 MongoDB(我以前用过)这样的 NoSQL 数据库?如果是这样,有人对高性能商店有什么建议吗?我不会做任何真正的搜索(即 MySQLLIKE
查询)——实际上只是键值查找。
当然可以使用 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
添加/删除消息意味着除了添加/删除消息对象本身之外,还要维护与发送者和接收者相对应的 *:sent 和 *:received 集。
检索给定用户发送或接收的消息只是一个 SMEMBERS 命令,如果您想同时检索消息的属性,则可以使用 SORT 命令:
# 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 概念化方面的帮助
Note 1:对于 Redis,最好使用整数作为键,而不是 UUID 或哈希码(尤其是在集合中),因为它们以更有效的方式存储。
Note 2:如果您需要对消息进行排序,则必须使用列表而不是集合。结果是只能删除最旧的消息,并且只能以有效的方式添加新消息。您可能还需要为所有消息添加一个全局列表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)