软件开发中的幂等是什么

工作中经常会遇到一个事务型接口或者一个事务型方法被调用方重复调用,实际上每次调用的数据都是相同的,有可能是因为网络延迟,客户端点击了多次,也可能是调用方故意而为之,不论是哪种情况,我们都不能让这种重复的操作对我们自己的系统造成不必要的影响。因此,我们需要对于接口和方法做幂等校验。其实幂等过滤一直都贯穿IT行业,只不过现在随着互联网行业的发展,行业内的造词能力和词语引用能力越来越强,幂等被计算机行业正式引用。

幂等性

在数学概念里,幂等是指一次变换和N次变换的结果都相同。而在计算机概念中,幂等是指某一操作执行n次和执行一次所产生的影响是一样的,也就是重复执行这项操作也不会对系统造成改变,比如抢优惠券,每人限制抢一张优惠券,可以使用用户ID+优惠券ID做幂等条件,这样就可以保证每个用户只能抢一张此优惠券。

RESTFul幂等

  • GET请求:GET请求属于是非事务型请求,每次请求都不会对系统造成任何影响,所以这类接口本身就符合了幂等性(这里说的是对系统造成影响,而不是说每次调用获取到的数据相同,幂等是针对于系统而非接口)
  • DELETE请求:DELETE请求是一个特殊的事务型请求,在调用第一次的时候就已经把数据删除了,所以不论后续再次调用多少次,对系统产生的影响都是一样的,所以DELETE类型的请求本身也是符合幂等性的
  • PUT请求:PUT请求是对数据进行修改,理论上对同一URI进行多次PUT操作对整个系统的影响和一次PUT是相同的,但是这要结合接口具体代码实现来考量
    • 直接将PUT的数值替换掉原有数据:幂等
    • 每次调用都对某个数据递增:非幂等,需要手动幂等
  • POST请求:POST是创建资源的事务型请求,每次请求都会创建一份资源,所以多次调用对整个系统产生的影响是不同的,该类型的请求是非幂等的

常用幂等方法

  • 数据库唯一索引去重

    利用数据库唯一索引的特性达到幂等的效果,不会往数据表中插入两条幂等字段相同的数据。例如文章点赞功能,为了防止用户重复点赞,可以在点赞表中以用户ID+文章ID为唯一索引,这样就可以有效的防止用户给一篇文章重复点赞,最终达到幂等操作的效果。

  • 版本锁控制

    版本锁属于是乐观锁的一种实现,MySQL中的MVCC就是版本锁的一种应用方式,通过每次更新都通过版本号控制权限来达到幂等操作的效果

  • token缓存机制

    token缓存机制是一种比较常见的幂等处理方式,应用范围较广,不限定场景和语言。核心思想就是为每个请求分配一个全局唯一标识(token),一个token在一条业务线的每个阶段只能执行一次,执行之后将这个阶段的结果缓存起来,每次执行前先校验是否已有缓存,没有缓存则执行流程,已有缓存则直接返回结果。

总结

不同的业务需求会面临不同的幂等要求,也就会有不同的解决方案,所以幂等的实现难度是不同的。在做系统设计时,一定要将幂等性考虑周全,否则可能会给系统带来不必要的潜在隐患。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在SV(SystemVerilog),`real` 是一种数据类型,用于表示浮点数。它可以存储单精度(32位)和双精度(64位)浮点数。`real` 类型变量可以使用十进制或科学计数法表示。例如: ``` real myRealVar = 3.14159; real myOtherRealVar = 1.23e-4; ``` `real` 类型通常用于仿真和测试,以便在模拟设计时能够进行浮点运算。但在硬件设计,由于浮点运算比整数运算需要更多的计算资源,因此通常会避免使用 `real` 类型。 ### 回答2: 在计算机科学,sv(SystemVerilog)是一种硬件描述语言,用于描述数字电路和系统级硬件。在sv,real是一种基本的数据类型,用于表示实数。 实数是指包括整数、小数以及无理数在内的所有实数的集合。在sv,real类型可以存储任意大小的浮点数,以及NaN(Not a Number)、正无穷大和负无穷大等特殊的数值。 real数据类型在系统级设计具有重要作用,常见的应用包括模拟电路仿真和数值计算。例如,在模拟电路仿真,可以使用real类型来表示电压、电流等连续变化的物理量。在数值计算,real类型可以用于存储和处理需要高精度计算的实数数据。 需要注意的是,在硬件设计,由于硬件电路是离散的,实数数据通常需要进行离散化处理,在sv可以使用整数类型来表示离散化后的实数。 总结来说,sv的real数据类型用于表示实数,在系统级硬件设计具有广泛的应用。 ### 回答3: SV的real是“真实的”或“实际的”意思。 在软件工程和计算机科学领域,SV通常是指SystemVerilog,一种硬件描述语言。real是SystemVerilog的一种数据类型,它用于表示浮点数。 real类型可以用于存储和操作具有小数部分的数字。它可以表示正数、负数以及0。real类型提供了一些数学运算,如加法、减法、乘法和除法,以及相关的比较运算符。此外,它还支持取模运算符和运算。 使用real类型可以更精确地表示浮点数,而不需要舍入错误或近似值。这对于涉及科学计算、模拟和仿真的应用非常重要,因为这些领域通常需要高度准确的数据表示。 除了real类型,SV还提供其他数据类型,如整数(integer)、布尔(boolean)和字符串(string),以便开发人员能够适应不同的数据需求。这些不同的数据类型可以用于构建复杂的算法和逻辑,使开发人员能够有效地处理各种应用程序和系统设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值