gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:00:24 24 4
gpt4 key购买 nike

我已经开始使用 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' 开头的用户”之类的操作,我会使用 ZSETZRANGEBYLEX 我会等待一两周,它即将发布,就在我们说话的时候。或者使用像 Josiah Carlsons 的“rom”包这样的 ORM。

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

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

希望这有帮助,TW

关于Redis:如何存储用户哈希列表并检索它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22923287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com