Node 使用 Redis 如何处理因异步取值不准确的问题?

2023-09-21 10:16:04 +08:00
 NobodyVe2x

大概描述一下应用场景:

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 被处理两次。 应该如何避免呢? 谢谢

1700 次点击
所在节点    Node.js
9 条回复
lsk569937453
2023-09-21 10:29:31 +08:00
你需要搜索的关键字可能是"redis 分布式锁"
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/
luin
2023-09-21 10:45:42 +08:00
把 client.get 换成 client.getdel
amlee
2023-09-21 12:46:44 +08:00
op, 这有个大佬,@luin ,快逮着问
nodejsexpress
2023-09-21 13:30:06 +08:00
用原子操作的 pop spop
ChevalierLxc
2023-09-21 13:35:33 +08:00
大哥,你这不是普通的 get ,而是你要上锁啊,拿某个资源,就得锁,让别人竞争不到
maocat
2023-09-21 16:10:43 +08:00
幂等,防抖
acerphoenix
2023-09-22 08:45:31 +08:00
你这问题不是异步处理带来的。
NobodyVe2x
2023-09-23 21:28:25 +08:00
@luin 感谢大佬~~~ 解开了我的困惑,谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/975777

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX