go redis 分布式锁
时间: 2023-10-11 21:05:50 浏览: 157
redis分布式锁
3星 · 编辑精心推荐
在Go语言中,可以使用Redis实现分布式锁。下面是一个简单的示例代码:
```go
import (
"fmt"
"github.com/go-redis/redis"
"time"
)
func acquireLock(client *redis.Client, lockKey string, expiration time.Duration) (bool, error) {
success, err := client.SetNX(lockKey, time.Now().UnixNano(), expiration).Result()
if err != nil {
return false, err
}
return success, nil
}
func releaseLock(client *redis.Client, lockKey string) error {
_, err := client.Del(lockKey).Result()
if err != nil {
return err
}
return nil
}
func main() {
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // 如果有密码,设置密码
DB: 0, // 选择数据库,默认为0
})
lockKey := "my-lock"
expiration := 10 * time.Second
// 尝试获取锁
success, err := acquireLock(client, lockKey, expiration)
if err != nil {
fmt.Println("Failed to acquire lock:", err)
return
}
if success {
fmt.Println("Lock acquired! Do something here.")
// 模拟执行任务
time.Sleep(5 * time.Second)
// 释放锁
err := releaseLock(client, lockKey)
if err != nil {
fmt.Println("Failed to release lock:", err)
return
}
fmt.Println("Lock released!")
} else {
fmt.Println("Failed to acquire lock")
}
}
```
上述示例中,`acquireLock` 函数用于尝试获取锁,它使用 Redis 的 `SETNX` 命令来设置一个键值对,如果该键不存在则设置成功,表示获取到锁。`releaseLock` 函数用于释放锁,它使用 Redis 的 `DEL` 命令来删除锁对应的键。
在实际使用中,多个应用程序可以使用相同的 Redis 实例,并通过调用 `acquireLock` 函数来竞争获取分布式锁。当一个应用程序成功获取到锁后,可以执行其它需要互斥执行的任务,执行完毕后再调用 `releaseLock` 函数来释放锁。
需要注意的是,分布式锁并不是绝对可靠的,如果在获取到锁和释放锁之间发生了意外情况(如应用程序崩溃),可能会导致锁无法正常释放。因此,在使用分布式锁时,需要谨慎处理异常情况,并确保在任何情况下都能够正确释放锁,以避免产生死锁的情况。
阅读全文