如何立即获取Redis数据库中的键值列表?

时间:2019-11-21 10:51:24

标签: redis stackexchange.redis

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

因此,与其将整个项目缓存在一个文件中,不如将其缓存。我决定将这些项目分别缓存在Redis数据库中。但是,如果我需要一次获取所有项目,则必须循环并将5000个密钥传递给Redis,并获取将在Redis中进行5000次调用的数据。是否可以选择在必要时一次获取所有项目,以便在需要时可以获取所有数据以及单个数据?在Redis中可以存储多少个密钥也有任何限制吗?

预先感谢

2 个答案:

答案 0 :(得分:1)

通过在Redis中使用Hash可以实现此目的。通过使用HSET,您可以更新单个值,也可以通过使用HGETALL,在一次调用中获取所有5000数据

答案 1 :(得分:1)

您在这里有很多选择。最好的办法是使用一个哈希值存储您的所有项目,每个哈希字段一个项目。项目本身很可能具有自己的值,您可以在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的模块。

相关问题