Redis在概念上与我使用的传统SQL数据库有所不同,我正在尝试确定它是否适合我的项目…我一直在寻找,但似乎找不到我的问题的答案。
我有一组用户需要存储,每个用户都有一个唯一的ID和与之关联的几个值(例如其名称)。看来我可以简单地将它们存储为哈希:
user:fef982dcfe1a7bcba4849b4c281bba95 "username" "andrewm" "name" "Andrew"
我还有一堆要存储的消息,每个消息都有一些属性,例如发送者和接收者:
message:1a7bcba4849b4c281bfef98a952dcfeb "sender" "fef982dcfe1a7bcba4849b4c281bba95" "recipient" "82dcfe1a7bcba4849b4c281bba95fef9" "message" "Hi!"
我的问题是,我将如何检索特定用户发送的所有消息(由其哈希指定)。我应该使用传统的关系数据库,还是像MongoDB这样的NoSQL数据库(之前使用过)?如果是这样,那么有人对高性能商店有什么建议吗?我不会做任何真正的搜索(即MySQL LIKE查询),实际上只是进行键值查找。
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
添加/删除消息意味着在添加/删除消息对象本身的基础上,维护与发送者和接收者相对应的: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
注意1: 使用Redis时,最好将整数用作键而不是UUID或哈希码(尤其是在集合中),因为它们以更有效的方式存储。
注意2: 如果您需要订购消息,则必须使用列表而不是列表。结果是只能删除最旧的消息,并且只能以有效的方式添加新的消息。您可能还会为所有消息添加一个全局列表。