Redis缓存数据库的新种类。我有一个场景,其中有一个项目列表(例如约5000个),将其转换为JSON格式大约需要400 MB。因此,每次修改任何一项时,我都必须从Redis数据库中获取值,并且必须更改该特定项目,然后再次将其推送到Redi数据库中。这有点影响性能。
因此,与其将整个项目缓存在一个文件中,不如将其缓存。我决定将这些项目分别缓存在Redis数据库中。但是,如果我需要一次获取所有项目,则必须循环并将5000个密钥传递给Redis,并获取将在Redis中进行5000次调用的数据。是否可以选择在必要时一次获取所有项目,以便在需要时可以获取所有数据以及单个数据?在Redis中可以存储多少个密钥也有任何限制吗?
预先感谢
答案 0 :(得分:1)
答案 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的模块。