自定义注解,基于Redis实现接口幂等性

一、幂等性概念

幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。

在编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。

幂等就是一个操作,不论执行多少次,产生的效果和返回的结果都是一样的。

二、技术方案

1.数据库唯一索引

对于插入类的操作,一般都是建议要在数据库表中设计一些唯一索引或唯一组合索引来防止新增数据存在脏数据。

2. 悲观锁

获取数据的时候加锁获取

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

注意:id字段一定是主键或者唯一索引

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

3. 乐观锁

乐观锁只是在更新数据那一刻锁表,其他时间不锁表,所以相对于悲观锁,效率更高。

乐观锁可以通过version或者其他状态条件实现:

(1)通过版本号实现

update table_xxx set name=#name#,version=version+1 where version=#version#

(2)通过条件限制

update tablexxx set avaiamount=avaiamount-#subAmount# where avaiamount-#subAmount# >= 0

要求:quality-#subQuality# >= ,这个情景适合不用版本号,只更新是做数据安全校验,适合库存模型,扣份额和回滚份额,性能更高。

注意:乐观锁的更新操作,最好用主键或者唯一索引来更新,这样是行锁,否则更新时会锁表,上面两个sql改成下面的两个更好

update tablexxx set name=#name#,version=version+1 where id=#id# and version=#version#

update tablexxx set avaiamount=avaiamount-#subAmount# where id=#id# and avai_amount-#subAmount# >= 0

4. 基于Redis实现防重

(1)背景

电商系统中,订单创建后,一般会去调用库存服务去扣减库存。

订单服务调用库存服务的时候,因为网络抖动,请求超时了,超过了秒钟,此时订单服务会重试,再次调用一下库存服务,发送一模一样的请求过去。

比如说,订单服务第一次请求库存服务,库存服务其实是把扣减库存的业务逻辑执行成功了,只不过网络问题,导致响应迟迟没有返回给订单服务,可能在1.2s之后返回了响应给订单服务。订单服务就认为请求超时了,他就再次发送了一个一模一样的请求给库存服务,库存服务可能会再次对库存进行扣减。

(2)实现思路

定制化的去针对接口开发幂等性的机制,比如说一旦库存扣减成功之后,就立马要写一条数据到redis里去,如:order_id_11356_stock_deduct,写入redis中,如果写入成功,就说明之前这个订单的库存扣减,没人执行过。但是如果此时有一些重试的请求过来了,调用了你的库存扣减接口,他同时也进行了库存的扣减,但是他用同样的一个key,order_id_11356_stock_deduct,写入redis中,此时会发现已经有人写过key,key已经存在了。此时你就应该直接对刚才的库存扣减逻辑做一个反向的回滚逻辑,将之前扣减的库存加回来。update product_stock set stock = stock + 100,反向逻辑,回滚掉,这样就可以解决重复扣减库存的问题。

(3)具体代码实现

乐观锁实现接口幂等性_calvin-idempotent相关推荐

  1. 乐观锁实现接口幂等性_什么是幂等性,如何实现,以及乐观锁在项目中的实际用法...

    什么是幂等性? 对于同一笔业务操作,不管调用多少次,得到的结果都是一样的.普通方式 只适合单机 jvm加锁方式Lock只能在一个jvm中起效,如果多个请求都被同一套系统处理,上面这种使用Lock的方式 ...

  2. 乐观锁实现接口幂等性_深入理解幂等性

    什么是幂等性 HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外).也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同. ...

  3. 数据库乐观锁如何实现幂等性?

    数据库乐观锁方案一般只能适用于执行更新操作的过程,我们可以提前在对应的数据表中多添加一个字段,充当当前数据的版本标识. 这样每次对该数据库该表的这条数据执行更新时,都会将该版本标识作为一个条件,值为上 ...

  4. oracle 锁表如何解决_「技术分享」高并发下的接口幂等性解决方案

    高并发下的接口幂等性解决方案! 一.背景我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果.例如:前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果.我们发起 ...

  5. 接口幂等性的设计之————redis分布式锁的应用

    接口幂等性的设计之----redis分布式锁的应用 在集群分布式机器部署的前提下,接口在相同数据高并发的情况下如果没有唯一索引的情况下,可能会有一些问题. 比如: 插入或更新商品的接口,如果没有则插入 ...

  6. ssm框架逻辑删除mysql_MybatisPlus--CRUD接口及主键增长策略、自动填充、乐观锁更新数据...

    目录 一.insert 1.插入操作 2.主键策略 二.update 1.根据Id更新操作 2.自动填充 3.乐观锁 三.select 1.根据id查询记录 2.通过多个id批量查询 3.简单的条件查 ...

  7. 高并发下的接口幂等性解决方案

    一.背景 我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果. 例如: 前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果. 我们发起一笔付款请求,应该只扣用 ...

  8. 高并发下接口幂等性技术方案

    一.背景 我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果. 例如1. 前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果:2. 我们发起一笔付款请求,应该 ...

  9. Spring Boot 实现接口幂等性的 4 种方案!还有谁不会?

    点击关注公众号,Java干货及时送达 作者:超级小豆丁 链接:mydlq.club/article/94 一.什么是幂等性 幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两 ...

最新文章

  1. 单选框_vue实现单选框自定义样式
  2. hibernate学习内容
  3. 今晚直播丨Oracle数据库之Object的Access方法和结合方法
  4. VSCODE打开野火电机代码需要增加的配置 c_cpp_properties.json
  5. mysql索引方式_MySQL数据库的索引方式
  6. linux系统信息查看命令
  7. .NET Core开发的iNeuOS物联网平台部署树莓派(raspbian),从网关到云端整体解决方案。助力2019中国.NET峰会。
  8. Qt Creator编辑3D场景
  9. BZOJ.4453.cys就是要拿英魂!(后缀数组 单调栈)
  10. coc机器人苹果_警察机器人绳索英雄
  11. 书家必备——容易寫錯用錯的繁體字一百例
  12. word恢复到安装时的状态?
  13. python全角半角的相互转换
  14. java移位运算符详解
  15. 基于TP5、EasyWeChat、fastadmin微信公众号网页授权登录
  16. ES match query
  17. 用C语言实现简单的猜数字小游戏
  18. 关于模拟题的一些弱鸡总结
  19. 配置域名 二级,三级的泛解析
  20. 大数据培训:Spark 性能调优详解

热门文章

  1. 路由器不同网段虚拟服务器设置,局域网中不同网段互访?静态路由表必须要学会设置...
  2. 教你根据情况快速导入单号查询快递单号物流
  3. 线性代数之——消元法
  4. Salesforce的V2MOM工作法:明确企业在做什么
  5. 查询表锁争用情况 table_locks_waited table_locks_immedaite
  6. SLAM十四讲ch5 joinMap错误解决
  7. 连续仨月霸占牛客榜首京东T8呕心巨作:700页JVM虚拟机实战手册
  8. DolphinDB Database丨 最简最快的WorldQuant 101 Alpha因子实现
  9. Photoshop脚本 批量生成Web切图
  10. SDN南向接口和北向接口区别