【后端开发面试题】每日 3 题(十五)

✍个人博客:Pandaconda-CSDN博客

📣专栏地址:https://blog.csdn.net/newin2020/category_12903849.html

📚专栏简介:在这个专栏中,我将会分享后端开发面试中常见的面试题给大家,每天的题目都是独立且随机的,之前的面试题不会影响接下来的学习~

❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

题目 1: 什么是分布式锁?它的使用场景是什么?如何实现一个可靠的分布式锁?

答案:
分布式锁是一种用于在分布式系统中协调多个节点对共享资源访问的机制,确保同一时间只有一个节点能够操作资源。

使用场景:

  1. 库存扣减

    在电商系统中,防止多个用户同时购买同一件商品导致超卖。

  2. 任务调度

    确保某个定时任务在同一时间只被一个节点执行。

  3. 数据一致性

    在分布式事务中,保证多个节点的操作顺序和一致性。

实现可靠的分布式锁的方法:

  1. 基于 Redis 实现

    • 使用 SETNX(Set if Not Exists)命令设置锁。

    • 示例:

      bash 复制代码
      SET lock_key "lock_value" NX EX 10

      其中 NX 表示只有键不存在时才设置,EX 10 表示锁的有效期为 10 秒。

    • 解锁时需验证锁的值是否匹配,避免误删其他客户端的锁。

  2. 基于 Zookeeper 实现

    • 利用 Zookeeper 的临时顺序节点特性,当某个节点创建了临时节点时,表示获取锁;当节点断开连接时,临时节点会被自动删除,从而释放锁。
  3. 可靠性保障

    • 锁的超时机制:防止死锁的发生。
    • 可重入性:同一个客户端多次获取锁时需要支持递归锁。
    • 高可用性:确保锁服务本身是高可用的(如 Redis 集群或 Zookeeper 集群)。

题目 2: 什么是数据库分库分表?它的作用是什么?如何设计分库分表策略?

答案:
数据库分库分表是指将一个大型数据库拆分为多个小型数据库(分库)或将一张大表拆分为多张小表(分表),以提升系统的性能和扩展性。

作用:

  1. 提高查询效率

    减少单表的数据量,加快查询速度。

  2. 增强并发能力

    将请求分散到多个数据库实例,降低单点压力。

  3. 解决存储瓶颈

    分布式存储可以突破单机存储容量的限制。

  4. 支持水平扩展

    通过增加节点轻松扩展系统的处理能力。

设计分库分表策略的方法:

  1. 选择分片键 (Sharding Key)

    • 根据业务特点选择合适的字段作为分片键(如用户 ID、订单 ID)。
    • 确保分片键具有高基数(唯一值多)和均匀分布的特性。
  2. 确定分片算法

    • 范围分片:按分片键的范围划分数据(如用户 ID 1-1000 存储在 A 库,1001-2000 存储在 B 库)。
    • 哈希分片:对分片键进行哈希运算,将结果映射到不同的数据库或表。
  3. 设计分库分表规则

    • 垂直分库:按业务模块拆分(如用户数据存储在用户库,订单数据存储在订单库)。
    • 水平分表:按分片键将同一张表的数据分散到多张表中。
  4. 处理跨库查询

    • 使用中间件(如 MyCat、ShardingSphere)支持跨库查询。
    • 或者在应用层合并查询结果。
  5. 监控与优化

    定期监控分库分表的效果,调整分片策略以应对数据增长。


题目 3: 什么是幂等性?为什么它在接口设计中重要?如何实现接口的幂等性?

答案:
幂等性是指无论调用一次还是多次,接口的结果都是一致的。换句话说,重复调用不会对系统状态产生额外的影响。

重要性:

  1. 防止重复提交

    在网络不稳定或用户误操作的情况下,确保重复请求不会导致数据异常。

  2. 提升系统稳定性

    幂等性设计可以减少因重复调用引发的错误,提升系统的容错能力。

  3. 简化业务逻辑

    幂等性使得接口更易于理解和维护。

实现接口幂等性的方法:

  1. 使用唯一标识符

    • 为每个请求分配唯一的 ID(如 UUID),在服务端记录已处理的请求 ID,避免重复处理。

    • 示例:

      python 复制代码
      def handle_request(request_id, data):
          if request_id in processed_requests:
              return {"message": "Request already processed"}
          # 处理请求逻辑
          processed_requests.add(request_id)
          return {"message": "Request processed successfully"}
  2. 状态检查

    • 在处理前检查资源的状态,确保操作不会重复执行。
    • 示例:支付接口中,检查订单是否已支付,避免重复扣款。
  3. 数据库约束

    • 使用唯一索引或唯一约束防止重复插入。
    • 示例:在插入订单时,使用订单号作为唯一索引。
  4. Token 机制

    • 在前端生成一次性 Token,后端在处理请求时验证并销毁 Token。
    • 示例:表单提交时生成 Token,提交后立即失效。
  5. 补偿机制

    • 对于非幂等操作,设计补偿逻辑(如撤销操作)以恢复系统状态。

示例:

在支付系统中,使用订单号作为幂等性标识:

  • 第一次支付成功后记录订单号。
  • 如果用户再次发起相同订单号的支付请求,直接返回已支付的结果,避免重复扣款。
相关推荐
海姐软件测试4 分钟前
接口和压测工具都有哪些,是如何选择的?
测试工具·面试·职场和发展
Long_poem5 分钟前
【自学笔记】MongoDB基础知识点总览-持续更新
数据库·笔记·mongodb
MelonTe5 分钟前
Raft学习笔记
算法·后端开发
草明9 分钟前
python 操作 mongodb 输出执行命令的日志
开发语言·python·mongodb
CodeJourney.11 分钟前
AI赋能办公:开启高效职场新时代
数据库·人工智能·算法
天才测试猿11 分钟前
Python接口自动化浅析unittest单元测试原理
自动化测试·软件测试·python·测试工具·单元测试·测试用例·集成测试
油丶酸萝卜别吃13 分钟前
springBoot中不添加依赖 , 手动生成一个token ,并校验token,在统一拦截器中进行校验 (使用简单 , 但是安全性会低一点)
java·spring boot·后端
yscript18 分钟前
linux系统安装和激活conda
linux·运维·人工智能·python·深度学习·conda
dapeng-大鹏21 分钟前
Go语言中的错误处理与异常恢复:性能对比与实践思考
开发语言·后端·golang·错误处理