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 中的集合来管理您自己的索引。
我想更新我的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 中的集合来管理您自己的索引。