我今天开始使用redis并且我已经完成了教程和stackoverflow的一些链接,但是我无法理解如何正确使用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正确的用例.
你能告诉我这个用例的方法应该是什么?
要理解为什么这些操作在NoSQL实现中看起来并不重要,最好考虑为什么NoSQL存在(并且已经变得非常流行).
当您查看像memcached这样的早期NoSQL实现时,第一个用例非常简单,但非常重要:分布式数据的快速缓存,缓存例如网页数据.很快就会添加集群和分片等内容,因此并非所有数据都必须在集群中的每个节点上同时可用,但可以按需收集.
NoSQL与关系数据存储非常不同.不要过度使用它.考虑关系数据库,因为它们有时更适合您要完成的任务.在你设计的所有东西中,问问自己"这种规模是否很好?".
好的,回到你的问题.进行通配符搜索通常是不好的做法.您可以以可扩展的方式检索数据的方式准备数据.
Redis是一个非常巧妙的解决方案,允许您以优雅的方式克服许多NoSQL限制.
如果获得"所有用户的列表"不是你必须经常做的事情,或者不需要很好地扩展,总是"我真的总是想要所有用户",因为无论如何它都是用于每日扫描,使用HSCAN
.SCAN
具有适当批量大小的操作不会妨碍其他客户端,您可以一次检索几千个记录,并且在几次调用之后您就拥有了所有内容.
您还可以将用户存储在SET
.一组中没有排序,所以没有分页.它可以帮助您保持用户名的独特性.
如果你想做"让我所有的用户以字母'a'开头"这样的话,我会用一个ZSET
.ZRANGEBYLEX
在我们发言的时候,我会等待一两个星期即将发布.或者像Josiah Carlsons的'rom'包一样使用ORM.
当你问自己"但现在我必须做三次电话而不是一次存储我的数据......?!":是的,这是它的工作原理.如果需要原子性,请使用Lua脚本或MULTI + EXEC流水线.Lua通常更容易.
您也可以问自己是否HSET
需要使用a .您需要检索单个数据成员吗?每个密钥或成员都有一些开销.最重要的是,HGETALL
它具有Big-O规范O(N)
,因此它不能很好地扩展.使用JSON或MsgPack将整个行序列化可能会更好,并将其存储在一个HSET
成员中,或者只是一个简单的GET
/ SET
.也读了SORT
.
希望这有帮助,TW