zoukankan      html  css  js  c++  java
  • 分布式锁-❤

    https://www.cnblogs.com/crazymakercircle/p/14731826.html

    分布式锁的实现由很多种,文件锁、数据库、redis等等,比较多;分布式锁常见的多种实现方式:

    1. 数据库悲观锁、
    2. 数据库乐观锁;
    3. 基于Redis的分布式锁;
    4. 基于ZooKeeper的分布式锁。

    在实践中,还是redis做分布式锁性能会高一些

    数据库悲观锁

     

    数据库乐观锁

    Compare and Swap(CAS)技术

    CAS 乐观锁有两个问题:

    (1) CAS 存在一个比较重要的问题,即ABA问题. 解决的办法是version字段顺序递增。

    (2) 乐观锁的方式,在高并发时,只有一个线程能执行成功,会造成大量的失败,这给用户的体验显然是很不好的。

    除了在数据库层面加分布式锁,通常还可以使用以下更高性能、更高可用的分布式锁:

    • 分布式缓存(如redis)锁
    • 分布式协调(如zookeeper)锁

    Redis分布式锁

    本文重点介绍Redis分布式锁,分为两个维度进行介绍:

    (1)基于Jedis手工造轮子分布式锁

    (2)介绍Redission 分布式锁的使用和原理。

    分布式锁一般有如下的特点:

    • 互斥性: 同一时刻只能有一个线程持有锁
    • 可重入性: 同一节点上的同一个线程如果获取了锁之后能够再次获取锁
    • 锁超时:和J.U.C中的锁一样支持锁超时,防止死锁
    • 高性能和高可用: 加锁和解锁需要高效,同时也需要保证高可用,防止分布式锁失效
    • 具备阻塞和非阻塞性:能够及时从阻塞状态中被唤醒

    手工造轮子:基于Jedis 的API实现分布式锁

    我们首先讲解 Jedis 普通分布式锁实现,并且是纯手工的模式,从最为基础的Redis命令开始。

    只有充分了解与分布式锁相关的普通Redis命令,才能更好的了解高级的Redis分布式锁的实现,因为高级的分布式锁的实现完全基于普通Redis命令。

    Redis几种架构

    Redis发展到现在,几种常见的部署架构有:

    • 单机模式;
    • 主从模式;
    • 哨兵模式;
    • 集群模式;

    从分布式锁的角度来说, 无论是单机模式、主从模式、哨兵模式、集群模式,其原理都是类同的。 只是主从模式、哨兵模式、集群模式的更加的高可用、或者更加高并发。

    首先看两个命令:

    Redis分布式锁机制,主要借助setnx和expire两个命令完成。

    setnx命令:

    SETNX 是SET if Not eXists的简写。将 key 的值设为 value,当且仅当 key 不存在; 若给定的 key 已经存在,则 SETNX 不做任何动作。

     

     

    基于Jedis API的分布式锁的总体流程:

    通过Redis的setnx、expire命令可以实现简单的锁机制:

    • key不存在时创建,并设置value和过期时间,返回值为1;成功获取到锁;
    • 如key存在时直接返回0,抢锁失败;
    • 持有锁的线程释放锁时,手动删除key; 或者过期时间到,key自动删除,锁释放。

    线程调用setnx方法成功返回1认为加锁成功,其他线程要等到当前线程业务操作完成释放锁后,才能再次调用setnx加锁成功。

    以上简单redis分布式锁的问题:

    如果出现了这么一个问题:如果setnx是成功的,但是expire设置失败,一旦出现了释放锁失败,或者没有手工释放,那么这个锁永远被占用,其他线程永远也抢不到锁。

    所以,需要保障setnx和expire两个操作的原子性,要么全部执行,要么全部不执行,二者不能分开。

    解决的办法有两种:

    • 使用set的命令时,同时设置过期时间,不再单独使用 expire命令
    • 使用lua脚本,将加锁的命令放在lua脚本中原子性的执行

    为啥推荐使用Redission

    作为 Java 开发人员,我们若想在程序中集成 Redis,必须使用 Redis 的第三方库。目前大家使用的最多的第三方库是jedis。

    和SpringCloud gateway一样,Redisson也是基于Netty实现的,是更高性能的第三方库。 所以,这里推荐大家使用Redission替代 jedis。

    小蚊子大人
  • 相关阅读:
    Dynamics AX 2012 R2 配置E-Mail模板
    Dynamics AX 2012 R2 设置E-Mail
    Dynamics AX 2012 R2 为运行失败的批处理任务设置预警
    Dynamics AX 2012 R2 耗尽用户
    Dynamics AX 2012 R2 创建一个专用的批处理服务器
    Dynamics AX 2012 R2 创建一个带有负载均衡的服务器集群
    Dynamics AX 2012 R2 安装额外的AOS
    Dynamics AX 2012 R2 将系统用户账号连接到工作人员记录
    Dynamics AX 2012 R2 从代码中调用SSRS Report
    Dynamics AX 2012 R2 IIS WebSite Unauthorized 401
  • 原文地址:https://www.cnblogs.com/ywsheng/p/14972366.html
Copyright © 2011-2022 走看看