在页面加载nodejs / react js时检索Redis中所有可用的对象



我有一个nodejs/react应用程序,我知道如何在redis(hmset)的对象中存储数据,

但问题是我想得到所有的哈希值存储在redis db,而不是得到一个接一个如下函数,

  1. 是否有任何redis内置的功能来做到这一点?

  2. 如果没有,我可以选择哪些选项来执行此功能?

redisClient.hgetall(category, (err, object) => {
if(err) {
console.error(err);
} else {
console.log(object);
}
});

根据你的回答,我假设在你的redis中不止有category条目。假设是这样,这里有一个比较常见的解决方案,我以前也用过:

使用单独的SET来跟踪包含类别记录的键。因为set已经重复了,所以您不需要担心重复的条目

redis.hset(categoryKey, ...things);
redis.sadd(categoryKeysTracker, categoryKey);

在代码的其他地方,当您希望在记录数量膨胀的情况下提取所有类别时,您应该真正使用scan来遍历SET的条目,而不是在非常大的条目上弹出成员。

现在我在这里使用async/await语法,因为我没有查找旧的异步库签名来做分块的基于回调的异步请求,但如果你仍然在回调系统中,这应该是相当容易的。请记住您可能生成的承诺的数量,并可能以某种方式将此请求分组。

const keys = await redis.smembers(categoryKeysTracker);
const categories = await Promise.all(keys.map((key) => {
return redis.hgetall(key);
});

当/如果你通过在一个键上调用DEL来删除一个类别条目时,你也将在跟踪集

内的同一键上调用SREM
redis.del(categoryKey);
redis.srem(categoryKeysTracker, categoryKey);

另一个要考虑的是在MULTI块中进行写操作(设置,删除),尽管这不是一个硬性要求。

如果你能够使用reresearch,它就是为了解决这个问题而创建的。您只需要创建一个索引,使您的哈希值可搜索:

FT.CREATE category:index ON HASH PREFIX 1 category: SCHEMA field TAG another_field NUMERIC a_third_field TEXT

然后你可以搜索:

FT.SEARCH category:index '@field:{ javascript | typescript } @another_field:[23 42] @a_third_field:patterns

如果你想要一切-听起来像你做的-你也可以搜索:

FT.SEARCH category:index '*'

最新更新