如何将 redis.get 值存储到变量

How to store redis.get value to a variable

我正在尝试将 Redis 键值存储到 nodejs 中的变量,例如

let gPost;
redis.get("posts", async function (err, post) {
    if (err) console.log(err);
    if (post) gPost = post;
}

但是这种方法让我不确定。有什么方法可以为 Redis 存储价值吗?我已经搜索过了,一些 post 建议使用回调。但我基本上想要的是这样的:

router.post("/:id/likes", async (req, res) => {
    try {
        redis.get(`posts.${req.params.id}.likes`, function (err, likeCount) {
            if (err) console.error(err.message);

            redis.get(`posts.${req.params.id}`, async function (err, post) {
                if (err) console.log(err);
                if (post) {
                    await customCallback(likeCount, post, req, res);
                    const retPost = JSON.parse(post);
                    return res.send({ retPost, redis: true });
                } else {
                    try {
                        const reqPost = await Post.findById(req.params.id).lean().exec();
                        redis.set(`posts.${req.params.id}`, JSON.stringify(reqPost));
                        await customCallback(likeCount, reqPost, req, res);
                        const retPost = JSON.parse(post);
                        return res.send({ retPost, redis: false });
                    } catch (err) {
                        console.log(err);
                    }
                }
            });
            console.log(upPost);
        });
    } catch (err) {
        return res.status(500).send({ message: err.message });
    }
});

所以,我想在 post 上增加我的点赞数。但我不想对数据库发出任何不必要的请求。首先,我得到 posts.id.likes 并在其中尝试获取 post。如果找到 post,我只会在那里增加我的喜欢。否则,我将对数据库进行 API 调用以获取 post。你能在我弄错的地方,或者我可以使用的任何其他有效方法吗?谢谢

如果您使用的是最新版本的 node-redis,您可以只使用 promises。

您的代码似乎简化为

/**
 * Get a post from Redis or the database.
 *
 * If found in the database, caches it in Redis.
 *
 * Returns a pair: post object and whether it was from Redis.
 * @param id Post ID.
 */
async function getPost(id) {
  const redisKey = `posts.${id}`;
  const postData = await redis.get(redisKey);
  if (postData) {
    return [JSON.parse(postData), true];
  }
  const postObj = await Post.findById(id).lean().exec();
  await redis.set(redisKey, JSON.stringify(post));
  return [postObj, false];
}

router.post("/:id/likes", async (req, res) => {
  try {
    const { id } = req.params;
    const [postObj, fromRedis] = await getPost(id);
    const likeCount = await redis.get(`posts.${id}.likes`);
    await customCallback(likeCount, postObj, req, res);
    return res.send({ postObj, redis: fromRedis });
  } catch (err) {
    return res.status(500).send({ message: err.message });
  }
});