美文网首页
go-redsync加锁方法区别

go-redsync加锁方法区别

作者: 晚歌歌 | 来源:发表于2024-09-18 14:37 被阅读0次

在 github.com/go-redsync/redsync/v4 库中,Lock 和 TryLock 方法都用于获取分布式锁,但它们的行为有所不同。理解这些区别对于正确使用库和实现你的应用逻辑非常重要。

Lock 方法

Lock 方法会尝试获取一个锁,并且如果锁已经被其他客户端持有,它会根据配置的重试策略不断尝试获取锁,直到成功或达到最大重试次数。

特点

• 阻塞:如果锁当前被其他客户端持有,Lock 方法会阻塞,直到成功获取锁或达到最大重试次数。
• 重试:可以配置重试策略,包括重试次数、重试间隔等。
• 确保获取锁:只要没有达到最大重试次数,Lock 方法最终会获取到锁。

用法示例

mutex := rs.NewMutex("my-resource", redsync.WithExpiry(10*time.Second), redsync.WithTries(3))

// 尝试获取锁,如果失败会重试
if err := mutex.Lock(); err != nil {
log.Fatalf("Failed to acquire lock: %v", err)
}
defer mutex.Unlock()

// 在此执行受保护的操作
log.Println("Locked and doing something...")

TryLock 方法

TryLock 方法会尝试一次获取锁,如果锁已经被其他客户端持有,则立即返回错误,不会进行重试。

特点

• 非阻塞:如果锁当前被其他客户端持有,TryLock 方法会立即返回错误。
• 不重试:只尝试一次获取锁,失败后不会重试。
• 快速响应:适用于需要快速响应的应用场景,如果获取不到锁则立即返回。

用法示例

mutex := rs.NewMutex("my-resource", redsync.WithExpiry(10*time.Second))

// 尝试获取锁,如果失败会立即返回错误
if err := mutex.TryLock(); err != nil {
log.Printf("Failed to acquire lock: %v", err)
} else {
defer mutex.Unlock()

// 在此执行受保护的操作
log.Println("Locked and doing something...")

}

总结

• Lock 方法:适合需要确保获取锁的情况,可以通过配置重试策略来处理竞争条件。如果锁当前被其他客户端持有,Lock 方法会阻塞并不断重试,直到成功获取锁或达到最大重试次数。
• TryLock 方法:适合需要快速响应的情况,如果锁当前被其他客户端持有,TryLock 方法会立即返回错误,不会进行重试。适用于那些不需要等待锁释放,而是可以选择放弃操作的场景。
选择使用哪种方法取决于你的具体需求:
• 如果你需要确保某个操作在分布式环境中只能由一个实例执行,并且可以容忍一定的延迟,那么使用 Lock 方法。
• 如果你希望在无法立即获取锁时快速响应,并且可以选择放弃操作,那么使用 TryLock 方法。
通过合理选择和配置这些方法,你可以更好地控制分布式环境中的资源访问。

相关文章

  • 静态方法加锁,和非静态方法加锁区别

    面试的时候说道了单例,又扯到了加锁等。后来面试官问了问静态方法加锁和非静态方法加锁的区别。结果尴尬了,还是自己没有...

  • 给静态方法加锁锁的是类

    给静态方法加锁 效果: 给普通方法加锁 效果:

  • golang 高并发数据库库存同步处理

    方法一(对数据库的读写操作加锁) 一(DAO层加行锁:读写锁) 一(对象加锁) 将读写的方法封装,并且添加锁 方法...

  • Pthread 两种加锁方法区别

    pthread_muext_trylock(&t)让你在没有获得锁的时候,还有机会退出,而pthread_mute...

  • Redissons实现分布式锁

    1.添加pom和配置文件 2.使用方法 lock和tryLock的区别:lock:加锁,会阻塞线程tryLock:...

  • synchronized和Lock的区别

    可重入锁:1. 加锁方法调用另外一个加锁方法; 2. 递归调用加锁方法;独享锁:该锁每一次只能被一个线程所持有,其...

  • 脏读问题

    对业务写方法加锁,对业务读方法不加锁会出现脏读的情况 运行结果如下:

  • iOS多线程之NSThread详解

    NSThread简介 一、属性 二、实例方法 三、类方法 四、卖火车票&线程加锁 然后:将售票的方法加锁 END.

  • 线程安全的单例模式

    懒汉式 加方法锁 直接在 getInstance() 方法加锁,但是加锁的范围太大,性能低下 双重检查锁定 对象需...

  • 多线程锁

    多线程锁有三种方式 synchronized 方法 synchronized 代码块 使用 Lock加锁,加锁后需...

网友评论

      本文标题:go-redsync加锁方法区别

      本文链接:https://www.haomeiwen.com/subject/lemnljtx.html