• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

disgo: 这是一个使用Golang开发的基于Redis的分布式锁。 拥有重入、自旋、公平锁等特 ...

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

disgo

开源软件地址:

https://gitee.com/musclechen/disgo

开源软件介绍:

English | 中文

DisGo 简介

DisGo是一个基于Redis的分布式锁,采用Golang语言开发。该名字源于DistributedDiscoGolang,祝各位写代码犹如跳迪斯科一样丝滑。

DisGo拥有的特性

可重入锁

DisGo是一个可重入锁,使用Redis的Hash类型作为锁,hash-name为锁名,hash-key存放的是当前持锁线程的唯一id,hash-value存放的是当前加锁次数。

公平锁

Golang本身没有线程安全的队列可以使用,为了方便,DisGo使用Redis的ZSet模拟队列,一定程度上保证了先进先出,提供了公平抢锁机制。

自动续期

DisGo提供自动续期功能,防止业务没有执行完,锁却提前释放导致的数据错误。

自旋抢锁

DisGo提供自旋抢锁,在设定的等待时间内将会自动重试抢锁,直到抢到锁或者等待超时。

更加高效

DisGo使用了Redis的发布订阅,在锁释放的第一时间会收到消息,然后根据等待队列的顺序执行加锁。

DisGo的加锁流程

点击我

DisGo的API介绍

获取锁对象

    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)

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap