redis - 如何一次性获取Redis数据库中的键值列表?

标签 redis stackexchange.redis

Redis 缓存数据库有点新。我有一个场景,其中有一个项目列表(大约 5000 个),将其转换为 JSON 格式大约需要 400 MB。因此,每次修改任何一项时,我都必须从 Redis 数据库获取值,并且必须更改该特定项,然后再次将其推送到 Redi 数据库。这会影响性能。

因此,不要将所有项目缓存在一个文件中。我决定将这些项目单独缓存在 Redis 数据库中。但是如果我需要一次获取所有项目,我必须循环并将 5000 个键传递给 Redis 并获取数据,这将在 Redis 中进行 5000 次调用。是否有任何选项可以在必要时立即获取所有项目,以便我可以在必要时获取所有数据以及个人数据? Redis 中可以存储的 key 数量是否有限制?

提前致谢

最佳答案

这里有很多选择。最有可能的是,最好的方法是使用一个哈希来存储所有项目,每个哈希字段一个项目。项目本身很可能有自己的值,您可以在 json 中序列化每个项目。您可以使用以下方式创建:

> hmset items 01 "{'name': 'myCoolItem', 'price': 0.99}" 02 "{'name': 'anotherItem', 'price': 2.99}" ...

您可以获得所有元素:

> hgetall items
  1) "01"
  2) "{'name': 'myCoolItem', 'price': 0.99}"
  3) "02"
  4) "{'name': 'anotherItem', 'price': 2.99}" 
  ...

您可以通过以下方式获得单个项目:

> hget items 02
  "{'name': 'anotherItem', 'price': 2.99}"

这是更新和获取项目之间的权衡,假设单个项目的更新操作不那么频繁或者项目没有大量字段。要更新给定项目的给定字段,您仍然需要在本地反序列化、修改、序列化,然后更新回 Redis,但您是在每个项目的基础上执行此操作。

如果每个项目有大量字段或者更新操作相当频繁,则可以为每个项目使用一个哈希键:

> hset item:01 name myCoolItem price 0.99
> hset item:02 name anotherItem price 2.99

这允许您一次获取或修改一项的一个字段:

> hset item:02 price 3.49
> hget item:01 price
  "0.99"

然后,您可以使用多个 hgetall 命令获取所有项目。为了避免每个项目访问一次服务器,您可以使用管道。请参阅Is there MGET analog for Redis hashes?

第三种选择,您可以考虑使用类似 RedisJson 的模块.

关于redis - 如何一次性获取Redis数据库中的键值列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58973155/

相关文章:

redis - 超过Redis maxmemory

lua - StackExchange Redis客户端在使用lua时如何知道调用哪个集群节点?

laravel - 从 redis 'incrby' 检索访问者计数并创建热门帖子

redis - 如何在redis中设置用户名和密码?

c# - redis查询二级索引的最有效方式

redis - 始终在同一位置从 Redis 缓存中检索时出现超时异常

node.js - Express.js 中的 Redis SET 命令

c#-4.0 - Lua脚本优化

Redis pub/sub 架构在发布到 chanel 时返回 0

c# - 使用 StackExchange.Redis 超时异常的原因可能是什么?