精华内容
下载资源
问答
  • Redis实现分布式锁及接口幂等实现 每一次进行幂等校验之前先获取token,此略过。。。。 创建拦截器 @SpringBootConfiguration public class TokenInterceptorConfig extends WebMvcConfigurerAdapter { @...

    Redis实现分布式锁及接口幂等实现


    每一次进行幂等校验之前先获取token,此略过。。。。

    创建拦截器

    
    @SpringBootConfiguration
    public class TokenInterceptorConfig extends WebMvcConfigurerAdapter {
    @Autowired
    private TokenInterceptor tokenInterceptor;
    
    @Override
    public void addInterceptors(Interceptor registry) {
       //可添加拦截路径
        registry.addInterceptor(tokenInterceptor).addPathPatterns("/order/**");
    }

    拦截器具体实现

    @Slf4j
    @Component
    public class TokenInterceptor implements HandlerInterceptor {
    @Autowired
    private RedisService redisService;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
     String tokenName = request.getRequestURI() + request.getParameter("tokenValue");
        String tokenValue = request.getParameter("tokenValue);
        if (tokenValue != null && !tokenValue.equals("")) {
             return handleToken(request,response,handler);
        }
        return false;
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    String tokenName = request.getRequestURI() + request.getParameter("tokenValue");
    RedisUtil.releaseDistributedLock(redisService,tokenName,tokenName}
    
    /**
     * 分布式锁
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    private boolean handleToken(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //尝试获取分布式锁,获取到锁定时间5分钟
        if (RedisUtil.tryGetDistributedLock(redisService,request.getParameter("tokenValue"),request.getParameter("tokenValue"),300))  
                {               return true;
                }
            
        return false;
    }
    

    服务层具体实现

    @Conment
    public class RedisServiceImpl extends CacheService {
        private static final String SET_IF_NOT_EXIST = "NX";
        private static final String SET_WITH_EXPIRE_TIME = "PX";
        @Autowired
            private JedisPool jedisPool;
        public Jedis getJedis(){
            Jedis jedis = null;
                    try {
                jedis = jedisPool.getResource();
            }catch (Exception e) {
                log.error(e.getMessage());
                return null;
            }finally {
                if (jedis != null) {
                    jedis.close();
                }
            }
            return jedis;
        }
    public String set(String lockKey, String requestId, int expireTime) {
            return getJedis().set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
        }
        
        
    public Object eval(String lockKey, String requestId) {
     String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
     return getJedis().eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
    
    public boolean exists(String key){
            return getJedis().exists(key);
            }

    public class RedisUtil{

    //查实获取分布式锁
    public static boolean tryGetDistributedLock(RedisService service,String key,String reauestId,int expireTime){
    service.setkey(key,reauestId,expireTime);
    }
    //释放分布式锁
    public static boolean releaseDistributedLock(RedisService service, String lockKey, String requestId) {
    Object result = redisService.eval(lockKey,requestId);
    }
    
    }   
    
    
    }
    
    
    
    
    
    
    展开全文
  • 接口幂等实现方案

    千次阅读 2019-01-19 11:03:05
    什么是幂等 数学角度  f(n) = 1^n 。无论n等于多少,f(n)永远值等于1 编程角度  程序无论执行多少次,其产生的结果均与一次执行相同,不会因为重复执行会对系统造成改变 为什么要做幂等      之所以...

    什么是幂等


    • 数学角度

           f(n) = 1^n 。无论n等于多少,f(n)永远值等于1

    • 编程角度
    •       程序无论执行多少次,其产生的结果均与一次执行相同,不会因为重复执行会对系统造成改变

    为什么要做幂等


     

     

               之所以强调幂等,原因在于接口不幂等时,在某些场景下会引发严重的问题:支付、退款、结算等场景时,由于重复点击/操作后,进行了二次处理,导致重复扣款,重复退款,错误结算问题。这时候凡事碰到此问题的用户恐怕心情瞬间崩溃了:   

                                                             

     

    幂等问题引发的常见原因


              引发的原因都有一个共性:短时间内,重复操作。以下场景下可能会发生支付异常导致重复支付:
    1. 网络延迟。请求到后端服务后,后端处理后返回结果的时候网络抖动/延迟。这时前端超时等待结束后再发起请求会导致重复操作行为。
    2. 服务异常。后端因各种异常原因导致服务处理缓慢,前端提示超时后再次发起请求,这时两次请求同时受理会导致重复问题。
    3. 第三方服务异常情况。比如支付场景下,支付时,支付回调超时导致DB没有变,当用户再次发起支付时导致重复支付问题了。
    4. 其他。所依赖服务不稳定(比如第三方支付接口)、服务超时,这时前端如果再次发起支付请求时会导致重复支付。

    业内幂等实现方案


    一、哪些用户行为需要特别保证幂等特性

                 从用户行为来看,操作无外乎增删改查。

    1、查询操作具有天然的幂等特性

    在数据不变的情况下,查询一次和查询多次,结果都是一样的

    2、删除/修改/新增操作需要保证

    删除/修改/新增一次和多次删除/修改/新增,除了产生正常的影响外,不应该产生额外的不必要影响

    二、实现方案思路

               选择方案的原则:任何实现方案根据复杂性都有不同程度的复杂性,因而不是方案越可靠越好,还需要考虑业务需要、实现成本等因素。毕竟适合的才是最好的。

               具体的实现方案可以考虑

    方案一——前端提交限制

    比如,一个按钮,点击一次后,后端接口返回前不允许按钮点击第二次(如置灰);不过这种方案虽然简单,但存在一定的风险,如置灰按钮前再次点击,或直接调用接口

    方案二——token机制

    (1)前端提交数据前,先和后端服务申请一个token;

    (2)提交数据时连同token一起提交;

    (3)下次提交新数据时重复(1)(2)步骤

    实现token要求:唯一性,不重复,并重点实现token的产生、存储机制

    方案三——唯一索引,防止新增脏数据

    当表存在唯一索引,并发时新增报错时,再查询一次如果数据存在旧不用新增了。

    方案四——悲观锁

    获取数据的时候加锁获取

    select * from table_xxx where id='xxx' for update;

    注意:id字段一定是主键或者唯一索引,不然是锁表

    悲观锁使用时一般伴随事务一起使用,数据锁定时间可能会很长,根据实际情况选用

    更多其他方法

    分布式锁、或其他逻辑层限制方案:https://blog.csdn.net/qq_16605855/article/details/80192762

    接口幂等测试


                 了解了什么是幂等后,如何测试就一目了然了:短时间内重复执行来模拟多次调用,检查各种信息是否正常。好了,接口幂等保证后,团队成员就可以睡个安稳觉了。

                                        

     

     

    展开全文
  • 幂等实现方案

    2019-03-01 11:18:37
    https://segmentfault.com/a/1190000015884659
    展开全文
  • 幂等实现思路和细节

    千次阅读 2017-07-25 19:55:12
    向需要使用幂等的方法,添加注解 @MethodCache,编译器,AJC编译器切入该方法,截取方法的执行流,并使用@MethodCache中配置的键供应商、过期时间等配置,决定使用缓存的方法返回值还是调用该方法。   哪些...

    流程

    通常流程简单有效,如图所示:

     

    但我们仍然要考虑某些细节。


    实现细节

    向需要使用幂等的方法,添加注解 @MethodCache,编译器,AJC编译器切入该方法,截取方法的执行流,并使用@MethodCache中配置的键供应商、过期时间等配置,决定使用缓存的方法返回值还是调用该方法。

     


    哪些写接口是幂等的?

    创建订单

    增加用户积分

    扣减用户积分

    回退积分

    展开全文
  • 系统幂等实现

    2016-06-29 18:06:00
    新建一张表,只有业务id(biz_id),并且设置唯一约束,在业务执行完后,插入数据到这张表 insert ignore dup_forbidden (...biz_id...) value(...biz_id...) 通过 insert ignore返回值来判断是否已经执行过了。...
  • 最近的系统中使用了springCloud微服务框架,这种分布式框架的确提供了非常多便利的地方,不过随之也出现了很多的问题,特别是在实际开发中,接口的幂等性。 而所谓的幂等,通俗点说就是一个操作不管请求多少次返回...
  • 【总结】高并发-幂等实现方案

    千次阅读 2018-09-28 14:30:38
    更复杂的操作幂等保证是利用唯一交易号(流水号)实现.   我的理解:幂等就是一个操作,不论执行多少次,产生的效果和返回的结果都是一样的   三、技术方案   1. 查询操作   查询一次和查询多次,在数据不变的...
  • 幂等实现方案01

    万次阅读 2020-08-15 19:22:13
    幂等实现方案 一、什么是幂等性 所谓幂等性,简单地说,就是对接口的多次调用所产生的结果和调用一次是一致的。扩展一下,这里的接口,可以理解为对外发布的HTTP接口或者Thrift接口,也可以是接收消息的内部接口,...
  • 幂等注解实现

    2020-05-18 19:08:38
    有些前端,或者第三方的接口请求要实现幂等操作,考虑到节省开发时间,做了一个可配置的幂等注解 先说明基本的实现原理和优缺点,后面直接贴代码: 原理: 1.通过自定义注解配置幂等参数:唯一主键,过期时间;...
  • 如何实现幂等性? 非商业转载,如有侵权,可联系本人删除 什么叫幂等?如何实现幂等性? 什么是幂等性? 幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两次后会和其作用一次的...
  • 一、什么是幂等性可以参考数据库乐观锁机制,比如执行一条...二、消费端的幂等性保障在海量订单生成的业务高峰期,生产端有可能就会重复发生了消息,这时候消费端就要实现幂等性,这就意味着我们的消息永远不会被...
  • 什么是幂等:贴一张百度百科的图:简单来说幂等保证了只要调用接口成功,外部多次调用对系统的影响是一致的,也就是一个请求多次重试的问题。需要考虑幂等的场景:客户端存在多次提交或者超时重试的情况;分布式架构...
  • 导读现在这个时代大家可能最关心的就是钱了,那么有没有想过你银行转账给...要想要理解上述的疑惑,不得不提的一个概念就是幂等性,至于什么是幂等性,如何通过代码实现幂等性,下面将会详细讲述。什么是幂等性所谓...
  • 什么是幂等?在编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。即不用担心重复执行幂等方法不会影响系统状态。比如setTrue()方法就具有幂等性。在高并发、分布式系统中,对幂等的...
  • 三、为什么需要实现幂等性 四、引入幂等性后对系统的影响 五、Restful API 接口的幂等性 六、如何实现幂等性 方案一:数据库唯一主键 方案二:数据库乐观锁 方案三:防重 Token 令牌 方案四、下游传递唯一...
  • 什么是幂等性?对于同一笔业务操作,不管调用多少次,得到的结果都是一样的。幂等性设计我们以对接支付宝充值为例,来分析支付回调接口如何设计?如果我们系统中对接过支付宝充值功能的,我们需要给支付宝提供一个回...
  • 什么是接口的幂等性,如何实现接口幂等性?(一)幂等性概念幂等性原本是数学上的概念,用在接口上就可以理解为:同一个接口,多次发出同一个请求,必须保证操作只执行一次。 调用接口发生异常并且重复尝试时,总是会...
  • 幂等实现方案

    2019-04-28 09:09:58
    我之前有写过关于HTTP的幂等性:《(HTTP的)幂等性Idempotence》 但是其实幂等不仅仅只是用于HTTP的设计中,很多重要的情况,这些逻辑都需要幂等的特性来支持。...幂等函数,或幂等方法,是指可以使...
  • 一、什么是幂等幂等性:多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。二、使用幂等的场景1、前端重复提交用户注册,用户创建商品等操作,前端都会提交一些数据给后台服务...
  • 等等很多重要的情况,这些逻辑都需要幂等的特性来支持。 实现方案 数据库唯一索引,防止新增脏数据。 token机制,防止重复提交。 token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个...
  • 幂等实现方式整理

    2020-03-24 14:06:59
    参考 实现幂等性的几种方式

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,381
精华内容 952
关键字:

幂等实现