当前位置:网站首页>Go implements distributed locks
Go implements distributed locks
2022-08-02 07:48:00 【rainy day on the sun】
点击链接查看我的个人博客,文章更全更详细
1. 基于redis 的 setnx
package main
import (
"fmt"
"sync"
"time"
"github.com/go-redis/redis"
)
func incr() {
client := redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379",
Password: "root",
DB: 0,
})
var lockKey = "counter_lock"
var counterKey = "counter"
resp := client.SetNX(lockKey, 1, time.Second*5)
ok, err := resp.Result()
if err != nil || !ok {
fmt.Println(err, "lock result: ", ok)
return
}
getResp := client.Get(counterKey)
cntValue, err := getResp.Int64()
if err == nil || err == redis.Nil {
cntValue++
resp := client.Set(counterKey, cntValue, 0)
_, err := resp.Result()
if err != nil {
println("set value error!")
}
}
println("current counter is ", cntValue)
delResp := client.Del(lockKey)
unlockSuccess, err := delResp.Result()
if err == nil && unlockSuccess > 0 {
println("unlock success!")
} else {
println("unlock failed", err)
}
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
incr()
}()
}
wg.Wait()
}
2. 基于ZooKeeper
package main
import (
"time"
"github.com/samuel/go-zookeeper/zk"
)
func main() {
c, _, err := zk.Connect([]string{
"127.0.0.1"}, time.Second)
if err != nil {
panic(err)
}
l := zk.NewLock(c, "/lock", zk.WorldACL(zk.PermAll))
err = l.Lock()
if err != nil {
panic(err)
}
println("lock succ, do your business login")
time.Sleep(time.Second * 5)
l.Unlock()
println("unlock succ, finish business logic")
}
3. 基于etcd
package main
import (
"log"
"github.com/zieckey/etcdsync"
)
func main() {
m, err := etcdsync.New("/mylock", 10, []string{
"http://127.0.0.1:2379"})
if m == nil || err != nil {
panic(err)
}
err = m.Lock()
if err != nil {
log.Printf("etcdsync.lock failed")
} else {
log.Printf("etcd sync.lock succ")
}
log.Printf("get the lock, do something here.")
err = m.Unlock()
if err != nil {
log.Printf("etcdsync.unlock failed")
} else {
log.Printf("etcdsync unlock succ")
}
log.Printf("unlock the lock, do something here.")
}
边栏推荐
猜你喜欢
![WebGPU 导入[2] - 核心概念与重要机制解读](/img/8f/195a3b04912d8872d025df58ab5960.png)
WebGPU 导入[2] - 核心概念与重要机制解读

MQ带来的一些问题、及解决方案

Facebook社媒营销的5大技巧,迅速提高独立站转化率!

59:第五章:开发admin管理服务:12:MongoDB的使用场景;(非核心数据,数据量比较大的非核心数据,人脸照片等隐私的小文件;)

自然语言处理 文本预处理(上)(分词、词性标注、命名实体识别等)

电商库存系统的防超卖和高并发扣减方案

Vscode connect to remote server "Acquiring the lock on the/home / ~ 'problem

FaceBook社媒营销高效转化技巧分享

“蔚来杯“2022牛客暑期多校训练营5,签到题KBGHFCD

optional
随机推荐
倍福使用AdsRemote组件实现和C#的ADS通讯
See the picture to understand | How to choose sales indicators to measure the health of business growth
Splunk Filed extraction 字段截取
自然语言处理 文本预处理(下)(张量表示、文本数据分析、文本特征处理等)
【故障诊断分析】基于matlab FFT轴承故障诊断【含Matlab源码 2001期】
【CV】OpenVINO安装教程
在VMware上安装Metasploitable2
结构体大小计算--结构体内存对齐
LeetCode Algorithm 1374. 生成每种字符都是奇数个的字符串
SimpleChannelInboundHandler使用总结
请教一下,Flink SQL ,JDBC sink 入 mysql 库,想要搞一个自增主键,要怎么写
MySQL-FlinkCDC-Hudi实时入湖
【暑期每日一题】洛谷 P1255 数楼梯
责任链模式(Chain Of Responsibility)
数据库概论-MySQL的数据表的基本操作
【杂】pip换国内源教程及国内源地址
技术管理三级跳
docker 安装mysql
埋点开发流程
【ROS基础】rosbag 的使用方法