基于Go语言实现的高性能Redis分布式锁服务。

项目地址

github.com/jefferyjob/...

go-redislock

介绍

go-redislock 是一个用于 Go 的库,用于使用 Redis 作为后端存储提供分布式锁功能。确保在分布式环境中的并发访问下实现数据共享和资源互斥。我们的分布式锁具备可靠性、高性能、超时机制、可重入性和灵活的锁释放方式等特性,简化了分布式锁的使用,让您专注于业务逻辑的实现。

快速开始

安装

bash 复制代码
go get -u github.com/jefferyjob/go-redislock

使用Demo

go 复制代码
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功能:

go 复制代码
lock := redislock.New(ctx, redisClient, 
	redislock.WithToken("your token")
)

自定义锁超时时间

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

go 复制代码
lock := redislock.New(ctx, redisClient, 
	redislock.WithTimeout(time.Duration(10) * time.Second)
)

自动续期

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

go 复制代码
lock := redislock.New(ctx, redisClient,
	redislock.WithAutoRenew()
)

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

自旋锁

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

go 复制代码
err := lock.SpinLock(time.Duration(5) * time.Second) // 尝试获取锁,最多等待5秒
if err != nil {
    fmt.Println("自旋锁超时:", err)
    return
}
defer lock.UnLock() // 解锁

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

锁释放

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

go 复制代码
err := lock.Lock()
if err != nil {
    fmt.Println("锁获取失败:", err)
    return
}

// 执行任务

err = lock.UnLock() // 手动释放锁
if err != nil {
    fmt.Println("锁释放失败:", err)
    return
}

注意事项

  • 请确保您的 Redis 服务器设置正确,并且能够正常连接和运行。
  • 在使用自动续约功能时,确保在任务执行期间没有出现长时间的阻塞,以免导致续约失败。
  • 考虑使用适当的超时设置,以避免由于网络问题等原因导致死锁。
  • 尽量保证使用相同的 key 来获取和释放锁,以确保正确性。
  • 在使用锁的过程中,建议对关键代码块进行精心设计和测试,以避免出现竞态条件和死锁问题。
相关推荐
不爱说话郭德纲15 小时前
聚焦 Go 语言框架,探索创新实践过程
go·编程语言
0x派大星2 天前
【Golang】——Gin 框架中的 API 请求处理与 JSON 数据绑定
开发语言·后端·golang·go·json·gin
IT书架2 天前
golang高频面试真题
面试·go
郝同学的测开笔记2 天前
云原生探索系列(十四):Go 语言panic、defer以及recover函数
后端·云原生·go
秋落风声3 天前
【滑动窗口入门篇】
java·算法·leetcode·go·哈希表
0x派大星4 天前
【Golang】——Gin 框架中的模板渲染详解
开发语言·后端·golang·go·gin
0x派大星5 天前
【Golang】——Gin 框架中的表单处理与数据绑定
开发语言·后端·golang·go·gin
三里清风_6 天前
如何使用Casbin设计后台权限管理系统
golang·go·casbin
0x派大星6 天前
【Goland】——Gin 框架中间件详解:从基础到实战
开发语言·后端·中间件·golang·go·gin
0x派大星6 天前
【Goland】——Gin 框架简介与安装
后端·golang·go·gin