大概描述一下应用场景:
app.get("/handle-work/:workid", async (req, res) => {
const workid = req.params.workid;
const work = await client.get(workid);
if (!work) {
res.send("The work already done:" + workid);
return;
}
// do something sync
// clean redis cache
await client.del(workid);
res.send("Handle:" + workid);
});
这种写法可能会导致一个 workid 被处理两次。 应该如何避免呢? 谢谢
1
lsk569937453 2023-09-21 10:29:31 +08:00
你需要搜索的关键字可能是"redis 分布式锁"
|
2
cloud107202 2023-09-21 10:38:54 +08:00 1
1. do something sync 这里看下能否设计成幂等的. 偶尔调用端抖动一下请求了两次,无碍
2. 如果 1 不可以,要在 handle 之前对 workid 上锁,这里的锁也可以顺势复用 redis 的能力 https://redis.io/docs/manual/patterns/distributed-locks/ |
3
luin 2023-09-21 10:45:42 +08:00 1
把 client.get 换成 client.getdel
|
4
amlee 2023-09-21 12:46:44 +08:00 1
op, 这有个大佬,@luin ,快逮着问
|
5
nodejsexpress 2023-09-21 13:30:06 +08:00
用原子操作的 pop spop
|
6
ChevalierLxc 2023-09-21 13:35:33 +08:00
大哥,你这不是普通的 get ,而是你要上锁啊,拿某个资源,就得锁,让别人竞争不到
|
7
maocat 2023-09-21 16:10:43 +08:00
幂等,防抖
|
8
acerphoenix 2023-09-22 08:45:31 +08:00
你这问题不是异步处理带来的。
|
9
NobodyVe2x OP @luin 感谢大佬~~~ 解开了我的困惑,谢谢
|