Golang基于redis实现的分布式信号量(semaphore)

前言

Semaphore是信号量,作用? 我想大家都知道。semaphore跟mutex的区别我想大家也知道了,我这里就不老生常谈,重复讲解了,有兴趣的朋友可以自行google相关的同步锁文章。

像semaphore,mutex 可以支持多线程,也可以是多进程。但如果是在分布式集群环境想实现类似 semaphore的东西怎么做? 我们可以借助redis来实现, 我这里用了redis的hash、list、string实现的网络信号量。 利用redis hash存token的时间,list用来实现堵塞及非阻塞模式,利用redis string的setnx来实现分布式锁,锁的目的是用来原子性写一致。

该项目是使用golang写的,再具体代码就不详细描述了,有兴趣的可以直接看代码。

github的项目地址:

https://github.com/rfyiamcool/go_redis_semaphore

用法

limiter := go_redis_semaphore.NewRedisSemaphore(redis连接池对象, 信号量数目, "redis key的名字")

// 初始化redis
limiter.Init()

// 非阻塞拿锁
token, _ := limiter.Acquire(0)

// 超时5s阻塞拿锁
token, _ := limiter.Acquire(5)

// 释放锁
limiter.Release(token)

具体例子

package main
// xiaorui.cc

import (
	"fmt"
	"github.com/rfyiamcool/go_redis_semaphore"
)

func main() {
	fmt.Println("实例化redis连接池")
	redis_client_config := go_redis_semaphore.RedisConfType{
		RedisPw:          "",
		RedisHost:        "127.0.0.1:6379",
		RedisDb:          0,
		RedisMaxActive:   100,
		RedisMaxIdle:     100,
		RedisIdleTimeOut: 1000,
	}
	redis_client := go_redis_semaphore.NewRedisPool(redis_client_config)

	fmt.Println("实例化 redis Semaphore")
	limiter := go_redis_semaphore.NewRedisSemaphore(redis_client, 2, "love")
	limiter.Init()

	fmt.Println("非阻塞拿锁")
	token, _ := limiter.Acquire(0)

	fmt.Println("释放锁")
	limiter.Release(token)
	fmt.Println(limiter.ScanTimeoutToken())
	fmt.Println("end")
}

END.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值