2014-04-07 62 views
1

我今天使用redis开始,我经历过的教程和计算器一定的联系,但我不理解如何正确使用Redis的东西它似乎是一个非常简单的用例。Redis:如何存储用户散列列表并检索它?

目标:将多个用户数据保存到redis中,并一次读取所有用户。

我开始Redis的客户,我通过添加具有ID 1第一个用户开始:

127.0.0.1:6379> hmset user:1 name "vitor" age 35 
OK 
127.0.0.1:6379> hgetall user:1 
1) "name" 
2) "vitor" 
3) "age" 
4) "35" 

我添加一些更多的用户的,做几个命令像这样的:

127.0.0.1:6379> hmset user:2 name "nuno" age 10 

我当时(可能错误地)期待能够通过这样做来查询我所有的用户:

hgetall "user:" 

甚至

hgetall "user:*" 

,我从来没见过这样的事情在教程的事实,那种告诉我,我没有使用Redis的适合这种使用情况。

你能告诉我应该是什么这个用例的方法呢?

回答

6

要了解为什么这些类型的操作都必须在NoSQL的实现显得不平凡,这是很好的思考为什么NoSQL的存在(并已成为非常流行),在所有。

当你看到在早期的NoSQL实现像memcached的,第一个用例是很简单,但很重要:一个极快的缓存分布的数据,缓存例如网页数据。非常迅速地增加了群集和分片等功能,因此并非所有数据都必须在集群中的每个节点上一次都可用,但可以根据需要收集。

NoSQL与关系数据存储非常不同。不要过度使用它。考虑关系型数据库也是如此,因为它们有时候更适合你正在努力完成的任务。在你设计的所有东西中,问问你自己:“这个规模好吗?”。

好的,回到你的问题。做通配符搜索通常是不好的做法。您可以通过可扩展的方式检索数据来准备数据。

Redis是一个非常chique的解决方案,可以让你克服了很多NoSQL的局限性,一种优雅的方式。

如果获得“所有用户的列表”不是你必须经常做的事情,或者不需要很好地扩展,总是“我真的总是想要所有的用户”,因为它是每天无论如何扫描,使用HSCANSCAN正确批次的操作不会妨碍其他客户端的操作,您可以一次检索几千条记录,并在几次调用之后获得所有内容。

您还可以将用户存储在一个SET。没有订购,所以没有分页。它可以帮助保持您的用户名唯一。

如果您想要执行诸如“让我以字母'a'开头的所有用户”,我会使用ZSET。我将等待一两周的ZRANGEBYLEX即将在我们发言的作品中公布。或者使用像Josiah Carlsons的'rom'包这样的ORM。

当你问自己“但现在我必须做三次调用,而不是一个时,存储我的数据......?”:烨,这就是它的工作原理。如果您需要原子性,请使用Lua脚本或MULTI + EXEC流水线。 Lua通常更容易。

您还可以问问自己是否需要使用HSET。你需要检索个人数据成员吗?每个键或成员都有一些开销。最重要的是,HGETALL的Big-O规格为O(N),所以它不能很好地扩展。最好使用JSON或MsgPack将您的行作为整体进行序列化,并将其存储在一个HSET成员中,或者将其存储在一个HSET成员中,或者将其存储在一个简单的GET/SET中。另请阅读SORT

希望这有助于TW

+0

Hi @Tw Bert,谢谢你的回答。我总是考虑关系型数据库,但是因为在这种情况下,我没有关系,所以我想存储或查询,我关于REDIS,因为我只想存储用户并在大多数时间检索它们。我想给你的解释我可能想要一个SET,尤其是因为在非常乐观的情况下,用户列表永远不会超过1k。 – bitoiu

+1

不客气。 1k是没有用的,如果它只是局域网上的用户标识,那么这是一个很好的起点。如果您使用Azure或Heroku这样的云服务,它可能会变成一个不同的故事,您可能需要使用不同的redis数据类型来调整它。如果您事先发现潜在的问题,那从未如此难过。 –

2

如果你仍然想使用Redis的,你可以使用类似:

SADD用户 “{” 用户id “:1,” 名“:约翰, ”维托尔“: X, “年龄:35}”

SADD用户 “{” 用户id “:2,” 名 “:XT, ”维托尔“:X,” 年龄:43}” ...

你可以使用以下方法检索:

SMEMB ERS用户

+0

我仍然使用Redis,但最终我将用户存储在简单的键中,但这也是一个不错的选择。 – bitoiu

相关问题