跳到主要内容

认识

2025年01月20日
柏拉文
越努力,越幸运

一、认识


分布式锁 是在分布式系统中用于同步多个进程或线程对共享资源的访问,确保同一时间只有一个进程能够修改资源,防止数据不一致或竞争条件。分布式锁的特性 的特性: 互斥性, 同一时间只能有一个客户端获取锁; 防死锁, 锁必须具备过期时间,防止锁持有者异常退出后无法释放; 高可用性, 锁服务必须在分布式环境下运行,具备容错能力; 可重入性(可选):同一个客户端可以多次获取同一把锁,而不会导致死锁。

使用分布式锁的最佳实践: 设置合适的超时时间, 确保锁不会永久持有,避免死锁; 使用唯一标识, 确保释放锁时匹配正确的持有者; 使用 Lua 脚本进行释放, 原子操作,确保数据一致性; 尽量减少锁持有时间, 提高系统吞吐量; 监控锁的使用情况, 避免异常导致业务影响;

分布式锁 通常在以下场景中应用:

  1. 订单并发场景, 防止超卖: 比如电商秒杀抢购, 促销活动库存控制。在电商系统中,用户可能会同时下单,导致库存被超卖,造成数据不一致。在扣减库存时使用 Redis 分布式锁,确保同一时间只有一个请求能够扣减库存。

  2. 任务调度:防止重复执行: 在分布式环境下,可能会有多个实例同时执行同一任务,导致重复执行。使用分布式锁确保任务在同一时间只能执行一次。

  3. 防止重复请求:用户并发操作: 用户在前端多次点击提交按钮,可能会导致重复请求,产生重复数据。在提交时使用 Redis 锁来防止重复提交。

  4. 分布式事务:保证一致性: 在分布式环境下,多个服务可能需要同时修改同一资源,如扣减余额并更新订单。使用 Redis 锁来确保多个服务间的操作一致性。

  5. 缓存一致性:防止并发更新: 多个服务器同时更新缓存,可能会导致数据不一致。使用分布式锁确保数据更新的原子性。

  6. 分布式爬虫:防止重复抓取: 在分布式爬虫环境中,多个爬虫可能会重复抓取同一页面,造成资源浪费。使用分布式锁确保每个 URL 仅被抓取一次。