不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • GO基础

  • 面向对象

  • 并发编程

  • 常用库

  • 数据库操作

    • GORM

    • sqlx

    • database-sql

    • GORMv2

    • go-redis

      • 01.go-redis包
      • 02.go-redis基本操作
      • 03.go-redis分布式锁
        • 01.redis分布式锁
          • 1.1 redis/redis_mutex.go
          • 1.2 main.go
          • 1.3 测试分布式锁
    • redigo

    • elastic

  • Beego框架

  • Beego商城

  • GIN框架

  • GIN论坛

  • 微服务

  • 设计模式

  • Go
  • 数据库操作
  • go-redis
xiaonaiqiang
2022-01-10
目录

03.go-redis分布式锁

# 01.redis分布式锁

  • https://blog.csdn.net/liyan_0816/article/details/107038116

  • 目录结构

.
├── main.go
├── redis
│   └── redis_mutex.go
1
2
3
4

# 1.1 redis/redis_mutex.go

  • 获取和是否redis锁
package redis

import (
	"context"
	"log"
	"sync"
	"time"

	"github.com/go-redis/redis/v8"
)

var Rdb *redis.Client
var Ctx = context.Background()
var mutex sync.Mutex

func NewRedis() {
	Rdb = redis.NewClient(&redis.Options{
		Addr:     "127.0.0.1:6379",
		Password: "", // no password set
		DB:       0,  // use default DB
	})
}

func Lock(key string) bool {
	mutex.Lock()
	defer mutex.Unlock()
	bool, err := Rdb.SetNX(Ctx, key, 1, 10*time.Second).Result()
	if err != nil {
		log.Println(err.Error())
	}
	return bool
}

func UnLock(key string) int64 {
	nums, err := Rdb.Del(Ctx, key).Result()
	if err != nil {
		log.Println(err.Error())
		return 0
	}
	return nums
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

# 1.2 main.go

package main

import (
	"fmt"
	"machinery-test/redis"
	"sync"
)

var wg sync.WaitGroup

// https://cloud.tencent.com/developer/article/1759185
func main() {
	redis.NewRedis()
	redis.Rdb.Set(redis.Ctx, "apple", 1000, 0)
	// 模拟有10000各用户抢购手机
	for i := 0; i < 10000; i++ {
		wg.Add(1) // 启动一个goroutine就登记+1
		go sale()
	}
	wg.Wait() // 等待所有登记的goroutine都结束
	count, _ := redis.Rdb.Get(redis.Ctx, "apple").Int()
	fmt.Println("苹果手机最终数量---> ", count)
}

func sale() {
	for {
		lock := redis.Lock("lock") // lock为锁的名字
		if lock == false {         // 获取锁失败,继续获取锁
			fmt.Println("获取锁失败")
			continue
		}
		count, _ := redis.Rdb.Get(redis.Ctx, "apple").Int() // 获取手机数量
		if count <= 0 {
			fmt.Println("手机已经售完")
		} else {
			redis.Rdb.Set(redis.Ctx, "apple", count-1, 0)
			fmt.Println("当前库存数量", count)
		}
		redis.UnLock("lock")
		defer wg.Done() // goroutine结束就登记-1
		break
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

# 1.3 测试分布式锁

go run main.go
1
  • 开启10000各携程模拟10000各用户同时抢购手机

  • 先获取redis分布式锁,如果获取到锁

    • 才能 从redis获取手机数量,并进行减一操作
    • 跳出循环,并释放锁
  • 如果获取失败锁失败,继续获取锁

  • 运行结果如下

获取锁失败
手机已经售完
获取锁失败
手机已经售完
苹果手机最终数量--->  0
1
2
3
4
5
上次更新: 2024/3/13 15:35:10
02.go-redis基本操作
01.redigo入门

← 02.go-redis基本操作 01.redigo入门→

最近更新
01
05.快递Agent智能体
06-04
02
200.AI Agent核心概念
06-04
03
105.Agent智能体梳理
06-04
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式