我今天开始使用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这个用例。
你能告诉我这个用例的方法应该是什么?
答案 0 :(得分:8)
要理解为什么这些操作在NoSQL实现中显得微不足道,考虑NoSQL存在(并且已经变得非常流行)的原因是很好的。
当您查看像memcached这样的早期NoSQL实现时,第一个用例非常简单,但非常重要:分布式数据的快速缓存,缓存例如网页数据。很快就会添加集群和分片等内容,因此并非所有数据都必须在集群中的每个节点上同时可用,但可以按需收集。
NoSQL与关系数据存储有很大不同。不要过度使用它。考虑关系数据库,因为它们有时更适合您要完成的任务。在你设计的一切事物中,问问自己"这种规模是否很好?"。
好的,回到你的问题。进行通配符搜索通常是不好的做法。您可以以可扩展的方式检索数据的方式准备数据。
Redis是一个非常时尚的解决方案,让您以优雅的方式克服许多NoSQL限制。
如果获得"所有用户的列表"不是经常做的事情,或者不需要很好地扩展,总是"我总是想要所有用户"因为无论如何都要进行每日扫描,请使用HSCAN
。 SCAN
具有适当批量大小的操作不会妨碍其他客户,您可以一次检索几千个记录,并在几次通话后获得所有内容
您还可以将用户存储在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用户