Go语言实现Redis分布式锁
package main
import (
"context"
"fmt"
"github.com/go-redis/redis/v8"
"time"
)
var ctx = context.Background()
func main() {
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // 默认没有密码,如果有则填写
DB: 0, // 默认数据库为0,可以不写
})
// 尝试获取分布式锁
if err := Lock(rdb, "my_lock", time.Second*10); err != nil {
fmt.Println("无法获取锁:", err)
return
}
// 执行业务逻辑
fmt.Println("已获取锁,执行业务逻辑")
// 模拟业务处理时间
time.Sleep(time.Second * 5)
// 释放分布式锁
if err := Unlock(rdb, "my_lock"); err != nil {
fmt.Println("无法释放锁:", err)
return
}
fmt.Println("已释放锁")
}
// 尝试获取分布式锁
func Lock(rdb *redis.Client, key string, expiration time.Duration) error {
isLocked, err := rdb.SetNX(ctx, key, "locked", expiration).Result()
if err != nil {
return err
}
if !isLocked {
return fmt.Errorf("无法获取锁: %s", key)
}
return nil
}
// 释放分布式锁
func Unlock(rdb *redis.Client, key string) error {
_, err := rdb.Del(ctx, key).Result()
return err
}
这段代码使用了Go语言中的go-redis/redis
库来实现Redis分布式锁。首先,它创建了一个Redis客户端连接到本地的Redis服务器。然后,它定义了Lock
和Unlock
函数来尝试获取和释放锁。在main
函数中,它演示了如何使用这些函数来同步访问共享资源。
评论已关闭