高并发场景下如何保证接口幂等性?常见幂等性处理方案防重令牌(token)、随机字符串(noncestr)、幂等表、防重表、数据库唯一索引

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在高并发场景下,保证接口幂等性是非常重要的,以防止重复操作导致的数据不一致等问题。以下分别介绍防重令牌(token)、随机字符串(noncestr,本质和 token 类似)、幂等表、防重表(和幂等表概念相近)、数据库唯一索引这几种保证接口幂等性的方式,并给出相应的代码示例(以 Java 和 MySQL 为例)。


一、防重令牌(token)

原理:客户端在调用接口前,先向服务器获取一个唯一的令牌(token)。调用接口时,将该令牌作为参数传递给服务器。服务器在处理请求前,先检查该令牌是否已被使用。如果已使用,则拒绝处理请求;如果未使用,则处理请求并标记该令牌已使用。
实现步骤

1. 生成令牌:客户端调用获取令牌接口,服务器生成一个唯一的令牌并返回给客户端。
2. 传递令牌:客户端在调用业务接口时,将获取到的令牌作为参数传递。
3. 使用令牌:如果令牌有效,服务器处理业务逻辑,并将令牌标记为已使用:服务器在处理业务接口请求时,先查询令牌表,验证令牌是否有效且未被使用。
4. 使用令牌:如果令牌有效,服务器处理业务逻辑,并将令牌标记为已使用

代码示例

1.生成令牌接口:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.UUID;

@RestController
public class TokenController {
   

    @GetMapping("/generateToken")
    public String generateToken() {
   
        return UUID.randomUUID().toString();
    }
}

2.业务接口:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController {
   

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @PostMapping("/createOrder")
    public String createOrder(@RequestParam String token, @RequestParam String orderInfo) {
   
        // 验证令牌
        String checkTokenSql = "SELECT COUNT(*) FROM token_table WHERE token =? AND used = 0";
        int count = jdbcTemplate.queryForObject(checkTokenSql, new Object[]{
   token}, Integer.class);
        if (count == 0) {
   
            return "Invalid token or token already used";
        }

        // 处理业务逻辑,例如创建订单
        String createOrderSql = "INSERT INTO orders (order_info) VALUES (?)";
        jdbcTemplate.update(createOrderSql, orderInfo);

        // 标记令牌已使用
        String updateTokenSql <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值