分布式锁主要用来干啥的?
时间: 2025-03-26 15:35:15 浏览: 33
### 分布式锁的作用
分布式锁在分布式系统中用于确保多个服务实例或进程能够安全地访问共享资源,防止并发操作导致的数据不一致或其他竞争条件问题[^1]。
通过锁定机制,可以有效地控制对特定资源的操作权限,在任何时刻只允许一个客户端执行某些关键路径上的代码片段。这有助于维护数据的一致性和完整性,特别是在高并发环境下显得尤为重要。
### 应用场景
#### 场景一:秒杀活动中的库存管理
为了保证商品数量不会超卖,在处理订单请求时需要加锁来同步不同服务器之间的库存更新动作。当有新的购买需求到来时,先尝试获取全局唯一的锁;成功之后再检查当前剩余可售量并做相应扣减;最后记得释放所持有的锁以便其他用户继续参与抢购过程[^2]。
```java
RLock rLock = redissonClient.getLock("stock_lock");
try {
if (rLock.tryLock(0, 5, TimeUnit.SECONDS)) {
// 更新数据库内对应产品的存量信息...
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
if (rLock.isLocked() && rLock.isHeldByCurrentThread()) {
rLock.unlock();
}
}
```
#### 场景二:定时任务调度防重入
对于一些周期性触发的任务来说,可能会因为网络延迟等原因造成同一份工作被多次提交给后台去执行。为了避免这种情况的发生,可以在每次启动之前加上一层保护——即只有真正拿到锁的那个节点才能正式开始干活儿;其余试图重复运行该指令的机器则会被阻塞住直到前序流程结束为止。
```python
import time
from redis import Redis
from redis.lock import Lock
client = Redis()
with Lock(client, "cron_job", timeout=60): # 设置最长等待时间为60秒
print("Executing scheduled task...")
time.sleep(30) # Simulate long-running job
print("Task completed.")
```
#### 场景三:缓存击穿防护措施
假设某个热点key突然失效了,此时大量请求几乎同时到达后端API层想要重新加载最新版本的内容到内存里保存起来供后续调用者快速读取。如果不加以限制的话很容易引起雪崩效应进而拖垮整个网站的服务能力。因此建议采用互斥锁的方式让第一个发现异常状况的人负责刷新缓存而其他人暂时排队等候直至新值准备就绪后再正常响应查询请求。
```go
func updateCache(redis *redis.Client, key string) error {
lock := redsync.New([]redsync.RedisPool{&redis.Pool{}}, nil).Mutex(key)
acquired := false
defer func() {
if acquired {
lock.Unlock()
}
}()
ok, err := lock.Lock(context.Background(), 5*time.Second)
if !ok || err != nil {
return fmt.Errorf("failed to acquire lock: %v", err)
}
acquired = true
// Perform cache refresh logic here...
return nil
}
```
阅读全文
相关推荐




















