美文网首页
go+redis模拟实现分布式锁

go+redis模拟实现分布式锁

作者: 小怪兽狂殴奥特曼 | 来源:发表于2019-04-24 16:44 被阅读0次

参考这篇文章# Redis分布式锁的正确实现方式 实现的分布式锁
整个过程可以分为四步:
+先用SETNX设置key。key是唯一的,统一时刻只有一个客户端的setnx指令能成功,满足锁的唯一性。如果成功,说明没有人持有锁,否则锁被占有,则获取锁的释放时间,然后进入睡眠。睡眠时间为一个任意的值,小于锁的TTL。

  • 用EXPIRE设置key。expire是为了防止客户端崩溃锁变成死锁。SETNX和EXPIRE两个指令应该是原子的,go下面没法实现。需要修改redis支持。
  • 获取到锁后干活
  • 释放锁
package main

import (
    "fmt"
    "time"
    "os"
    "strconv"
    "github.com/gomodule/redigo/redis"
)

const dist_lock = "distlock"
func main() {
    redis_conn, err := redis.Dial("tcp", "127.0.0.1:6379", redis.DialPassword("hdiot"))
    if err != nil {
        fmt.Println(err)
        return
    }
    defer redis_conn.Close()

    pidstr := strconv.Itoa(os.Getpid())
    for {
        fmt.Println("try lock")
        _, err := redis_conn.Do("SETNX", dist_lock, pidstr)
        if err != nil {
            fmt.Println(err)

            ttl, err := redis.Int(redis_conn.Do("TTL", dist_lock))
            if err != nil {
                fmt.Println(err)
            }
            time.Sleep(time.Duration(ttl/2) * time.Second)  
        } else {
            // we get lock
            break;
        }
    }

    _, err = redis_conn.Do("EXPIRE", dist_lock, 10)
    if err != nil {
        fmt.Println(err)
        return      
    }

    // do something
    fmt.Println("get lock")

    // release lock
    pid_ret, err := redis.String(redis_conn.Do("GET", dist_lock))
    if err != nil {
        fmt.Println(err)
        return
    }

    pid, _ := strconv.Atoi(pid_ret)
    if(pid != os.Getpid()) {
        fmt.Println("not my lock")
        return
    }

    _, err = redis_conn.Do("Del", dist_lock)
    if err != nil {
        fmt.Println(err)
        return      
    }
    fmt.Println("release lock ok")
}

相关文章

  • go+redis模拟实现分布式锁

    参考这篇文章# Redis分布式锁的正确实现方式 实现的分布式锁整个过程可以分为四步:+先用SETNX设置key。...

  • 大佬浅谈分布式锁

    redis 实现 redis 分布锁一、redis 实现分布式锁(可重入锁)redission 实现分布式锁1、对...

  • 分布式锁实现

    基于数据库实现分布式锁基于缓存(redis,memcached)实现分布式锁基于Zookeeper实现分布式锁 s...

  • 基于redis的分布式锁

    分布式锁实现方案 基于数据库实现分布式锁 基于缓存(redis,memcached,tair)实现分布式锁 基于Z...

  • Zookeeper实现分布式锁(一)While版

    前面文章讲解了用Redis实现分布式锁的方式: 分布式锁之Redis实现(acquire)分布式锁之Redis实现...

  • 基于redis实现的分布式锁

    本文要点 基于redis实现分布式锁demo 基于redis实现分布式锁原理 基于redis实现分布式锁优缺点 正...

  • Redis 如何实现分布式锁?ZooKeeper 如何实现分布式

    Redis 如何实现分布式锁?ZooKeeper 如何实现分布式锁?比较二者优劣? 分布式锁的三种实现: 基于数据...

  • 分布式 | 分布式锁的实现

    分布式锁的实现 在常见的分布式锁中有以下三种实现: Redis 实现 Zookeeper 实现 数据库实现 分布式...

  • Redis分布式锁实现方案

    1 Redis分布式锁的特性 在实现分布式锁时,需要保证锁实现的安全性和可靠性。基于这点特点,实现分布式锁需要具备...

  • 分布式锁

    为什么要用分布式锁 数据库乐观锁redis分布式锁zookeeper分布式锁 使用分布式锁的场景 实现分布式锁的方...

网友评论

      本文标题:go+redis模拟实现分布式锁

      本文链接:https://www.haomeiwen.com/subject/nloggqtx.html