gpt4 book ai didi

node.js - 如何使用 Redis 以原子方式增加值

转载 作者:IT王子 更新时间:2023-10-29 06:06:08 28 4
gpt4 key购买 nike

我在 nodejs 中有以下代码:

const decrease = async (userId, points) => {
const user = await redisClient.hgetall(userId);
if(user.points - points >= 0) {
await redisClient.hset(userId, userId, user.points - points);
}
}

由于 async/await 不会阻塞执行,如果有多个请求对同一个 userId,则代码不会以原子方式运行。这意味着即使用户帐户中没有足够的积分,用户积分也可能会被多次减少。如何使该方法以原子方式运行?

我检查了 redis multi 命令,它适用于多个 redis 语句。但就我而言,我需要计算不属于 redis 命令的用户点数。那么如何让它们作为原子函数运行。

我还阅读了 INCR 模式:https://redis.io/commands/incr但它似乎并没有解决我的问题。那里列出的模式需要与过期一起使用,我没有这样的要求来提供特定的超时值。

最佳答案

通过调用 EVAL 使用 (Redis) 服务器端 Lua 脚本的强大功能.它应该看起来像这样:

const lua = `
local p = redis.call('HGET',KEYS[1],'points')
local d = p - ARGV[1]
if d >= 0 then
redis.call('HSET', KEYS[1], 'points', d)
end`
const decrease = async (userId, points) => {
await redisClient.eval(lua, 1, userId, points);
}

关于node.js - 如何使用 Redis 以原子方式增加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50736307/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com