前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang实现Redis分布式锁

golang实现Redis分布式锁

作者头像
地球流浪猫
发布2023-10-14 19:20:51
2720
发布2023-10-14 19:20:51
举报
文章被收录于专栏:流浪猫的golang流浪猫的golang

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

代码语言:javascript
复制
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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档