【鹅厂一面真题】数据库乐观锁和悲观锁以及redis分布式锁的区别和使用场景?

1.40.1 面试考察重点

1. 面试官的考察目标

  • 锁机制理解:对各类锁实现原理的掌握程度
  • 场景适配:不同业务场景下的技术选型能力
  • 问题诊断:锁冲突问题的解决思路
  • 实战经验:实际应用中的权衡经验

2. 关键关注点

  • 实现原理:各类锁的底层工作机制
  • 性能影响:对系统吞吐量的影响
  • 数据一致:保证数据正确性的方式
  • 适用边界:各类锁的优缺点对比

由于篇幅限制,只能给大家展示小部分内容,

全套面试笔记及答案【点击此处】即可免费获取

1.40.2 面试核心知识点详解

在并发编程和分布式系统中,乐观锁、悲观锁、Redis 分布式锁 是常见的并发控制机制,它们的核心目标是 保证数据一致性 ,但实现方式、适用场景和优缺点差异显著。以下是详细对比和使用场景分析:

1.40.2.1 数据库乐观锁(Optimistic Lock)
  • 核心思想 :假设冲突很少发生(“乐观”),在提交更新时检查版本号或时间戳。
  • 实现方式
    • 使用版本号(version)字段或时间戳(timestamp)字段。
    • 更新时通过 WHERE 条件判断版本是否被修改。
  • 示例
UPDATE inventory SET stock = stock - 1, version = version + 1
WHERE product_id = 1001AND version = 1;

优点

  • 性能高 :避免长时间加锁,减少锁竞争。
  • 并发性强 :适合读多写少的场景。
  • 开销小 :仅在提交时进行版本校验。

缺点

  • 冲突处理复杂 :若冲突频繁,需重试或报错。
  • 无法保证绝对一致性 :依赖业务逻辑处理冲突。

📌 使用场景

  • 高并发、低冲突 :如电商秒杀、库存扣减。
  • 弱一致性要求 :如缓存更新、非关键数据修改。
  • 幂等性操作 :如订单状态变更(允许多次尝试)。
1.40.2.2 数据库悲观锁(Pessimistic Lock)

原理

  • 核心思想 :假设冲突频繁发生(“悲观”),在事务开始时即加锁,防止其他事务修改。
  • 实现方式
    • SELECT ... FOR UPDATE(行级锁)。
    • SELECT ... LOCK IN SHARE MODE(共享锁)。
  • 示例
START TRANSACTION;
SELECT * FROM inventory WHERE product_id = 1001FORUPDATE;
UPDATE inventory SET stock = stock - 1WHERE product_id = 1001;
COMMIT;

优点

  • 强一致性 :确保事务期间数据不被修改。
  • 简单直接 :无需版本号或重试逻辑。

缺点

  • 性能低 :锁竞争可能导致阻塞,影响吞吐量。
  • 死锁风险 :多个事务交叉加锁可能引发死锁。
  • 资源占用高 :长时间持有锁会消耗数据库连接池资源。

📌 使用场景

  • 严格一致性要求 :如银行转账、财务流水。
  • 写操作频繁 :如订单创建、库存锁定。
  • 短事务场景 :避免长时间持有锁。
1.40.2.3 Redis 分布式锁(Distributed Lock)

原理

  • 核心思想 :通过 Redis 的原子操作(如 SETNXRedlock 算法)实现跨服务节点的资源互斥访问。
  • 实现方式
    • SETNX SET key value NX PX timeout(原子性设置锁)。
    • Redlock :在多个 Redis 节点上加锁,确保高可用。
  • 示例(Lua 脚本实现原子性)
-- 加锁
if redis.call("set", KEYS[1], ARGV[1], "NX", "PX", ARGV[2]) then
returntrue
else
returnfalse
end

-- 释放锁
if redis.call("get", KEYS[1]) == ARGV[1] then
return redis.call("del", KEYS[1])
else
returnfalse
end

优点

  • 跨服务协调 :适用于分布式系统(如微服务、多节点集群)。
  • 高性能 :Redis 基于内存,响应速度快。
  • 可扩展性强 :支持集群部署(如 Redis Sentinel、Redis Cluster)。

缺点

  • 网络依赖 :Redis 故障可能导致锁失效。
  • 死锁风险 :未设置超时或未正确释放锁。
  • 复杂性高 :需处理锁续期(Lease)、锁竞争、脑裂等问题。

📌 使用场景

  • 分布式任务调度 :如定时任务去重、全局计数器。
  • 共享资源访问 :如分布式限流、缓存预热。
  • 跨服务协调 :如订单状态同步、分布式事务协调。

 

1.40.2.4 三者对比表

特性

乐观锁

悲观锁

Redis 分布式锁

适用场景

读多写少、低冲突

写多读少、高一致性要求

分布式系统、跨服务协调

一致性保障

最终一致性(需重试)

强一致性

弱一致性(需超时机制)

性能

高(无锁竞争)

低(锁竞争)

高(基于内存)

复杂度

低(需版本号)

中(需事务管理)

高(需 Lua 脚本、超时)

死锁风险

有(未设置超时)

资源占用

高(连接池占用)

中(Redis 内存占用)

分布式支持

1.40.2.5 典型使用场景对比

场景

推荐锁类型

原因

电商秒杀库存扣减

乐观锁

高并发、低冲突,允许部分失败重试

银行转账

悲观锁

强一致性要求,需防止并发修改

分布式限流

Redis 分布式锁

多节点共享限流状态,需跨服务协调

订单状态变更

乐观锁

幂等性操作,允许冲突后重试

缓存预热

Redis 分布式锁

防止多个节点重复加载数据

全局唯一 ID 生成

Redis 分布式锁

需确保多个服务实例生成唯一 ID

库存锁定(下单阶段)

悲观锁

短事务内锁定库存,防止超卖

分布式任务调度

Redis 分布式锁

防止多个节点重复执行任务

……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值