An open API service indexing awesome lists of open source software.

https://github.com/troyhantech/redisson

实现 redis 分布式“互斥锁”和“读写锁”
https://github.com/troyhantech/redisson

distributed golang lock mutex rwmutex

Last synced: 4 months ago
JSON representation

实现 redis 分布式“互斥锁”和“读写锁”

Awesome Lists containing this project

README

          

# redisson

[![Go](https://github.com/troyhantech/redisson/actions/workflows/go.yml/badge.svg)](https://github.com/troyhantech/redisson/actions/workflows/go.yml)
[![Go Report Card](https://goreportcard.com/badge/github.com/troyhantech/redisson)](https://goreportcard.com/report/github.com/troyhantech/redisson)
[![License:MIT](https://img.shields.io/github/license/troyhantech/redisson)](https://github.com/troyhantech/redisson/blob/master/LICENSE)

中文 | [English](README.en.md)

基于 redis 实现:分布式“互斥锁”和“读写锁”。

目前不支持可重入锁、红锁。

## 功能

### 互斥锁

- 任一时刻,对于一把锁,只可以有一个持有者。

### 读写锁

- 读锁与读锁可以共存,写锁与读锁/写锁不可以共存。

> 无论是互斥锁还是读写锁,都只可以由加锁的协程解锁,其他协程无法解锁。
> 加锁成功以后会开启一个协程定时续锁,直到客户端解锁。

## 使用

### 获取依赖

```shell
go get github.com/troyhantech/redisson
```

### 使用互斥锁

```go
package main

import (
"context"
"log"

"github.com/troyhantech/redisson"
"github.com/go-redis/redis/v8"
)

func main() {
// 1.初始化 redis 连接
client := redis.NewClient(&redis.Options{Addr: ":6379"})

// 2.基于该连接,初始化一个 redisson
r := redisson.New(context.Background(), client)

// 3.初始化一把锁
mutex := r.NewMutex("mutexKey")

// 4.上锁
err := mutex.Lock(context.Background())
if err != nil {
log.Panic(err)
return
}
log.Println("lock successfully!")

// 5.你需要处理的任务
// ...

// 6.解锁
err = mutex.Unlock(context.Background())
if err != nil {
log.Panic(err)
return
}
log.Println("unlock successfully!")
}
```

### 使用读写锁

#### 写锁

```go
package main

import (
"context"
"log"

"github.com/troyhantech/redisson"
"github.com/go-redis/redis/v8"
)

func main() {
// 1.初始化 redis 连接
client := redis.NewClient(&redis.Options{Addr: ":6379"})

// 2.基于该连接,初始化一个 redisson
r := redisson.New(context.Background(), client)

// 3.初始化一把锁
mutex := r.NewRWMutex("rwMutexKey")

// 4.上写锁
err := mutex.Lock(context.Background())
if err != nil {
log.Panic(err)
return
}
log.Println("lock successfully!")

// 5.你需要处理的任务
// ...

// 6.解锁
err = mutex.Unlock(context.Background())
if err != nil {
log.Panic(err)
return
}
log.Println("unlock successfully!")
}
```

#### 读锁

```go
package main

import (
"context"
"log"

"github.com/troyhantech/redisson"
"github.com/go-redis/redis/v8"
)

func main() {
// 1.初始化 redis 连接
client := redis.NewClient(&redis.Options{Addr: ":6379"})

// 2.基于该连接,初始化一个 redisson
r := redisson.New(context.Background(),client)

// 3.初始化一把锁
rwMutex := r.NewRWMutex("rwMutexKey")

// 4.上读锁
err := rwMutex.RLock(context.Background())
if err != nil {
log.Panic(err)
return
}
log.Println("rLock successfully!")

// 5.你需要处理的任务
// ...

// 6.解锁
err = rwMutex.Unlock(context.Background())
if err != nil {
log.Panic(err)
return
}
log.Println("unlock successfully!")
}
```

#### 可选项

可以设置以下可选项,当不设置时,默认 `WaitTimeout = 30s`、`ExpireDuration = 10s`;

```go
options := []mutex.Option{
mutex.WithWaitTimeout(10 * time.Second), // 抢锁的最长等待时间
mutex.WithExpireDuration(20 * time.Second), // 持有锁的过期时间
}
rwMutex := r.NewRWMutex("rwMutexKey", options...) // 互斥锁同理
```

## License

本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。

## 🤝 贡献指南

我们欢迎所有形式的贡献!无论是报告 bug、提出新功能建议,还是提交代码改进。

## 🐛 问题反馈

如果你发现了 bug 或有功能建议,请在 [Issues](https://github.com/troyhantech/redisson/issues) 页面提交。

## ⭐ Star History

如果这个项目对你有帮助,请给我们一个 ⭐!

[![Star History Chart](https://api.star-history.com/svg?repos=troyhantech/redisson&type=Date)](https://star-history.com/#troyhantech/redisson&Date)

---


Made with ❤️ by the troyhantech


如果你喜欢这个项目,请考虑给一个 ⭐