大家好,我是程序员牛肉。
相信很多从事Java后端的开发者在初期完成项目接口的时候,一定会忽略掉”幂等性“这个要求。
而”幂等性“在八股中又不是热门内容,因此面试官一般向面试者提问这方面内容的时候,几乎是一问一个不吱声。
今天我就来简单的介绍一下什么是幂等性。
part1
「什么是幂等性」
”幂等性“可以简单的理解为:对于同一操作,不论执行多少次,产生的影响都是相同的。
我来举一个现实中的例子:
当我们在用户网站进行注册的时候,当我们因为系统卡顿而多次点击注册按钮的时候,后端肯定不会在数据库生成多个一样的账号密码,而是只有一个账号密码
在这个场景中去解释幂等性:幂等性就是多次重复调用操作(因为卡顿多次点击注册),对结果只影响一次(最终只注册一个账号密码)
part2
「未保证幂等性引发的问题」
因为没有保证幂等性而引发的问题很常见,比如:
未保证幂等性的订单接口:
保证了幂等性的订单接口:
part3
「如何保证接口幂等性」
1.token机制
当用户发起请求之前,后端会生成一个键值对存储在redis中,键是当前请求用户的ip+参数,值是token。
当用户向后端发送请求的时候,需要携带token,我们在redis中判断是否存在token,如果存在就删除token并且执行操作,如果不存在token就说明当前已经有相同的请求被执行过。
2.分布式锁
我们把传入的参数和用户id作为键值对来构造出一个键值对。每一次进来都要尝试构造键值对,如果构造成功,就执行业务逻辑代码,如果没有执行成功,就拒绝这次请求
第一次构造成功:
第二次构造失败:
3.MySQL去重表
就是在存入MySQL之前,先要检查一下是否有相同数据,如果有相同数据就拒绝插入。
当然了,MySQL去重表技术也是存在缺陷的:不是所有的业务都会使用到MySQL的。
总之,幂等性在分布式系统和接口设计中扮演着至关重要的角色。通过确保相同操作的重复执行不会产生额外的影响,幂等性能够提升系统的可靠性、稳定性和安全性。然而,实现幂等性并非易事,面临诸多挑战,包括并发冲突、性能开销、安全风险等问题。
相信通过我的介绍,你已经大致了解什么是“幂等性”并且如何保证一个接口的幂等性。关注我,带你了解更多计算机干货。