Redis重复提交防不胜防(redis重复提交没防住)

2023-05-12 20:13:03 提交 重复 防不胜防

Redis是一个强大的NoSQL数据库,它可以极大地提高系统的吞吐量和响应能力。然而,随着Redis的普及,一些新问题也随之而来,其中之一就是重复提交问题。 这种问题可能会导致破坏性结果,所以必须加以解决。

Redis重复提交问题一般是由用户重复发出重要请求所引起的。比如,用户在正常情况下想要一次执行一个添加新用户的操作,但因为网络或其他原因,用户请求发出后没有收到响应,用户又再次发出相同的操作请求,这就会导致Redis的重复提交问题。

要想解决Redis重复提交问题,常用的做法是采用悲观锁或乐观锁。在悲观锁的方案中,用户在发出请求之前会锁定数据,以防止重复提交问题发生;而在乐观锁方案中,用户在发出请求时会带上一个有效期,以验证数据有没有被修改,如果有的话就会抛出异常,重复提交的问题也就被解决了。

而且,可以采用消息队列的方式来实现Redis重复提交的防范。当客户端请求发出后,会先将数据出入消息队列,消息队列会实时记录请求,当有用户发出相同的请求时,消息队列会判断出这是重复提交,然后拒绝此次提交,重复提交的问题也就可以被解决:

// 队列记录用户提交过的请求
const queue = []

/**
* @description 比较提交信息
* @param {Object} reqInfo
*/
const isExisted = (reqInfo) => {
for (let i = 0; i
const dataInfo = queue[i]
if (dataInfo.key === reqInfo.key) {
return true
}
}
queue.push(reqInfo)
return false
}
/**
* @description 响应请求
* @param {Object} req
*/
const response = (req) => {
const reqInfo = {
key: req.url
}
if (isExisted(reqInfo)) {
return {
success: false,
errorMsg: '重复提交'
}
} else {
// 执行操作
return {
success: true
}
}
}

Redis重复提交问题是一个相当棘手的问题,但有正确的方法可以解决:采用悲观锁或乐观锁,利用消息队列机制,都能防止Redis被重复提交。

相关文章