与关系数据库相比,我一直在研究Redis的功能功能,而没有涉及NFR问题,比如响应时间、可伸缩性等,在这些问题中,我了解到Redis excel。
例如,Redis可以为web应用程序处理一个用例清单。
提到了这一点,Redis的一个已知的缺点是进行业务分析,但是分析应该有多复杂,以便使Redis在例如与MySQL相比时效率更低?
例如,如果MySQL中的数据结构如下:
表:用户列: Id(PK)、名称(VarChar)、年龄(Int)
表: Message 列: UserID(FK)、Content(VarChar)、重要性(Int)
在我的应用程序中,我想使用以下两个查询:
1. SELECT Content FROM Message WHERE Importance > 2;
2. SELECT Content FROM Message,Users WHERE User.Id=Message.UserID and
User.Age > 30;我的问题:
我是否可以使用Redis存储上面的数据结构,并以与MySQL相同(或更高)的效率查询它?
发布于 2014-12-18 10:01:39
简短回答:是的。
很长的答案: Redis是一项了不起的技术,但它不是一个关系数据库。包含Redis的NoSQL构建的前提是,数据需要根据与其一起使用的访问模式进行存储。因此,要完成上述工作,您首先必须“正确”地存储数据。
要存储表的行,似乎需要使用哈希数据结构。按照Redis的术语,下面是如何为UserID 123创建一个用户密钥:
HMSET user:123 id 123 name foo age 31注1:在构造密钥名称时使用冒号(':')只是一种约定。
注意2:虽然ID已经是密钥名称的一部分,但通常在哈希中包含一个字段以便于访问。
类似地,下面是如何创建消息键( ID 987):
HMSET message:987 id 987 userid 123 content bar importance 3现在,有趣的是:) Redis没有FKs或索引,因此您必须维护数据结构,以帮助您根据需要获取数据。对于第一个查询,最好的选择是保持一个排序集,其中成员是消息ID,分数是重要的。因此,请:
ZADD messages_by_importance 3 987获取重要性大于2的消息的内容将通过两个操作完成,如这个伪Pythonic代码所示:
messages = r.zrangebyscore('messages_by_importance', '(2', '+inf')
for msg in messages:
content = r.hget('message:' + msg, 'content')
do_something(content)注意3:这个片段非常幼稚,可以优化以获得更好的性能,但是它应该为您提供基本的要点。
对于第二个查询,您首先需要找到年龄在30岁以上的用户--同样,应该使用相同的排序集技巧:
ZADD users_by_age 31 123
ZRANGEBYSCORE users_by_age (30 +inf这将使您获得与您的标准匹配的所有用户的列表,但您还需要跟踪(索引)每个用户的所有消息。要做到这一点,请使用一组:
SADD user:123:messages 987为了将所有东西绑定起来,下面是另一个伪片段:
users = r.zrangebyscore('users_by_age', '(30', '+inf')
for user in users:
messages = r.smembers('user:' + user + ':messages')
for msg in messages:
content = r.hget('message:' + msg, 'content')
do_something(content)这应该足以让您开始工作,但是一旦您掌握了基本知识,就可以优化这些流程了。使用流水线,Lua脚本和更智能的索引可以获得轻松的收益,根据您的需要.如果你需要进一步的帮助,只需问:)
https://stackoverflow.com/questions/27542756
复制相似问题