keylock

package
v1.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 30, 2025 License: MIT Imports: 3 Imported by: 0

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

type KeyLock

type KeyLock struct {
	// contains filtered or unexported fields
}

KeyLock KeyLock

func NewKeyLock

func NewKeyLock() *KeyLock

NewKeyLock NewKeyLock

func (*KeyLock) Clean

func (l *KeyLock) Clean()

Clean 清理空闲锁

func (*KeyLock) Lock

func (l *KeyLock) Lock(key string)

Lock 根据关键字加锁

func (*KeyLock) StartCleanLoop

func (l *KeyLock) StartCleanLoop()

StartCleanLoop 开启清理协程

func (*KeyLock) StopCleanLoop

func (l *KeyLock) StopCleanLoop()

StopCleanLoop 停止清理协程

func (*KeyLock) Unlock

func (l *KeyLock) Unlock(key string)

Unlock 根据关键字解锁

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL