zoukankan      html  css  js  c++  java
  • Redis 分布式锁,C#通过Redis实现分布式锁(转)

    分布式锁一般有三种实现方式:

      1. 数据库乐观锁;

      2. 基于Redis的分布式锁;

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

    可靠性

      首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件:

      互斥性。在任意时刻,只有一个客户端能持有锁。

      不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。

      具有容错性。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。

      解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。

    使用StackExchange.Redis 实现起来简单得很

    /// <summary>
    /// 加锁,如果锁定成功,就去执行方法
    /// </summary>
    public static bool LockTake(string key, string data, int seconds, int db = 0)
    {
        // key:用key来当锁,因为key是唯一的。
        // value:很多童鞋可能不明白,有key作为锁不就够了吗,为什么还要用到value?原因就是我们在上面讲到可靠性时,
        // 分布式锁要满足第四个条件解铃还须系铃人,通过给value赋值为Guid.NewGuid().ToString(),我们就知道这把锁是哪个请求加的了,在解锁的时候就可以有依据。
        return GetDatabase(db).LockTake(key, data, (DateTime.Now.AddSeconds(seconds) - DateTime.Now));
    }
     
    /// <summary>
    /// 解锁
    /// </summary>
    public static bool LockRelease(string key, string data, int db = 0)
    {
        return GetDatabase(db).LockRelease(key, data);
    }
    

    调用实现

    string guid = Guid.NewGuid().ToString();
    if (RedisHelper.LockTake(wechatOpenId, guid, 90, 15))
    {
        try
        {
            // 执行方法
        }
        catch (Exception e)
        {
            // 异常
        }
        finally
        {
            RedisHelper.LockRelease(wechatOpenId, guid, 15);
        }
    }
    else {
        // 已锁,无法执行
        return null;
    }
    

    Ruthless https://notes.clump.cc/technology/3348

  • 相关阅读:
    vue2.0 + vux (六)NewsList 资讯页 及 NewsDetail 资讯详情页
    vue2.0 + vux (五)api接口封装 及 首页 轮播图制作
    vue2.0 + vux (四)Home页
    vue2.0 + vux (三)MySettings 页
    vue2.0 + vux (二)Footer组件
    vue2.0 + vux (一)Header 组件
    vue2 + typescript2 自定义过滤器
    flexible.js + makegrid.js 自适应布局
    vue-router钩子beforeRouteEnter函数获取到this实例
    weex 项目搭建
  • 原文地址:https://www.cnblogs.com/tangge/p/11063478.html
Copyright © 2011-2022 走看看