Documentation
¶
Overview ¶
Package keylock 提供基于字符串键的细粒度锁工具
KeyLock 允许根据字符串键进行加锁和解锁,不同的键可以并发执行, 相同的键会串行执行。这对于需要对特定资源进行并发控制的场景非常有用。
主要特性:
- 基于字符串键的锁定机制
- 不同键之间互不影响,可以并发执行
- 相同键会串行执行,保证线程安全
- 自动清理空闲的锁,避免内存泄漏
- 支持定时清理协程
使用场景:
- 用户级别的并发控制(如:user:123)
- 订单级别的并发控制(如:order:456)
- 资源级别的并发控制(如:channel:789)
- 避免全局锁,提高并发性能
基本用法:
package main
import (
"fmt" "github.com/L8CHAT/l8chat-util/keylock"
)
func main() {
// 创建 KeyLock 实例
kl := keylock.NewKeyLock()
// 启动清理协程(可选)
kl.StartCleanLoop()
defer kl.StopCleanLoop()
// 锁定特定的键
kl.Lock("user:123")
defer kl.Unlock("user:123")
// 执行需要保护的业务逻辑
fmt.Println("处理用户 123 的数据...")
}
并发示例:
func processUser(kl *keylock.KeyLock, userID string) {
// 锁定特定用户
kl.Lock(userID)
defer kl.Unlock(userID)
// 处理用户数据
// 不同用户可以并发处理
// 相同用户会串行处理
}
func main() {
kl := keylock.NewKeyLock()
kl.StartCleanLoop()
defer kl.StopCleanLoop()
// 并发处理多个用户
go processUser(kl, "user:123")
go processUser(kl, "user:456")
go processUser(kl, "user:123") // 会等待第一个 user:123 完成
}
注意事项:
- 必须成对调用 Lock 和 Unlock
- 建议使用 defer 确保解锁
- StartCleanLoop 是可选的,用于定期清理空闲锁
- 默认清理间隔为 24 小时
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
Click to show internal directories.
Click to hide internal directories.