English | 中文
DisGo 简介DistributedDiscoGolang
DisGo拥有的特性
可重入锁
DisGo是一个可重入锁,使用Redis的Hash类型作为锁,hash-name为锁名,hash-key存放的是当前持锁线程的唯一id,hash-value存放的是当前加锁次数。
公平锁
Golang本身没有线程安全的队列可以使用,为了方便,DisGo使用Redis的ZSet模拟队列,一定程度上保证了先进先出,提供了公平抢锁机制。
自动续期
DisGo提供自动续期功能,防止业务没有执行完,锁却提前释放导致的数据错误。
自旋抢锁
DisGo提供自旋抢锁,在设定的等待时间内将会自动重试抢锁,直到抢到锁或者等待超时。
更加高效
DisGo使用了Redis的发布订阅,在锁释放的第一时间会收到消息,然后根据等待队列的顺序执行加锁。
DisGo的加锁流程点击我
获取锁对象
redisClient := redis.NewClient(&redis.Options{ Network: "tcp", Addr: "127.0.0.1:6379", }) lock, err := disgo.GetLock(redisClient, "test")
普通加锁(不需要自动续期)
success, err := lock.Lock(ctx, 5*time.Second, 10*time.Second)
自旋加锁(不需要自动续期)
success, err := lock.TryLock(ctx, 5*time.Second, 10*time.Second)
自旋加锁(自动续期)
success, err := lock.TryLockWithSchedule(ctx, 5*time.Second)
解锁(通用)
success, err := lock.Release(ctx)