我用 SpringBoot+Redis 扛住了瞬间几千次的重复提交

本文介绍了如何利用SpringBoot和Redis实现接口幂等性,详细讲解了搭建Redis服务、自定义注解、Token创建与检验、拦截器配置的步骤,并通过测试用例验证了其有效性。
摘要由CSDN通过智能技术生成

前言

在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的影响相同。按照这个含义,最终的含义就是 对数据库的影响只能是一次性的,不能重复处理。如何保证其幂等性,通常有以下手段:

  1. 数据库建立唯一性索引,可以保证最终插入数据库的只有一条数据
  2. token机制,每次接口请求前先获取一个token,然后再下次请求的时候在请求的header体中加上这个token,后台进行验证,如果验证通过删除token,下次请求再次判断token
  3. 悲观锁或者乐观锁,悲观锁可以保证每次for update的时候其他sql无法update数据(在数据库引擎是innodb的时候,select的条件必须是唯一索引,防止锁全表)
  4. 先查询后判断,首先通过查询数据库是否存在数据,如果存在证明已经请求过了,直接拒绝该请求,如果没有存在,就证明是第一次进来,直接放行。

redis实现自动幂等的原理图:

搭建redis的服务Api

  • 首先是搭建redis服务器。

  • 引入springboot中到的redis的stater,或者Spring封装的jedis也可以,后面主要用到的api就是它的set方法和exists方法,这里我们使用springboot的封装好的redisTemplate

    /**

    • redis工具类
      */
      @Component
      public class RedisService {

      @Autowired
      private RedisTemplate redisTemplate;

      /**

      • 写入缓存
      • @param key
      • @param value
      • @return
        */
        public boolean set(final String key, Object value) {
        boolean result = false;
        try {
        ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
        operations.set(key, value);
        result = true;
        } catch (Exception e) {
        e.printStackTrace();
        }
        return result;
        }

      /**

      • 写入缓存设置时效时间
      • @param key
      • @param value
      • @return
        */
        public boolean setEx(final String key, Object value, Long expireTime) {
        boolean result = false;
        try {
        ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
        operations.set(key, value);
        redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
        result = true;
        } catch (Exception e) {
        e.printStackTrace();
        }
        return result;
        }

      /**

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值