【后端开发面试题】每日 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. 补偿机制

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

示例:

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

  • 第一次支付成功后记录订单号。
  • 如果用户再次发起相同订单号的支付请求,直接返回已支付的结果,避免重复扣款。
相关推荐
Chandler241 小时前
一图掌握 MySQL 核心要点
数据库·mysql
CodeJourney.1 小时前
从PPT到DeepSeek开启信息可视化的全新之旅
数据库·人工智能·算法·excel·流程图
水w3 小时前
【Python爬虫】简单案例介绍1
开发语言·爬虫·python
程序猿阿伟5 小时前
《分布式软总线牵手云服务,拓展应用新维度》
分布式
FreakStudio5 小时前
一文速通 Python 并行计算:07 Python 多线程编程-线程池的使用和多线程的性能评估
python·单片机·嵌入式·多线程·面向对象·并行计算·电子diy
慕容静漪6 小时前
如何本地安装Python Flask并结合内网穿透实现远程开发
开发语言·后端·golang
ErizJ6 小时前
Golang|锁相关
开发语言·后端·golang
软件测试曦曦6 小时前
16:00开始面试,16:08就出来了,问的问题有点变态。。。
自动化测试·软件测试·功能测试·程序人生·面试·职场和发展
GOTXX6 小时前
【Qt】Qt Creator开发基础:项目创建、界面解析与核心概念入门
开发语言·数据库·c++·qt·图形渲染·图形化界面·qt新手入门
猿小喵6 小时前
记录一次TDSQL网关夯住故障
运维·数据库·mysql