package main import ( "fmt" "github.com/go-redis/redis" "time" ) // 定义redis链接池 var RedisTest *redis.Client // 初始化redis链接池 func init() { RedisTest = redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", // Redis地址 Password: "", // Redis账号 DB: 1, // Redis库 PoolSize: 10, // Redis连接池大小 MaxRetries: 3, // 最大重试次数 IdleTimeout: 5 * time.Second, // 空闲链接超时时间 MinIdleConns: 5, // 空闲连接数量 }) pong, err := RedisTest.Ping().Result() if err == redis.Nil { fmt.Println("Redis异常") } else if err != nil { fmt.Println("失败:", err) } else { fmt.Println(pong) } } func main() { do(true) fmt.Println("操作完成") } // 传参标记是否必须获取到锁 func do(must bool) { res := getLock() if res == true { // 获取锁成功,需要在业务处理完成后及时删除锁 defer RedisTest.Del("key") // TODO 此处书写业务逻辑 } else { fmt.Println("获取锁失败") if must { // 如果必须要获取到锁才能往下进行,需要自我休眠 time.Sleep(100 * time.Millisecond) // 休眠100 毫秒再去执行 do(true) } } } // 获取锁 func getLock() bool { // 这里一定要添加失效时间,以防删除锁失败 res, err := RedisTest.SetNX("key", true, 500*time.Millisecond).Result() if err != nil { fmt.Println(err) return false } return res }
4 条评论
wmy_one@163.com 需要一份go视频,多谢https://static.studygolang.com/200318/15329ae48da644babb13e7b99a531fd5.jpg
你好,邮件已发。
可以发一份给我吗zz_lkw@163.com
你好,已发,请查收