golang,go,博客,开源,编程

golang每日一库之jefferyjob/go-redislock

Updated on with 0 views and 0 comments

go-redislock 是一个由 jefferyjob 开发的 Go 语言库,用于在分布式环境中实现基于 Redis 的高性能分布式锁。它提供了可靠的并发控制机制,确保多个节点在访问共享资源时的数据一致性和资源互斥。


核心特性

  • 高性能:利用 Redis 的内存存储特性,实现快速的锁获取与释放。
  • 超时机制:支持设置锁的过期时间,防止死锁。
  • 可重入性:允许同一线程多次获取同一把锁。
  • 自动续期:在长时间任务执行期间,自动延长锁的有效期。
  • 手动续期:提供手动延长锁有效期的方法,满足特定需求。
  • 灵活的锁释放方式:支持手动释放锁,确保资源的及时释放。

安装

使用以下命令安装 go-redislock

go get -u github.com/jefferyjob/go-redislock

示例

package main

import (
	"context"
	"fmt"
	redislock "github.com/jefferyjob/go-redislock"
	"github.com/redis/go-redis/v9"
)

func main() {
    // 创建 Redis 客户端
    redisClient := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "",
        DB:       0,
    })

    // 创建一个上下文,用于取消锁操作
    ctx := context.Background()

    // 创建 RedisLock 对象
    lock := redislock.New(ctx, redisClient, "test_key")

    // 获取锁
    err := lock.Lock()
    if err != nil {
        fmt.Println("锁获取失败:", err)
        return
    }
    defer lock.UnLock() // 解锁

    // 在锁定期间执行任务
    // ...

    fmt.Println("任务执行完成")
}

高级用法

自定义Token

您可以通过使用 WithToken 选项在自定义锁的token功能:

lock := redislock.New(ctx, redisClient, redislock.WithToken("your token") )

自定义锁超时时间

您可以通过使用 WithTimeout 选项在自定义锁的超时时间功能:

lock := redislock.New(ctx, redisClient, redislock.WithTimeout(time.Duration(10) * time.Second) )

自动续期

您可以通过使用 WithAutoRenew 选项在获取锁时启用自动续约功能:

lock := redislock.New(ctx, redisClient, redislock.WithAutoRenew() )

当使用自动续约时,锁会在获取后自动定期续约,以防止锁过期。要手动续约锁,可以调用 Renew 方法。

自旋锁

自旋锁是一种尝试在锁可用之前反复获取锁的方式,可以使用 SpinLock 方法来实现自旋锁:

err := lock.SpinLock(time.Duration(5) * time.Second) // 尝试获取锁,最多等待5秒 if err != nil { fmt.Println("自旋锁超时:", err) return } defer lock.UnLock() // 解锁 // 在锁定期间执行任务 // ...

锁释放

如果您希望手动释放锁而不等待锁超时,您可以使用 UnLock 方法:

err := lock.Lock() if err != nil { fmt.Println("锁获取失败:", err) return } // 执行任务 err = lock.UnLock() // 手动释放锁 if err != nil { fmt.Println("锁释放失败:", err) return }

使用建议

  • 确保 Redis 服务可用:在使用前,确保 Redis 服务器正常运行并可连接。
  • 合理设置锁的过期时间:根据任务的预期执行时间,设置合适的锁超时时间,避免任务未完成锁已过期。
  • 避免长时间阻塞:在使用自动续期功能时,确保任务执行过程中不会长时间阻塞,以防续期失败。
  • 统一的锁键管理:使用一致的键名获取和释放锁,避免因键名不一致导致的锁释放失败。
  • 错误处理:在获取和释放锁时,添加错误处理逻辑,确保系统的健壮性。

标题:golang每日一库之jefferyjob/go-redislock
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/05/23/1747979284959.html
联系:scotttu@163.com