前言:
Semaphore是信号量,作用? 我想大家都知道。semaphore跟mutex的区别我想大家也知道了,我这里就不老生常谈,重复讲解了,有兴趣的朋友可以自行google相关的同步锁文章。
该文章后续会有更新, 原文地址, http://xiaorui.cc/?p=4822
像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.