首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redis能处理这个简单的查询吗?

问Redis能处理这个简单的查询吗?
EN

Stack Overflow用户
提问于 2014-12-18 09:05:36
回答 1查看 2.1K关注 0票数 4

与关系数据库相比,我一直在研究Redis的功能功能,而没有涉及NFR问题,比如响应时间、可伸缩性等,在这些问题中,我了解到Redis excel。

例如,Redis可以为web应用程序处理一个用例清单。

提到了这一点,Redis的一个已知的缺点是进行业务分析,但是分析应该有多复杂,以便使Redis在例如与MySQL相比时效率更低?

例如,如果MySQL中的数据结构如下:

表:用户列: Id(PK)、名称(VarChar)、年龄(Int)

表: Message 列: UserID(FK)、Content(VarChar)、重要性(Int)

在我的应用程序中,我想使用以下两个查询:

代码语言:javascript
复制
 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相同(或更高)的效率查询它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-18 10:01:39

简短回答:是的。

很长的答案: Redis是一项了不起的技术,但它不是一个关系数据库。包含Redis的NoSQL构建的前提是,数据需要根据与其一起使用的访问模式进行存储。因此,要完成上述工作,您首先必须“正确”地存储数据。

要存储表的行,似乎需要使用哈希数据结构。按照Redis的术语,下面是如何为UserID 123创建一个用户密钥:

代码语言:javascript
复制
HMSET user:123 id 123 name foo age 31

注1:在构造密钥名称时使用冒号(':')只是一种约定。

注意2:虽然ID已经是密钥名称的一部分,但通常在哈希中包含一个字段以便于访问。

类似地,下面是如何创建消息键( ID 987):

代码语言:javascript
复制
HMSET message:987 id 987 userid 123 content bar importance 3

现在,有趣的是:) Redis没有FKs或索引,因此您必须维护数据结构,以帮助您根据需要获取数据。对于第一个查询,最好的选择是保持一个排序集,其中成员是消息ID,分数是重要的。因此,请:

代码语言:javascript
复制
ZADD messages_by_importance 3 987

获取重要性大于2的消息的内容将通过两个操作完成,如这个伪Pythonic代码所示:

代码语言:javascript
复制
messages = r.zrangebyscore('messages_by_importance', '(2', '+inf')
for msg in messages:
    content = r.hget('message:' + msg, 'content')
    do_something(content)

注意3:这个片段非常幼稚,可以优化以获得更好的性能,但是它应该为您提供基本的要点。

对于第二个查询,您首先需要找到年龄在30岁以上的用户--同样,应该使用相同的排序集技巧:

代码语言:javascript
复制
ZADD users_by_age 31 123
ZRANGEBYSCORE users_by_age (30 +inf

这将使您获得与您的标准匹配的所有用户的列表,但您还需要跟踪(索引)每个用户的所有消息。要做到这一点,请使用一组:

代码语言:javascript
复制
SADD user:123:messages 987

为了将所有东西绑定起来,下面是另一个伪片段:

代码语言:javascript
复制
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脚本和更智能的索引可以获得轻松的收益,根据您的需要.如果你需要进一步的帮助,只需问:)

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27542756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档