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/