提交Redis解决订单重复提交问题(redis 避免订单重复)
什么是Redis?
Redis(全称为Remote Dictionary Server)是一种开源的内存数据库,用来存储字典对象,可以实现高性能数据存储,支持缓存和持久化,支持多种数据结构,并且在网络之间进行共享数据。
订单重复提交是什么?
订单重复提交是指用户在不同的浏览器或者客户端中发起的多次相同的订单请求。由于用户在提交多次订单前没有验证,所以服务器会接收到多个相同订单,导致出现订单重复提交问题。
用Redis解决订单重复提交问题
要解决订单重复提交问题,可以采用Redis来实现。可以首先定义一个缓存key,例如user:order:生成时间,然后将这个key作为value设置到Redis中,并设置有效时间。
当用户第一次发起订单请求时,首先判断Redis是否存在user:order生成的key,如果存在,说明近期内发起过相同的订单请求,可以拒绝改订单的提交;如果不存在,再新建一个key,把当前时间戳作为value存入到Redis,并设置有效时间,如20分钟,可以保证同一用户在一定时间内不会提交相同订单,而如果20分钟后,Redis会自动将该key过期,这时用户又可以提交新的订单请求。
下面是基于node.js实现用Redis解决订单重复提交问题的示例代码:
// 获取redis客户端
let redisClient = require(“redis” ).createClient();
// 订单发起接口处理
app.post(“/api/submit”, (req, res) => {
// 获取用户id
let userId = req.body.user_id;
// 读取用户发起的订单key
let orderKey = `user:${userId}:order`;
// 检查该key是否存在
redisClient.exists(orderKey, (err, reply) =>{
if(err){
res.send({
code:500,
msg:”订单提交异常,请稍后再试”
})
}else{
// 如果key存在,说明该用户已经发起过相同订单请求,返回异常信息
if(reply){
res.send({
code:403,
msg:”订单已经发起,请不要重复提交”
})
}else{
// 如果key不存在,说明用户未发起过相同订单请求,将该key存入redis,并设置有效时间
redisClient.setex(orderKey, 1800, Date.now());
// 此处可执行具体的订单提交流程
res.send({
code:200,
msg:”订单提交成功”
})
}
}
})
})
以上就是用Redis解决订单重复提交问题的方法,理论上可以实现高性能的订单验证,解决订单重复提交问题。