精华内容
下载资源
问答
  • 本文将从原子荧光光谱法的概述、基本原理、仪器结构与类型、样品要求、应用等多个方面进行详细阐述,以期读者阅读后,能够对AFS更深入的了解。2. 扫描电子显微镜(SEM)的基本原理与应用微信搜索...
    fecabba82a9bf5c82d42860d38320db8.png

    1. 原子荧光光谱(AFS)的基本原理与应用

    298f9ced64b8f1a85ccb14f04e5c9128.png

    微信搜索小程序“科学10分钟”查看全文

    原子荧光光谱法(AFS)是1964年以后发展起来的分析方法,是以原子在辐射能激发下发射的荧光强度进行定量分析的发射光谱分析法。本文将从原子荧光光谱法的概述、基本原理、仪器结构与类型、样品要求、应用等多个方面进行详细阐述,以期读者阅读后,能够对AFS有更深入的了解。

    2. 扫描电子显微镜(SEM)的基本原理与应用

    f9764030560f2972c532daac18e715fd.png

    微信搜索小程序“科学10分钟”查看全文

    扫描电子显微镜(SEM),简称扫描电镜,是利用细聚焦电子束在样品表面扫描时激发出来的各种物理信号来调制成像的一种常用的显微分析仪器。本文不仅通过SEM的发展史、仪器结构、成像原理及特点等方面带领读者从理论方面学习SEM的相关知识,还于文章后半部分列举大量实例,图文并茂地给读者展现了SEM的实际应用,帮助读者将理论运用于实践中去。

    3. X射线能谱(EDX)的基本原理与应用

    0bca773c1de48405d031da3bc050e9a6.png

    微信搜索小程序“科学10分钟”查看全文

    X射线能谱(EDX)作为元素分析方法之一,常用于材料微区成分元素种类与含量分析,可以分析元素周期表中从硼到铀(B-U)的所有元素信息,一般与扫描电子显微镜和透射电子显微镜配合使用。本文详细讲解了EDX的仪器类型及构成,更从定性定量原理以及实际应用上进行了详尽阐述,文末通过对有关EDX的问题解答,可以让读者更加全面地了解有关EDX的知识。

    4. 扫描透射电子显微镜(STEM)的基本原理与应用

    bb4863564e3611c9e61541accb9a83f8.png

    微信搜索小程序“科学10分钟”查看全文

    扫描透射电子显微镜(STEM)是透射电子显微镜(TEM)的一种发展。近些年,伴随球差校正器的引入,STEM的空间分辨率达到了亚埃米级,已经可以实现单个原子柱成像观察。本文从STEM的发展史、仪器的构成及工作原理、成像模式、实际应用等方面,非常详实地讲解了STEM的相关知识。文末介绍了STEM的优缺点并将其与TEM、SEM的性能相比较,让读者更为客观地了解STEM。

    5. 紫外可见漫反射光谱(UV-Vis DRS)的基本原理与应用

    827b47aae0d74dd15bd57215dac09207.png

    微信搜索小程序“科学10分钟”查看全文

    紫外可见漫反射光谱(UV-Vis DRS)主要是利用光在物质表面的反射来获取物质的信息,与物质的电子结构有关,一般用于研究固体材料。UV-Vis DRS可研究催化剂表面过渡金属离子及其配合物的结构、氧化状态、配位状态、配位对称性;可在光催化中研究催化剂的光吸收性能;可用于色差的测定等。本文介绍了有关UV-Vis DRS的基本原理,并列举大量实例以介绍其应用,以期为从事相关工作的读者提供理论和实践的经验。

    6. 俄歇电子能谱(AES)的基本原理与应用

    c902e0749c410a2dc64f87356bc2716d.png

    微信搜索小程序“科学10分钟”查看全文

    俄歇电子能谱(AES)是用具有一定能量的电子束(或X射线)激发样品俄歇效应,通过检测俄歇电子的能量和强度,从而获得有关材料表面化学成分和结构信息的方法。本文从俄歇电子能谱的基本原理、分析技术、实验操作、优缺点、应用实例等方面,全面详尽地介绍了AES的相关知识,以期为读者提供帮助。

    2d98545911d2ccd3b5f1c4a9d9456f98.png
    展开全文
  • 本文将从原子荧光光谱法的概述、基本原理、仪器结构与类型、样品要求、应用等多个方面进行详细阐述,以期读者阅读后,能够对AFS更深入的了解。2. 扫描电子显微镜(SEM)的基本原理与应用微信搜索...

    c68c9a3a1b291a3a4e7abe1ba74947d1.png

    1. 原子荧光光谱(AFS)的基本原理与应用

    9e8f30dd989c53018f206ef9970c2409.png

    微信搜索小程序“科学10分钟”查看全文

    原子荧光光谱法(AFS)是1964年以后发展起来的分析方法,是以原子在辐射能激发下发射的荧光强度进行定量分析的发射光谱分析法。本文将从原子荧光光谱法的概述、基本原理、仪器结构与类型、样品要求、应用等多个方面进行详细阐述,以期读者阅读后,能够对AFS有更深入的了解。

    2. 扫描电子显微镜(SEM)的基本原理与应用

    cfeb2daed4b9839702c80ddffd9e5316.png

    微信搜索小程序“科学10分钟”查看全文

    扫描电子显微镜(SEM),简称扫描电镜,是利用细聚焦电子束在样品表面扫描时激发出来的各种物理信号来调制成像的一种常用的显微分析仪器。本文不仅通过SEM的发展史、仪器结构、成像原理及特点等方面带领读者从理论方面学习SEM的相关知识,还于文章后半部分列举大量实例,图文并茂地给读者展现了SEM的实际应用,帮助读者将理论运用于实践中去。

    3. X射线能谱(EDX)的基本原理与应用

    2225f4bb70bd40436c7f696b4a45c7ed.png

    微信搜索小程序“科学10分钟”查看全文

    X射线能谱(EDX)作为元素分析方法之一,常用于材料微区成分元素种类与含量分析,可以分析元素周期表中从硼到铀(B-U)的所有元素信息,一般与扫描电子显微镜和透射电子显微镜配合使用。本文详细讲解了EDX的仪器类型及构成,更从定性定量原理以及实际应用上进行了详尽阐述,文末通过对有关EDX的问题解答,可以让读者更加全面地了解有关EDX的知识。

    4. 扫描透射电子显微镜(STEM)的基本原理与应用

    2625474d13a375660fb598d6123eeda1.png

    微信搜索小程序“科学10分钟”查看全文

    扫描透射电子显微镜(STEM)是透射电子显微镜(TEM)的一种发展。近些年,伴随球差校正器的引入,STEM的空间分辨率达到了亚埃米级,已经可以实现单个原子柱成像观察。本文从STEM的发展史、仪器的构成及工作原理、成像模式、实际应用等方面,非常详实地讲解了STEM的相关知识。文末介绍了STEM的优缺点并将其与TEM、SEM的性能相比较,让读者更为客观地了解STEM。

    5. 紫外可见漫反射光谱(UV-Vis DRS)的基本原理与应用

    1a0d69521246d06dacb15dcd86601515.png

    微信搜索小程序“科学10分钟”查看全文

    紫外可见漫反射光谱(UV-Vis DRS)主要是利用光在物质表面的反射来获取物质的信息,与物质的电子结构有关,一般用于研究固体材料。UV-Vis DRS可研究催化剂表面过渡金属离子及其配合物的结构、氧化状态、配位状态、配位对称性;可在光催化中研究催化剂的光吸收性能;可用于色差的测定等。本文介绍了有关UV-Vis DRS的基本原理,并列举大量实例以介绍其应用,以期为从事相关工作的读者提供理论和实践的经验。

    6. 俄歇电子能谱(AES)的基本原理与应用

    48c18ba5482c9731e3e27629e4c432c4.png

    微信搜索小程序“科学10分钟”查看全文

    俄歇电子能谱(AES)是用具有一定能量的电子束(或X射线)激发样品俄歇效应,通过检测俄歇电子的能量和强度,从而获得有关材料表面化学成分和结构信息的方法。本文从俄歇电子能谱的基本原理、分析技术、实验操作、优缺点、应用实例等方面,全面详尽地介绍了AES的相关知识,以期为读者提供帮助。

    beac9c9cff62bd5084208d5b7c37903c.png
    展开全文
  • 工程上有哪些实现方案?各种方案的利弊权衡又有哪些?希望这篇文章能够对你有一些帮助。▍阅读索引0. 名词定义1. 问题引入2. 分布式环境的特点3. 锁4. 分布式锁5. 分布式锁实现方案5.1. 朴素Redis实现方案、朴...

    桔妹导读:随着计算机技术和工程架构的发展,微服务变得越来越热。如今,绝大多数服务都处于分布式环境中,其中,数据一致性是我们一直关注的重点。分布式锁到底是什么?经过了哪些发展演进?工程上有哪些实现方案?各种方案的利弊权衡又有哪些?希望这篇文章能够对你有一些帮助。

    ▍阅读索引0. 名词定义

    1. 问题引入

    2. 分布式环境的特点

    3. 锁

    4. 分布式锁

    5. 分布式锁实现方案5.1. 朴素Redis实现方案、朴素Redis方案小结

    5.2. ZooKeeper实现方案、ZooKeeper方案小结

    5.3. Redisson实现方案、Redisson方案小结

    6. 总结

    7. 结束语

    8. Reference

    ▍0. 名词定义

    分布式锁:顾名思义,是指在分布式环境下的锁,重点在锁。所以我们先从锁开始讲起。

    ▍1. 问题引入

    举个例子:

    某服务记录数据X,当前值为100。A请求需要将X增加200;同时,B请求需要将X减100。 在理想的情况下,A先读取到X=100,然后X增加200,最后写入X=300。B请求接着读取到X=300,减少100,最后写入X=200。 然而在真实情况下,如果不做任何处理,则可能会出现:A和B同时读取到X=100;A写入之前B读取到X;B比A先写入等等情况。

    上面这个例子相信大家都非常熟悉。出现不符合预期的结果本质上是对临界资源没有做好互斥操作。互斥性问题通俗来讲,就是对共享资源的抢占问题。对于共享资源争抢的正确性,锁是最常用的方式,其他的如CAS(compare and swap)等,这里不展开。

    ▍2. 分布式环境的特点

    我们的绝大部分服务都处于分布式环境中。那么,分布式系统有哪些特点呢?大致如下:

    * 可扩展性:可通过横向水平扩展提高系统的性能和吞吐量。

    * 高可靠性:高容错,即使系统中一台或几台故障,系统仍可提供服务。

    * 高并发性:各机器并行独立处理和计算。

    * 廉价高效:多台小型机而非单台高性能机。

    ▍3.锁

    我们先来看下非分布式情况下的锁方案(多线程和多进程的情况),然后再演进到分布式锁。

    ▍多线程下的锁机制:

    各种语言有不同的实现方式,比较成熟。比如,go语言中的sync.RWMutex(读写锁)、sync.Mutex(互斥锁);JAVA中的ReentrantLock、synchronized;在php中没有找到原生的支持锁的方式,只能通过外部来间接实现,比如文件锁,借助外部存储的锁等。

    ▍多进程下的锁机制:

    对于临界资源的访问已经超出了单个进程的控制范围。在多进程的情况下,主要是利用操作系统层面的进程间通信原理来解决临界资源的抢占问题。比较常见的一种方法便是使用信号量(Semaphores)。

    ▍对信号量的操作,主要是P操作(wait)和V操作(signal):

    * P操作 ( wait ) :

    先检查信号量的大小,若值大于零,则将信号量减1,同时进程获得共享资源的访问权限,继续执行;若小于或者等于零,则该进程被阻塞后,进入等待队列。

    * V操作 ( signal ) :

    该操作将信号量的值加1,如果有进程阻塞着等待该信号量,那么其中一个进程将被唤醒。

    可看出,多进程锁方案跟多线程的锁方案实现思路大同小异。

    我们将互斥的级别拉高,分布式环境下不同节点不同进程或线程之间的互斥,就是分布式锁的挑战之一。后面再细讲。

    另外,在传统的基于数据库的架构中,对于数据的抢占问题也可以通过数据库事务(ACID)来保证。在分布式环境中,出于对性能以及一致性敏感度的要求,使得分布式锁成为了一种比较常见而高效的解决方案。

    ▍从上面对于多线程和多进程锁的概括,可以总结出锁的抽象条件:

    1)“需要有存储锁的空间,并且锁的空间是可以访问到的”:

    对于多线程就是内存(进程中不同的线程都可以读写),多进程中通过共享内存的方式,也是提供一块地方,供不同进程读写。主要目的是保证不同的进线程改动对于其他进线程可见,进而满足互斥性需求。

    2)“锁需要被唯一标识”:

    不同的共享资源,必然需要用不同的锁进行保护,因此相应的锁必须有唯一的标识。在多线程环境中,锁可以是一个对象,那么对这个对象的引用便是这个唯一标识。多进程下,比如有名信号量,便是用硬盘中的文件名作为唯一标识。

    3)“锁要有至少两种状态”:

    有锁,没锁。存在,不存在等等。很好理解。

    满足上述三个条件就可以实现基础的分布式锁了。但是随着技术的演进。

    ▍相应地,对锁也提出了更高级的条件:

    1)可重入:

    外层函数获得锁之后,内层函数还可以获得锁。原因是随着软件复杂性增加,方法嵌套获取锁已经很难避免。但是从代码层面很难分析出这个问题,因此我们要使用可重入锁。导致锁需要支持可重入的场景。对于可重入的思考,每种语言有自己的哲学和取舍,如go就舍弃了支持重入:Recursive locking in Go [ https://stackoverflow.com/questions/14670979/recursive-locking-in-go ]以后go又会不会认为“可重入真香”呢?哈哈,我们拭目以待。

    2)避免产生惊群效应(Herd Effect):

    惊群效应指,在有多个请求等待获取锁的时候,一旦占有锁的线程释放之后,所有等待方都同时被唤醒,尝试抢占锁。但是绝大多数的抢占都是不必要的。这种情况在多线程和多进程中开销同样很大。要尽量避免这种情况出现。

    3)公平锁和非公平锁:

    公平锁:优先把锁给等待时间最长的一方;非公平锁:不保证等待线程拿锁的顺序。公平锁的实现成本较高。

    4)阻塞锁和自旋锁:

    主要是效率的考虑。自旋锁适用于临界区操作耗时短的场景;阻塞锁适用于临界区操作耗时长的场景。

    5)锁超时:

    防止释放锁失败,出现死锁的情况。

    6)高效,高可用:

    加锁和解锁需要高效,同时也需要保证高可用防止分布式锁失效,可以增加降级。

    还有很多其他更高要求的条件,不一一列举了。有兴趣的小伙伴可以看看编程史上锁的演进过程。

    ▍4. 分布式锁

    ▍使用分布式锁的必要性:

    1)服务要求:部署的服务本身就处于分布式环境中

    2)效率:使用分布式锁可以避免不同节点重复相同的工作,这些工作会浪费资源。比如用户付了钱之后有可能不同节点会发出多封短信

    3)正确性:跟2)类似。如果两个节点在同一条数据上面操作,比如多个节点机器对同一个订单操作不同的流程有可能会导致该笔订单最后状态出现错误,造成损失

    包括但不限于这些必要性,在强烈地呼唤我们今天的主角—“分布式锁”闪亮登场。

    ▍5. 分布式锁实现方案

    有了非分布式锁的实现思路,和分布式环境的挑战,我们来看看分布式锁的实现策略。

    分布式锁本质上还是要实现一个简单的目标—占一个“坑”,当别的节点机器也要来占时,发现已经有人占了,就只好放弃或者稍后再试。

    ▍大体分为4种

    1)使用数据库实现

    2)使用朴素Redis等缓存系统实现

    3)使用ZooKeeper等分布式协调系统实现

    4)使用Redisson来实现(本质上基于Redis)

    因为利用mysql实现分布式锁的性能低以及改造大,我们这里重点讲一下下面3种实现分布式锁的方案。

    ▍5.1 朴素Redis实现方案

    我们循序渐进,对比几种实现方式,找出优雅的方式:

    方案1:setnx+delete1setnx lock_key lock_value

    2// do sth

    3delete lock_key

    缺点:一旦服务挂掉,锁无法被删除释放,会导致死锁。硬伤,pass!2

    方案2:setnx + setex1setnx lock_key lock_value

    2setex lock_key N lock_value  // N s超时

    3// do sth

    4delete lock_key

    在方案1的基础上设置了超时时间。但是还是会出现跟1一样的问题。如果setnx之后、setex之前服务挂掉,一样会陷入死锁。本质原因是,setnx/setex分为了两个步骤,非原子操作。硬伤,pass!

    方案3:set ex nx1SET lock_key lock_value EX N NX //N s超时

    2// do sth

    3delete lock_key

    将加锁、设置超时两个步骤合并为一个原子操作,从而解决方案1、2的问题。(Redis原生命令支持,Redis version需要>=2.6.12,滴滴生产环境Redis version一般为3.2,所以日常能够使用)。

    优点:此方案目前大多数sdk、Redis部署方案都支持,实现简单

    缺点:会存在锁被错误的释放,被错误的抢占的情况。如下图:

    这块有2个问题:

    1)GC期间,client1超时时间已到,导致将client2错误地放进来

    2)client1执行完逻辑后会显式调用del,将所有的锁都释放了(正确的情况应该只释放自己的锁,错误地释放了client2的锁)

    方案4:

    在3的基础上,对于问题1,将client的超时时间设置长一些,保证只能通过显式del来释放锁,而超时时间只是作为一种最终兜底的方案。针对问题2,增加对 value 的检查,只解除自己加的锁,为保证原子性,只能需要通过lua脚本实现。

    lua脚本:https://redis.io/commands/eval1if redis.call("get",KEYS[1]) == ARGV[1] then

    2   return redis.call("del",KEYS[1])

    3else

    4   return 0

    5end

    如果超时时间设置长,只能通过显式的del来释放锁,就不会出现问题2(错误释放掉其他client的锁)。跟滴滴KV store的王斌同学讨论过,目前没有找到方案4优于方案3(只要超时时间设置的长一些)的场景。所以,在我的认知中,方案4跟方案3的优势一样,但是方案3的实现成本明显要低很多。

    朴素Redis方案小结

    方案3用的最多,实现成本小,对于大部分场景,将超时时间设置的长一些,极少出现问题。同时本方案对不同语言的友好度极高。

    ▍5.2 ZooKeeper实现方案

    我们先简要介绍一些ZooKeeper(以下简称ZK):

    ZooKeeper是一种“分布式协调服务”。所谓分布式协调服务,可以在分布式系统中共享配置,协调锁资源,提供命名服务等。为读多写少的场景所设计,ZK中的节点(以下简称ZNode)非常适合用于存储少量的状态和配置信息。

    对ZK常见的操作:

    create:创建节点

    delete:删除节点

    exists:判断一个节点的数据

    setdata:设置一个节点的数据

    getchildren:获取节点下的所有子节点

    这其中,exists,getData,getChildren属于读操作。Zookeeper客户端在请求读操作的时候,可以选择是否设置Watch(监听机制)。

    什么是Watch?

    Watch机制是zk中非常有用的功能。我们可以理解成是注册在特定Znode上的触发器。当这个Znode发生改变,也就是调用了create,delete,setData方法的时候,将会触发Znode上注册的对应事件,请求Watch的客户端会接收到异步通知。

    我们在实现分布式锁的时候,正是通过Watch机制,来通知正在等待的session相关锁释放的信息。

    什么是ZNode?

    ZNode就是ZK中的节点。ZooKeeper节点是有生命周期的,这取决于节点的类型。在 ZooKeeper 中,节点类型可以分为临时节点(EPHEMERAL),时序节点(SEQUENTIAL ),持久节点(PERSISTENT )。

    临时节点(EPHEMERAL):

    节点的生命周期跟session绑定,session创建的节点,一旦该session失效,该节点就会被删除。

    临时顺序节点(EPHEMERAL_SEQUENTIAL):

    在临时节点的基础上增加了顺序。每个父结点会为自己的第一级子节点维护一份时序。在创建子节点的时候,会自动加上数字后缀,越后创建的节点,顺序越大,后缀越大。

    持久节点(PERSISTENT ):

    节点创建之后就一直存在,不会因为session失效而消失。

    持久顺序节点(PERSISTENT_SEQUENTIAL):

    与临时顺序节点同理。

    ZNode中的数据结构:

    data(znode存储的数据信息),acl(记录znode的访问权限,即哪些人或哪些ip可以访问本节点),stat(包含znode的各种元数据,比如事务id,版本号,时间戳,大小等等),child(当前节点的子节点引用)。

    利用ZK实现分布式锁,主要得益于ZK保证了数据的强一致性。

    下面说说通过zk简单实现一个保持独占的锁(利用临时节点的特性):

    我们可以将ZK上的ZNode看成一把锁(类似于Redis方案中的key)。多个session都去创建同一个distribute_lock节点,只会有一个创建成功的session。相当于只有该session获取到锁,其他session没有获取到锁。在该成功获锁的session失效前,锁将会一直阻塞住。session失效时,节点会自动被删除,锁被解除。(类似于Redis方案中的expire)。

    上述实现方案跟Redis方案3的实现效果一样。

    但是,这样的锁有没有改进的地方?当然!

    1)我们可能会有可重入的需求,因此希望能有可重入的锁机制。

    2)有些场景下,在争抢锁的时候,我们既不想一次争抢不到就pass,也不想一直阻塞住直到获取到锁。一个朴素的需求是,我们希望有超时时间来控制是否去上锁。更进一步,我们不想主动的去查到底是否能够加锁,我们希望能够有事件机制来通知是否能够上锁。(这里,你是不是想到了ZK的Watch机制呢?)

    要满足这样的需求就需要控制时序。利用顺序临时节点和Watch机制的特性,来实现:

    我们事先创建/distribute_lock节点,多个session在它下面创建临时有序节点。由于zk的特性,/distribute_lock该节点会维护一份sequence,来保证子节点创建的时序性。

    具体实现如下:

    1)客户端调用create()方法在/distribute_lock节点下创建EPHEMERAL_SEQUENTIAL节点。

    2)客户端调用getChildren(“/distribute_lock”)方法来获取所有已经创建的子节点。

    3)客户端获取到所有子节点path之后,如果发现自己在步骤1中创建的节点序号最小,那么就认为这个客户端获得了锁。

    4)如果在步骤3中发现自己并非所有子节点中最小的,说明自己还没有获取到锁。此时客户端需要找到比自己小的那个节点,然后对其调用exist()方法,同时注册事件监听。需要注意是,只在比自己小一号的节点上注册Watch事件。如果在比自己都小的节点上注册Watch事件,将会出现惊群效应,要避免。

    5)之后当这个被关注的节点被移除了,客户端会收到相应的通知。这个时候客户端需要再次调用getChildren(“/distribute_lock”)方法来获取所有已经创建的子节点,确保自己确实是最小的节点了,然后进入步骤3)。

    Curator框架封装了对ZK的api操作。以Java为例来进行演示:

    引入依赖:1

    2   org.apache.curatorgroupId>

    3   curator-recipesartifactId>

    4   2.11.1version>

    5dependency>

    使用的时候需要注意Curator框架和ZK的版本兼容问题。

    以排他锁为例,看看怎么使用:1public class TestLock {

    2

    3    public static void main(String[] args) throws Exception {

    4        //创建zookeeper的客户端

    5        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);

    6        CuratorFramework client = CuratorFrameworkFactory.newClient(“ip:port", retryPolicy);

    7        client.start();

    8

    9        //创建分布式锁, 锁空间的根节点路径为/sunnyzengqi/curator/lock

    10        InterProcessMutex mutex = new InterProcessMutex(client, "/sunnyzengqi/curator/lock");

    11        mutex.acquire();

    12        //获得了锁, 进行业务流程

    13        System.out.println("Enter mutex");

    14        Thread.sleep(10000);

    15        //完成业务流程, 释放锁

    16        mutex.release();

    17        //关闭客户端

    18        client.close();

    19    }

    20}

    21

    上面代码在业务执行的过程中,在ZK的/sunnyzengqi/curator/lock路径下,会创建一个临时节点来占位。相同的代码,在两个机器节点上运行,可以看到该路径下创建了两个临时节点:

    运行命令echo wchc | nc localhost 2181查看watch信息:

    可以看到lock1节点的session在监听节点lock0的变动。此时是lock0获取到锁。等到lock0执行完,session会失效,触发Watch机制,通知lock1的session说锁已经被释放了。这时,lock1可以来抢占锁,进而执行自己的操作。

    除了简单的排它锁的实现,还可以利用ZK的特性来实现更高级的锁(比如信号量,读写锁,联锁)等,这里面有很多的玩法。

    ZooKeeper方案小结

    能够实现很多具有更高条件的锁机制,并且由于ZK优越的session和watch机制,适用于复杂的场景。因为有久经检验的Curator框架,集成了很多基于ZK的分布式锁的api,对于Java语言非常友好。对于其他语言,虽然也有一些开源项目封装了它的api,但是稳定性和效率需要自己去实际检验。

    ▍5.3 Redisson实现方案

    我们先简要介绍一下Redisson:

    Redisson是Java语言编写的基于Redis的client端。功能也非常强大,功能包括:分布式对象,分布式集合,分布式锁和同步器,分布式服务等。被大家熟知的场景还是在分布式锁的场景。

    为了解决加锁线程在没有解锁之前崩溃进而出现死锁的问题,不同于朴素Redis中通过设置超时时间来处理。Redisson采用了新的处理方式:Redisson内部提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。

    跟Zookeeper类似,Redisson也提供了这几种分布式锁:可重入锁,公平锁,联锁,红锁,读写锁等。具体怎么用这里不展开,感兴趣的朋友可以自己去实验。

    Redisson方案小结

    跟ZK一样,都能够实现很多具有更高条件的锁机制,适用于复杂的场景。但对语言非常挑剔,目前只能支持Java语言。

    ▍6. 总结

    上一节,我们讨论了三种实现的方案:朴素Redis实现方案,ZooKeeper实现方案,Redisson实现方案。由于第1种与第3种都是基于Redis,所以主要是ZK和基于Redis两种。我们不禁想问,在实现分布式锁上,基于ZK与基于Redis的方案,有什么不同呢?

    1)锁的时长设置上:

    得益于ZK的session机制,客户端可以持有锁任意长的时间,这可以确保它做完所有需要的资源访问操作之后再释放锁。避免了基于Redis的锁对于有效时间到底设置多长的两难问题。实际上,基于ZooKeeper的锁是依靠Session(心跳)来维持锁的持有状态的,而Redis不支持Sesion。

    优势:ZK>Redisson>朴素Redis。

    2)监听机制上:

    得益于ZK的watch机制,在获取锁失败之后可以等待锁重新释放的事件。这让客户端对锁的使用更加灵活。避免了Redis方案主要去轮询的方式。

    优势:ZK>Redisson=朴素Redis。

    3)使用便利性上:

    由于生产环境都有稳定的Redis和ZooKeeper集群,有专业的同学维护,这两者差别不大。在语言局限性上,朴素Redis从不挑食。ZK和Redisson都偏向于Java语言。在开发难度上,Redis最简单,几乎不用写什么代码;ZK和Redisson次之,依赖于使用的语言是否有集成的api以及集成稳定性等。

    优势:朴素Redis>ZK>Redisson。

    4)支持锁形式的多样性上:

    上面有提及,ZK和Redisson都支持了各种花样的分布锁。朴素Redis就比较捉急了,在实现更高要求的锁方面,如果自己造轮子,往往费时费力,力不从心。

    优势:ZK=Redisson>Redis。

    ▍7. 结束语

    分布式锁在日常Coding中已经很常用。但是分布式锁这方面的知识依然非常深奥。2016年,Martin Kleppmann与Antirez两位分布式领域非常有造诣的前辈还针对“Redlock算法”在分布式锁上面的应用炒得沸沸扬扬。

    最后借助这场历史闹剧中Martin的话来结束我们今天的分享。与诸君共勉!将学习当成一生的主题!

    对我来说最重要的一点在于:我并不在乎在这场辩论中谁对谁错 —— 我只关心从其他人的工作中学到的东西,以便我们能够避免重蹈覆辙,并让未来更加美好。前人已经为我们创造出了许多伟大的成果:站在巨人的肩膀上,我们得以构建更棒的软件。

    ……

    对于任何想法,务必要详加检验,通过论证以及检查它们是否经得住别人的详细审查。那是学习过程的一部分。但目标应该是为了获得知识,而不应该是为了说服别人相信你自己是对的。有时候,那只不过意味着停下来,好好地想一想。

    由于时间仓促,自己水平有限,文中必定存在诸多疏漏与理解不当的地方。非常希望得到各位指正,畅谈技术。

    ▍Reference

    0.Apache ZooKeeper

    1.Redisson

    2.Redis

    3.Redis分布式锁进化史

    4.分布式系统互斥性与幂等性问题的分析与解决

    5.浅谈可重入性及其他

    6.Distributed locks with Redis

    7.How to do distributed locking

    8.Is Redlock safe?

    9.Note on fencing and distributed locks

    曾  奇

    滴滴 | 业务平台技术

    研发工程师

    北京科技大学本硕,2018年应届入职滴滴。热爱技术,更热爱用技术去解决实际问题。对分布式系统,大型网站架构有一定的了解。

    展开全文
  • Redis 特点及相关问题

    2020-02-27 14:13:07
    使用Redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型,支持string,list,set,sorted set,hash (3) 支持事务,操作...

    使用Redis有哪些好处?

    • (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
    • (2) 支持丰富数据类型,支持string,list,set,sorted set,hash
    • (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
    • (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

    redis 最适合的场景

    Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?

    如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:

         1 、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
         2 、Redis支持数据的备份,即master-slave模式的数据备份。
         3 、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

    • (1)、会话缓存(Session Cache)

    最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?

    幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。

    • (2)、全页缓存(FPC)

    除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。

    再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。

    此外,对WordPress的用户来说,Pantheon有一个非常好的插件  wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。

    • (3)、队列

    Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。

    如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看

    • (4),排行榜/计数器

    Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:

    当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:

    ZRANGE user_scores 0 10 WITHSCORES

    Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。

    • (5)、发布/订阅

    最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!(不,这是真的,你可以去核实)。

    Redis提供的所有特性中,我感觉这个是喜欢的人最少的一个,虽然它为用户提供如果此多功能。

    redis相比memcached有哪些优势?

    • (1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
    • (2) redis的速度比memcached快很多
    • (3) redis可以持久化其数据

    Memcache与Redis的区别都有哪些?

    • 1)、存储方式

    Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。

    Redis有部份存在硬盘上,这样能保证数据的持久性。

    • 2)、数据支持类型

    Memcache对数据类型支持相对简单。

    Redis有复杂的数据类型。

    • 3),value大小

    redis最大可以达到1GB,而memcache只有1MB

    redis常见性能问题和解决方案:

    • (1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件
    • (2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
    • (3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
    • (4) 尽量避免在压力很大的主库上增加从库
    • (5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...

    这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

    MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

    相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:

    • voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
    • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
    • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
    • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
    • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
    • no-enviction(驱逐):禁止驱逐数据

    Redis 常见的性能问题都有哪些?如何解决?

    • 1).Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。
    • 2).Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
    • 3).Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。
    • 4). Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内

     

    展开全文
  • 徐无忌MySQL笔记:MySQL的...2.MyISAM数据库引擎有哪些特点? 特点一:MyISAM强调性能,每次查询具有原子性,不提供事务支持 特点二:只支持表级锁,select,update,delete,insert语句都会给整个表自动加锁。MyISAM
  • 10----内核同步的方法

    2019-01-16 15:13:08
    原子操作有什么作用? 原子操作可以保证指令以原子的方式执行——执行过程不被打断 有哪些原子整型操作函数? 原子性和顺序性各有什么作用?...自旋锁有哪些特点? 最多只能被一个可执行线程持有 在...
  • 1、数据库存储引擎有哪些 show engines 语句可以查看数据库的存储引擎 2、数据库设计的三大范式 NF ...强调的是原子性,即列不能再分成...4、什么是事务,有哪些特点,事物的隔离级别有哪些 mysql默认的隔离级别有哪
  • java基本数据类型及占用字节、数据类型有哪些并举例 接口和抽象类的区别 java基础类库、原子类、并发包 集合list\set、map都包括什么?都有什么特点/区别是什么? list怎么去重?map和set怎么去重? map中线程安全的...
  • 第二单元习题解答 1.SiO 2膜网络结构特点是什么氧和杂质在SiO 2 网络结构中的作用和用途是什 么对SiO 2 膜性能有哪些影响 二氧化硅的基本结构单元为Si-O四面体网络状结构四面体中心为硅原子四个顶角上为氧原子对SiO2...
  • CompletionService 有哪些特点原子类的适用场景和注意事项? ThreadLocal 为什么会有内存泄漏的问题? 强软弱虚的引用有什么特点和作用。 使用 Java 实现锁的思路。 当前内容版权归码字科技所有并授权显示,盗版...
  • Java Redis最基础入门

    2020-12-23 10:26:48
    Redis有哪些特点? 支持数据持久化 支持多种类型的数据:k-v型数据,list, set, hash型数据 支持数据的备份,即master slave模式的数据备份。 redis所有的操作都是原子性的,意思是要么成功执行 要么完全失败不执行...
  • 如果不使用volatile双重检测机制会什么问题volatile无法保证原子性,应该使用什么保证原子性Atomiclnteger是怎么保证原子性谈一谈CAS和UnSafe详细说一下CASCAS没有缺点,是什么什么是ABA问题,怎么解决 ...
  • 文章目录前言一:索引1.1:什么是索引(index)?1.2:索引有什么作用?1.3:索引的优缺点是什么?1.4:索引的分类1.5:创建索引有什么原则依据?...2.3.1:控制事务的方法有哪些?2.3.2:控制事务的命令有哪些?2.3
  • JDK1.8的Java.util.concurrent.atomic包小结

    千次阅读 2017-10-26 13:26:04
    Atomic意为原子的,JUC包又是并发包,所以...(因不同CPU的原子指令不同,可能需要某种形式的内部锁)Atomic下有哪些类13个实现类:AtomicBoolean@since 1.5/** * A {@code boolean} value that may be updated atomicall
  • Java maven项目整合Redis

    万次阅读 2016-06-01 15:07:05
    2、Redis有哪些特点? 1)、redis的数据完全存储在内存中,使用磁盘只用于持久性,所以redis的速度非常快; 2)、相比许多键值存储系统,redis拥有较为丰富的数据类型; 3)、redis的操作都是原子性的,所以在...
  • Nikon尼康次元影像仪不能工作【维修】爱测易AICEYI那你只需要调好就行。宝石成分检测,氧浓度传感器,...是根据原子所发射的光谱来测定物质的化学组分的,产品被广泛用于多个领域中,那么直读光谱仪有哪些特点,1...
  • mysql-索引

    2020-12-28 13:53:20
    1.1数据库的存储引擎有哪些? InnoDB、MyISAM和MEMORY 1.2 InnoDB和MyISAM的区别? 区别 InnoDB MyISAM 是否支持事务 支持 不支持 是否支持外键 支持 不支持 锁 行锁(基于索引完成行锁) 表锁 跨...
  • 1.volatile关键字有哪些特点? volatile保证了可见性、有序性,不保证原子性 开销一般情况下小于锁的获取,使用无锁的机制完成线程安全任务 2.为什么说volatile关键字保证了可见性? 某个共享变量如果被一个线程给...
  • 三七互娱面经

    千次阅读 2018-06-24 19:22:35
    首先是两次笔试把,前两次有些题目印象...4.哪些语句具有原子性 笔试时间有点长 忘记了 感觉第二次难度有点高 然后仔细谈谈面试吧 第一次面试官应该是个资深的JAVA程序员,问的问题跟追问许多都回答不上来 - -...
  • 事务与锁基础 事务 1、事务的四个特点 2、事务的隔离级别 3、事务执行流程和事务的日志文件 ...特点: ...原子性:一起成功,或者一起失败 ...隔离性:在操作中的某些数据,...哪些存储引擎才事务? Mysql的存储引...
  • SDH基础(2)

    2017-01-14 19:15:11
     1.说明高阶通道层中适配功能宿方向...5.传送网常用的拓扑结构有哪些?各自的特点是什么? 1.说明高阶通道适配功能源方向的处理过程:SN/SM-A功能将VC-M(M=11,12,2或3)组装成TU-M进入高阶V
  • 操作系统名词解释5

    2020-02-24 08:37:31
    计算机最主要的三大性能指标RISC指令系统的最大特点是稳定的存储器在一个多线程的进程中,线程之间可以共享如下哪些资源寄存器堆、栈、全程变量、 I/O端口引导系统引导程序虚拟机保护域原语原子操作(automic ...
  • 故障的种类有哪些? 1、事物内部故障。 分为预期故障和非预期故障,一般重点谈论非预期故障。 预期故障可以通过事务程序本身发现,例如在写java程序时,使用try catch就可以捕捉预期故障并处理。在数据库中也可以...
  • 你知道哪些是不锈钢焊管的焊接技术吗?LGM目前,工业上应用的不锈钢焊管的焊接方法主要氩弧焊、高频焊、等离子焊和激光焊等。几种焊接方法各具特点,目前使用较多的是氩弧焊和高频焊。下面,就几类焊接工艺技术为...
  • 分布式数据库试题及答案.doc

    热门讨论 2010-12-29 16:46:29
    2.5. 数据库系统体系结构有哪几类,每种类型的特点是什么,关键技术有哪些? 12 2.6. 决策支持类应用与OLTP应用对于数据库系统的要求有哪些不同,支持前者的关键技术有哪些,并简述之。 12 2.7. 面向对象的数据库是...
  • 在满二叉树中,每一层上的结点数都达到最大值,即在满二叉树的第k层上2k-1个结点,且深度为m的满二叉树2m-1个结点。 完全二叉树是指这样的二叉树:除最后一层外,每一层上的结点数均达到最大值;在最后一层上只...
  • 任务86: 项目实战:小型商品进销存管理系统_查询哪些客户没有购买记录 任务87: 项目实战:小型商品进销存管理系统_查询销售数量最多的产品信息 任务88: 项目实战:小型商品进销存管理系统_查询销售额最多的产品 ...

空空如也

空空如也

1 2
收藏数 30
精华内容 12
热门标签
关键字:

原子有哪些特点