Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >golang实现Redis分布式锁

golang实现Redis分布式锁

作者头像
地球流浪猫
发布于 2023-10-14 11:20:51
发布于 2023-10-14 11:20:51
44800
代码可运行
举报
文章被收录于专栏:流浪猫的golang流浪猫的golang
运行总次数:0
代码可运行

Redis的分布式锁是通过利用Redis的单线程特性以及原子操作来实现的 Redis的SET命令具有原子性,这意味着只有一个客户端能够成功地设置该键,其他客户端将无法获得锁。如果SET命令成功,表示该客户端成功获得了锁。 Redis锁示例代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package redis

import (
	"fmt"
	"github.com/go-redis/redis"
	"log"
	"strconv"
	"sync"
	"testing"
	"time"
)

var client *redis.Client
var mutex sync.Mutex

// 初始化连接
func initClient() (err error) {
	client = redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "", // 没有密码,默认值
		DB:       2,  // 默认DB 0
	})
	_, err = client.Ping().Result()
	return err
}

// 加锁
func Lock(key string) (bool, error) {
	// 10秒之后,自动解锁,防止死锁
	delayUnLockTime := 10 * time.Second
	mutex.Lock()
	defer mutex.Unlock()
	bool, err := client.SetNX(key, `{"lock":1}`, delayUnLockTime).Result()
	if err != nil {
		return bool, err
	}
	return bool, err
}

// 解锁
func UnLock(key string, i int) (int64, error) {
	nums, err := client.Del(key).Result()
	if err != nil {
		log.Println(err.Error())
		return 0, err
	}
	fmt.Println(strconv.Itoa(i) + key + "解锁成功,删除key的成功:" + strconv.Itoa(int(nums)))
	return nums, nil
}
func LockTest(key string, i int) {
	result, err := Lock(key)
	if err != nil {
		fmt.Println(err)
		return
	}
	if result {
		fmt.Println(strconv.Itoa(i) + key + "锁定成功")
		return
	}
	fmt.Println(strconv.Itoa(i) + key + "锁定失败")
}

func TestRedis(t *testing.T) {
	err := initClient()
	if err != nil {
		fmt.Println(err)
		return
	}
	LockTest("lock_key", 1)
	go LockTest("lock_key", 2)
	go LockTest("lock_key", 3)
	time.Sleep(1 * time.Second)
	go UnLock("lock_key", 1)
	go UnLock("lock_key", 2)
	go UnLock("lock_key", 3)
	time.Sleep(10 * time.Second)
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis分布式锁
在单机系统中,我们可以运用普通的锁/信号量机制来实现对公共资源的有序访问;但在分布式系统中显然就不行了
Kevinello
2022/08/19
3570
[Go] redis分布式锁的go-redis实现
在分布式的业务中 , 如果有的共享资源需要安全的被访问和处理 , 那就需要分布式锁
唯一Chat
2020/12/11
7.5K0
Golang+Redis分布式互斥锁
假设我们的某个业务会涉及数据更新,同时在实际场景中有较大并发量。流程:读取->修改->保存,在不考虑基于DB层的并发处理情况下,这种场景可能对部分数据造成不可预期的执行结果,此时可以考虑使用分布式锁来解决该问题
lestat
2021/05/04
3.2K0
「Go工具箱」redis官网推荐的go版本的分布式锁:redsync
大家好,我是渔夫子。本号新推出「Go工具箱」系列,意在给大家分享使用go语言编写的、实用的、好玩的工具。
Go学堂
2023/01/31
8.1K0
2023-06-19:讲一讲Redis分布式锁的实现?
要实现分布式锁,确实需要使用具备互斥性的Redis操作。其中一种常用的方式是使用SETNX命令,该命令表示"SET if Not Exists",即只有在key不存在时才设置其值,否则不进行任何操作。通过这种方式,两个客户端进程可以执行SETNX命令来实现互斥,从而达到分布式锁的目的。
福大大架构师每日一题
2023/08/29
3080
2023-06-19:讲一讲Redis分布式锁的实现?
分布式锁实现原理与最佳实践
很多应用场景是需要系统保证幂等性的(如api服务或消息消费者),并发情况下或消息重复很容易造成系统重入,那么分布式锁是保障幂等的一个重要手段。
KevinYan
2021/07/15
5160
分布式锁实现原理与最佳实践
redis分布式锁原理面试(数据库索引用的什么数据结构)
业务背景: 后台定时任务刷新Redis的数据到数据库中,有多台机器开启了此定时同步的任务,但是需要其中一台工作,其他的作为备用,提高可用性。使用Redis分布式锁进行限制,拿到锁的机器去执行具体业务,拿不到锁的继续轮询。
全栈程序员站长
2022/07/30
3290
redis分布式锁原理面试(数据库索引用的什么数据结构)
Redis分布式锁
上一章节我提到了基于zk分布式锁的实现,这章节就来说一下基于Redis的分布式锁实现吧。
Vincent-yuan
2021/09/26
7620
Redis分布式锁
Golang语言情怀-第36期 Go 语言设计模式 条件变量
或 c := sync.NewCond(&sync.RWMutex{}) 之类. 它有三个函数: wait/signal/broadcast 望文知义,和Windows下的InitializeConditionVariable与WaitForSingleObject()之类, 及Linux下的pthread_cond_t等作用差不多.
李海彬
2021/03/09
3960
使用Go语言实现Redis分布式锁(附有看门狗自动续期机制)
过完年后,更新博客的热情逐渐被备战暑期实习的焦虑感没过了,今天写项目时上网搜集资料实现了一版自动续期机制的Redis分布式锁,在这里记录巩固一下
潋湄
2025/02/07
3552
使用Go语言实现Redis分布式锁(附有看门狗自动续期机制)
redis分布式锁-被其他人解锁
实现了一个基于 Redis 的分布式锁,包括加锁和解锁功能。加锁时生成一个随机的 requestId 作为锁的标识,并设置过期时间以防止死锁。解锁时通过事务确保只有加锁的客户端才能释放锁,保证了锁的安全性。
王宝
2024/11/28
940
如何使用 Redis 实现分布式锁
锁是我们在设计和实现大多数系统时绕不过的话题。一旦有竞争条件出现,在没有保护的操作的前提下,可能会出现不可预知的问题。
haifeiWu
2020/02/10
1.6K0
Go 并发实战 -- sync Cond
go中的sync.Cond也就是condition,是一个条件同步变量,与Java中Object的wait、notify、notifyAll方法或者Condition类的作用比较类似,如果有这方面的基础学习起来会非常简单。其实Java中的JUC包实现的可以是最丰富和易用的了,熟知JUC的话,学习其他语言的并发特性及工具的话会非常简单。
邹志全
2019/07/31
9410
Golang+Redis可重入锁
在Go中应该很少会有这样的场景,互斥锁从字面上理解,应该不能接收重入,需要重入的场景也不应该考虑互斥锁。个人认为更好的解决方法是从设计的层面避免这种场景的出现。因此,与基于redis的互斥锁不同,这篇文章仅仅是尝试在技术上的实现,在实际应用中应尽可能避免这样的场景出现
lestat
2021/05/04
2.1K0
分布式锁的各种实现,看完这篇你就懂了!
📚 全文字数 : 1W+ ⏳ 阅读时长 : 15min 📢 关键词 : 分布式锁、Redis、Etcd、ZooKeeper
三友的java日记
2023/12/13
2.7K0
分布式锁的各种实现,看完这篇你就懂了!
Golang同步:锁的使用案例详解
互斥锁 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段。它由标准库代码包sync中的Mutex结构体类型代表。只有两个公开方法 Lock Unlock 类型sync.Mutex的零值表示了未被锁定的互斥量。 <code class="language-golang" hljs="">var mutex sync.Mutex mutex.Lock()</code> 复制代码 示例 <code class="language-golang" hljs="">// test for Go // //
李海彬
2018/03/23
6890
golang一些常用库(2)
sync 包提供了一些基本的同步原语,如互斥锁(Mutex)和条件变量(Cond),用于处理并发编程。
dbdocker
2024/02/04
1800
Golang并发编程控制
重学编程之Golang的plan中的上一篇文章我向大家介绍了,并发编程基础,goroutine的创建,channel,正由于go语言的简洁性,我们可以简易快速的创建任意个协程。同时也留下了许多隐患,如果没有更加深入的学习,其实很难直接将其运用到实际项目中,实际生活中。为什么呢?并发的场景许许多多,但一味的只知道其创建,是很难有效的解决问题。例如以下场景-资源竞争
PayneWu
2020/12/18
5980
Golang并发编程控制
【共识算法】-“PBFT的实现”
插:若出现以下问题:go: go.mod file not found in current directory or any parent directory; see 'go help modules'
帆说区块链
2022/04/26
6260
【共识算法】-“PBFT的实现”
分布式锁:不同实现方式实践测评
Hello读者朋友们,今天分享一篇实践测评类的文章,用充分的代码与真实的数据来讲述在分布式场景下,不同方式实现的分布式锁,分别探究每一种方式的性能与最终的优劣分析。
闫同学
2023/01/08
3692
分布式锁:不同实现方式实践测评
相关推荐
Redis分布式锁
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验