Redis - 如何使用 SREM 查找值?

Redis - How to find values with SREM?

我想更新我的SET。我看到这是不可能的,但我可以再做一次 SREM 和 SADD。

问题是,我无法使用 SREM 找到旧值。我的数据是:

{"owner_id":30902468,"qu1":{"q1":"test","a1":"test"},"qu2":{"q2":"test","a2":"test"},"qu3":{"q3":"test","a3":"test"},"created_at":1648925484846,"score":1,"ip":"NA"}

我可以用 owner_id 得到这个,所以我做了 await redis.srem("qa", backtick{"owner_id":${owner_id}*backtick); 但是,它不起作用。

这是我的完整代码:

import Redis from "ioredis";

export default async function create(req, res) {
  const redis = new Redis(process.env.U_REDIS_URL);
  const { q1, a1, q2, a2, q3, a3, owner_id } = req.body;

  if (!q1 && !a1) {
    res.status(400).json({
      error: "Type at least one question",
    });
  } else if (q1.length < 150) {
    const newEntry = {
      owner_id,
      qu1: { q1, a1 },
      qu2: { q2, a2 },
      qu3: { q3, a3 },
      created_at: Date.now(),
      score: 1,
      ip: "NA",
    };
    await redis.srem("qa", `{"owner_id":${owner_id}*`); // THIS IS NOT WORKING - DONT KNOW HOW TO GET OLD VALUE
    await redis.sadd("qa", JSON.stringify(newEntry));
    res.status(200).json({
      body: "success",
    });
  } else {
    res.status(400).json({
      error: "Max 150 characters please.",
    });
  }

  await redis.quit();
}

SREM 命令不能使用通配符。这根本行不通。要从 Set 中删除项目,您必须提供整个成员。所以,例如:

> SADD foo apple
> SADD foo alpine
> SADD foo alpha

要用香蕉替换苹果,您不能输入 SREM foo ap* 然后再输入 SADD foo banana。您必须匹配整个成员:

> SREM foo apple
> SADD foo banana

根据您的示例,我认为更好的解决方案是将您的 JSON 字符串存储在一个字符串中(或者可能是 RedisJSON,如果这是一个选项),键为 qa:30902468 然后将所有者 ID 存储在集合中。

> SET qa:30902468 '{"owner_id":30902468,"qu1":{"q1":"test","a1":"test"},"qu2":{"q2":"test","a2":"test"},"qu3":{"q3":"test","a3":"test"},"created_at":1648925484846,"score":1,"ip":"NA"}'
> SADD qa 30902468

然后,当您需要更改字符串时,只需更改字符串:

> SET qa:30902468 '{ "some": "other", "JSON": true }'

当你需要读取 Set 中的所有内容时,只需向 Set 询问 ID:

> SMEMBERS qa
1) "30902468"
2) "30902469"
3) "30902470"

然后根据返回的ID查询字符串:

> GET qa:30902468
> GET qa:30902469
> GET qa:30902470

您在这里所做的基本上是使用 Redis 中的集合来管理您自己的索引。