• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Go 语言下基于Redis分布式锁的实现方式

    分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁。

    项目地址: https://github.com/Spongecaptain/redisLock

    1. Go 原生的互斥锁

    Go 原生的互斥锁即 sync 包下的 Mutex 结构体,利用此结构体的 Lock 以及 Unlock 方法能够实现锁的占据以及释放。

    关于 sync.Mutex,我们可以总结出如下的特性:

    Go 语言中 sync.Mutex 的特性与 Java 中 java.util.concurrent.locks.Lock 相比,API 语义简单不少,这也符合 Go 语言对于简单化的追求。

    下面看看本项目-基于 Redis 的分布式锁能够提供哪些分布锁特性。

    2. redisLock 的特性

    github-redisLock 是一个基于 go-redis/redis 客户端的 Redis 分布式锁。其拥有的如下的特性:

    github-redisLock 同时不支持如下特性:

    重入性:分布式锁不可重入,Go 语言并没有优雅的方式来实现 Java 中的 ThreadLocal 机制
    非公平性:分布式锁存在非公平问题,在极端情况下会导致饥饿问题

    3. Quick Start

    Install redisLock:

    go get github.com/Spongecaptain/redisLock


     

    Create redis client:

    import(
     "github.com/go-redis/redis"
    )
    var redisClient = redis.NewClient(redis.Options{
     Addr:     "localhost:6379",
     Password: "", // no password set
     DB:       0,  // use default DB
    })

    Create redisLock:

    key := "reids-lock-key"
    value := "redis-lock-value"
    lock := redisLock.NewRedisLock(redisClient, key, value)
    
    err := lock.Lock()
    if err != nil {
      fmt.Println(err.Error())
      return
    }
    fmt.Println("get redis lock success")
    defer func() {
      err = lock.Unlock()
      if err != nil {
        fmt.Println(err.Error())
        return
      }
      fmt.Println("release redis lock success")
    }()

    4. API 说明

    (1)构造分布式锁实例
    利用 NewRedisLock 以及 NewRedisLockWithExpireTime 函数能够构造出一个分布式锁实例,NewRedisLockWithExpireTime 的区别在于其能够自定义锁的过期时间。

    NewRedisLock 方法接收的 key 决定了分布式锁的粒度,value 决定了只有 value 值相同才能够进行解锁。

    (2)TryLock
    TryLock 仅尝试一次锁的获取,如果失败,那么不会阻塞,直接返回。

    (3)Lock
    Lock 会不断尝试索取分布式锁,这会导致调用此方法的协程阻塞。

    (4)Unlock
    Unlock 方法用于解锁,由于涉及网络通信,解锁可能失败, error!=nil 意味着解锁失败。

    (5)LockWithTimeout
    Lock 方法会在获取锁资源成功或者超时后返回。

    (6)SpinLock
    支持指定次数地进行自旋式的锁获取。

    以上就是Go 语言下基于 Redis 的分布式锁的详细内容,更多关于Go 分布式锁的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • redis分布式锁的go-redis实现方法详解
    • 详解一种用django_cache实现分布式锁的方式
    • go如何利用orm简单实现接口分布式锁
    • mongo分布式锁Java实现方法(推荐)
    • 浅谈Redis分布式锁的正确实现方式
    • Java使用Redisson分布式锁实现原理
    • Redis Template实现分布式锁的实例代码
    上一篇:手把手带你走进Go语言之运算符解析
    下一篇:go select编译期的优化处理逻辑使用场景分析
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Go 语言下基于Redis分布式锁的实现方式 语,言下,基于,Redis,分布式,