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

标签 redis

我已经开始使用 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/

相关文章:

bash - 如何在 redis-cli 参数中使用控制字符?

ruby - 你如何查看一个redis存储的lua脚本(用于调试)?

nosql - Redis 与 Cassandra(Bigtable 数据模型)

asp.net-core - RedisConnectionException : . 网络核心连接到 AWS 中的 Redis 缓存

sql - NoSQL 设计原则与连接

node.js - 如何从redis中的值中获取键并通过检查其值删除其他键?

python - 寻找 : nosql (redis/mongodb) based event logging for Django

java - 具有集群支持的 Spring Data Redis

redis - 模仿慢速 Redis 服务器

redis - 当某个 key 已写入 RDB 文件后,bgsave 是否会保存更改?