大概描述一下应用场景:
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. 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 ![]() 把 client.get 换成 client.getdel |
![]() | 4 amlee 2023-09-21 12:46:44 +08:00 ![]() 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 感谢大佬~~~ 解开了我的困惑,谢谢 |