最新用 Go + Redis 实现分布式锁,2024年最新Golang内存优化面试
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 := TryLock(rdb, "my_lock", time.Second*10); err != nil {
fmt.Println("无法获取锁:", err)
return
}
defer Unlock(rdb, "my_lock") // 确保释放锁
fmt.Println("已获取锁,执行业务逻辑")
// 在这里执行需要互斥的代码
}
// TryLock 尝试获取分布式锁
func TryLock(rdb *redis.Client, key string, timeout time.Duration) error {
// 使用 SET 命令加上 NX 参数来尝试获取锁
cmd := rdb.SetNX(ctx, key, "locked", timeout)
if err := cmd.Err(); err != nil {
return err
}
return nil
}
// Unlock 释放分布式锁
func Unlock(rdb *redis.Client, key string) {
// 删除锁
cmd := rdb.Del(ctx, key)
if err := cmd.Err(); err != nil {
fmt.Println("无法释放锁:", err)
}
}
这段代码使用Go语言和Redis的SETNX命令实现了一个非阻塞的分布式锁。它演示了如何在Go程序中使用Redis客户端库来操作Redis,并且在获取锁失败时给出清晰的错误处理。这是一个简洁而高效的分布式锁实现,并且是面试中常被考虑的优化问题。
评论已关闭