我想在我的node.js API中集成一个缓存层.我之前从未建过一个,所以我有几个问题.
我有称为"容器"的对象
我想通过查找这些容器id.通常是多个容器.查找不一致,每个用户都有一组不同的查找ID.
我目前不需要查询数据.所以我开始只使用键/值存储,其中键是类似的"container_1",数据是序列化的json表示.
但我必须立即查找多个容器.我注意到哈希数据类型所以现在我做" hmset containers [id] [serialized json].这样我可以做到hmget containers 1 3 4返回容器1,3,4.
将redis中的哈希值存储为真实对象会更好hmset containers:1 name test-container吗?这是有效还是处理数据的正常方式?从时间复杂度的角度来看,这种策略如何扩展到数十或数十万个条目?我可以expire在套装上使用钥匙吗?
谢谢
这里有几个问题.我会尽力回答所有这些问题.
听起来你提出了三种可能的存储方案.以下是关于每种后果的一些注释.
您可以轻松地一次检索多个容器MGET.此选项在性能上应与将所有容器存储在单个哈希中相同.此选项将需要更多内存,因为顶级键比哈希字段具有更多开销.您可以获得使用顶级密钥的优势,因此您可以单独使容器过期,并在单个容器上使用其他关键命令,如DUMP/ RESTORE/ OBJECT/ MIGRATE.
如您所述,HMGET将允许您一次检索多个容器.此选项比选项#1的内存效率略高.这也允许您的顶级密钥空间保持较小,因为它不会随每个容器一起增长.这个优点并不重要,但它是一个小的行政辅助,因为你可以使用KEYS命令,减少痛苦.它应该与选项#1一样快.
如果每个容器都是JSON对象,那么它应该很好地映射.当对象的值不是简单字符串时,您仍然需要决定该怎么做.您可能仍需要将每个值存储为JSON或其他一些序列化格式.这个解决方案可以说是最复杂的.尝试在javascript中重新创建原始容器时可能会遇到性能损失,因为每个属性都需要独立解析并重新构建为最终对象,除非驱动程序在某处为您执行此操作.
这种方法可以使检索容器的特定字段变得更容易和更高效.
使用此方法在一个命令中检索多个容器会更加困难,因为它需要管道或Lua脚本.
每种方法的适当性,可扩展性和时间复杂性在很大程度上取决于您的访问模式.您是否尝试按容器属性的值进行搜索?然后,选项#3开始看起来很有吸引力.否则,选项#1和#2看起来最具吸引力.理想情况下,您将使用其他键来为各种用例构建数据索引.您可能有一个集合,其中包含属于用户的容器ID,或者包含按上次更新时间排序的容器ID的列表.
所有这些方法都是合理的,使用其他索引可以帮助确保任何方法都可以扩展.
我可以
expire在套装上使用钥匙吗?
是.无论何种类型,您都可以使任何密钥到期.字符串,散列,列表,集等