Redis:如何存储用户哈希列表并检索它?

时间:2014-04-07 21:17:58

标签: redis

我今天开始使用redis并且我已经完成了教程和stackoverflow的一些链接,但是我无法理解如何正确使用redis来实现它看起来非常简单的用例

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

我启动了一个redis客户端,首先添加了第一个标识为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这个用例。

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

2 个答案:

答案 0 :(得分:8)

要理解为什么这些操作在NoSQL实现中显得微不足道,考虑NoSQL存在(并且已经变得非常流行)的原因是很好的。

当您查看像memcached这样的早期NoSQL实现时,第一个用例非常简单,但非常重要:分布式数据的快速缓存,缓存例如网页数据。很快就会添加集群和分片等内容,因此并非所有数据都必须在集群中的每个节点上同时可用,但可以按需收集。

NoSQL与关系数据存储有很大不同。不要过度使用它。考虑关系数据库,因为它们有时更适合您要完成的任务。在你设计的一切事物中,问问自己"这种规模是否很好?"。

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

Redis是一个非常时尚的解决方案,让您以优雅的方式克服许多NoSQL限制。

如果获得"所有用户的列表"不是经常做的事情,或者不需要很好地扩展,总是"我总是想要所有用户"因为无论如何都要进行每日扫描,请使用HSCANSCAN具有适当批量大小的操作不会妨碍其他客户,您可以一次检索几千个记录,并在几次通话后获得所有内容

您还可以将用户存储在SET中。一组中没有排序,所以没有分页。它可以帮助您保持用户名的独特性。

如果你想做&#34之类的事情,那么请告诉我所有以字母开头的用户''""''''''''在我们发言的过程中,我正在等待一两个小时的即将发布的ZSET。或者使用像Josiah Carlsons' rom'这样的ORM。封装

当你问自己时#34;但是现在我在存储我的数据时必须做三次电话而不是一次电话......?!":是的,这是怎么回事。如果需要原子性,请使用Lua脚本或MULTI + EXEC流水线。 Lua通常更容易。

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

希望这有帮助,TW

答案 1 :(得分:3)

如果您仍想使用Redis,可以使用以下内容:

SADD用户" {" userId":1,"姓名":John," vitor":x,"年龄:35 }"

SADD用户" {" userId":2,"名称":xt," vitor":x,"年龄:43 }" ...

您可以使用以下方法检索相同内容:

SMEMBERS用户