- 博客(361)
- 资源 (1)
- 收藏
- 关注
原创 Zookeeper案例之分布式全局唯一ID生成
目录一、概述二、案例实现一、概述在单体架构中,我们通常使用数据库字段自带的自增auto_increment属性来自动为每一条记录生成唯一的ID,但是当我们采用分布式系统后,特别是分库分表后,就无法再依靠数据库的auto_increment属性来唯一标识一条记录,这就需要采用其他方法来生成全局唯一ID。在zookeeper中,它提供了一种以创建临时有序节点来获取到全局唯一ID,它能保证在整个分布式系统中的全局唯一性。下面我们通过一个简单的案例来说明如何利用zookeeper生成全局唯一
2021-01-21 11:01:23
11
原创 Zookeeper案例之监听配置中心
目录一、概述二、案例一、概述在分布式系统中,每个微服务可能都会有自己的配置文件信息,比如数据库连接、用户名和密码信息都配置在配置文件中,微服务读取配置文件,将配置文件信息存入缓存中。假设我们的配置信息发生变化时,我们还需要重新加载缓存,这比较麻烦。在zookeeper中,我们学习了watcher监听机制,利用监听机制可能轻松实现当配置信息发生变化时,应用程序第一时间发现配置变化并重新加载最新的配置信息。二、案例这里我们以一个简单的案例说明在zookeeper中如何利用watche
2021-01-21 10:47:46
8
原创 Zookeeper之事件监听机制
目录一、watcher概念二、watcher架构三、watcher特性四、watcher接口设计五、watcher监控之检查节点是否存在六、watcher监控之查看节点七、watcher监控之查看子节点八、总结一、watcher概念zookeeper提供了数据的发布/订阅功能,多个订阅者可同时监听某一特定主题对象,当该主题对象的自身状态发生变化时(例如节点内容改变、节点下的子节点列表改变等),会实时、主动通知所有订阅者。zookeeper采用了Watcher机制实
2021-01-20 14:14:47
32
原创 Zookeeper Java客户端搭建
目录一、概述二、环境搭建三、创建节点四、更新节点五、删除节点六、查看节点七、查看子节点八、总结一、概述Zookeeper 的Java客户端API使我们更轻松的去对zookeeper进行各种操作,如创建节点、修改节点值、删除节点等等。客户端应该遵循以下几个步骤:连接到zookeeper服务器。zookeeper服务器为客户端分配会话ID。 定期向服务器发送心跳。否则,zookeeper服务器将过期会话ID,客户端需要重新连接。 只要会话ID处于活动状态,就可
2021-01-20 11:47:18
17
原创 Zookeeper的ACL权限控制
目录一、概述二、acl权限各部分组成说明三、授权的相关命令四、world授权模式五、IP授权模式六、Auth授权模式七、Digest授权模式八、多种模式授权九、总结一、概述zookeeper类似linux文件系统,客户端可以创建数据节点、更新节点数据、删除节点等,那么我们如何做到节点的权限控制呢?回想一下linux文件的权限文件,由r(读)、w(写)、x(可执行)组成,同理,zookeeper中存在访问控制列表,也可以实现类似的权限控制。acl 权限控制,使用
2021-01-19 11:12:26
24
原创 Zookeeper 常用Shell命令总结
目录一、概述二、基础命令使用一、概述前面一篇文章我们介绍了Zookeeper中节点Znode的数据结构以及特性,本篇我们将总结一些常用的Zookeeper操作数据节点的shell命令。二、基础命令使用zookeeper 命令用于在 zookeeper 服务上执行操作。首先执行命令,打开新的 session 会话,进入终端。下面我们介绍一些基本常用命令的使用。进入bin目录启动zookeeper服务端和客户端:[root@localhost bin]# ./zkCli.sh
2021-01-19 10:03:11
15
原创 ZooKeeper 数据模型 Znode 结构特性详解
目录一、概述二、节点类型三、节点特性四、总结一、概述zookeeper的数据节点可以视为树状结构(或者目录),树中的各节点被称为znode(即zookeeper node),一个znode可以有多个子节点,可以说 zookeeper 中的所有存储的数据是由 znode 组成的,并以 key/value 形式存储数据。整体结构类似于 linux 文件系统的模式以树形结构存储,其中根路径以/开头。[zk: localhost:2181(CONNECTED) 0] ls /[a..
2021-01-18 16:53:29
24
原创 Linux下安装Zookeeper环境
一、概述ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。zookeeper是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用、且具有严格顺利访问控制能力的分布式协调存储服务。Zookeeper 官网地址:https://zookeeper.apache.org/ZooK
2021-01-17 21:10:21
17
原创 分布式事务各方案对比分析
一、概述通过前面很多篇文章的讲解和案例开发,相信大家对分布式事务整体有了比较清晰的认识,小伙伴们只要跟着一步一步实现,动动手画画流程图,应该可以对每种方案的实现步骤都有比较深刻的印象。本篇文章主要对比一下之前我们学过的2PC、TCC、可靠消息一致性、最大努力通知方案。二、分布式事务各方案对比分析下面我们分别总结一下各种方案的优缺点:2PC二阶段提交方案二阶段提交的最大缺点就是阻塞时间长,事务参与者RM在执行分支事务后需要等待事务管理者TM的决定,此时服务会阻塞并锁定资源。因此,2PC方案很
2021-01-08 19:59:00
52
原创 分布式事务综合案例分析
目录一、概述二、注册账号案例分析三、第三方支付案例分析四、总结一、概述前面我们已经学习了四种分布式事务解决方案,2PC、TCC、可靠消息最终一致性、最大努力通知,每种解决方案我们通过案例开发进行学习,本篇我们将举几个业务场景,来进行分布式事务解决方案可行性分析。二、注册账号案例分析采用用户、账号分离设计(这样设计的好处是,当用户的业务信息发生变化时,不会影响的认证、授权等系统机制),因此需要保证用户信息与账号信息的一致性。【a】涉及服务用户微服务:保存用户业务相关数据
2021-01-08 19:50:52
31
原创 SpringCloud + RocketMQ实现最大努力通知型事务
目录一、概述二、案例说明和数据库、表准备三、服务注册中心搭建四、搭建充值微服务五、搭建账户微服务六、测试七、总结一、概述前面一篇文章介绍了最大努力通知的整体流程和两种常见的实现方案,本篇文章我们将结合具体的案例【模拟账户充值】详细说明如何利用RocketMQ实现最大努力通知型事务。二、案例说明和数据库、表准备本案例有账户服务和充值服务两个微服务,其中账户服务的数据库是account数据库,其中有张三账户。充值服务的数据库使用recharge 数据库,记录了账户的充
2021-01-07 19:48:28
37
原创 分布式事务解决方案之最大努力通知
目录一、什么是最大努力通知?二、最大努力通知与可靠消息一致性有什么不同?三、最大努力通知解决方案四、总结一、什么是最大努力通知?最大努力通知也是解决分布式事务的一种方案,我们平常对接支付宝、微信、第三方支付系统时,通常都采用的是最大努力通知方案来保证数据最终一致性的。如上图,是一个账户充值的例子。交互流程大体如下:1、账户系统调用充值系统的接口进行充值; 2、充值系统跳转支付页面; 3、账户系统发起支付请求; 4、充值系统完成支付处理; 5、充值系统发送充
2021-01-03 19:42:09
60
原创 SpringCloud + RocketMQ实现可靠消息最终一致性事务
目录一、概述二、案例说明和数据库、表准备三、下载安装RocketMQ并启动四、搭建中国建设银行CCB微服务五、搭建中国工商银行ICBC微服务六、测试转账七、总结一、概述前面一篇文章介绍了RocketMQ实现可靠消息最终一致性事务的整体流程,大部分都是理论知识,本篇文章我们将结合前面我们使用过的【银行转账案例】详细说明如何利用RocketMQ实现可靠消息最终一致性事务。二、案例说明和数据库、表准备案例: 张三【中国建设银行】给李四【中国工商银行】转账说明:张三和
2020-12-31 20:37:12
52
原创 分布式事务解决方案之可靠消息最终一致性
目录一、什么是可靠消息最终一致性事务二、可靠消息最终一致性解决方案之本地消息表方案三、可靠消息最终一致性解决方案之RocketMQ事务消息方案四、可靠消息最终一致性解决方案之RocketMQ事务消息案例流程分析五、总结一、什么是可靠消息最终一致性事务可靠消息最终一致性方案是指当事务发起方执行完成本地事务后并发出一条消息,事务参与方(即消息消费方)一定能够接收消息并处理事务成功,此方案强调的是只要消息发给事务参与方,事务参与方无论如何都要消费掉,并且事务最终要达到一致。此方案是
2020-12-30 20:39:56
41
原创 SpringCloud整合Hmily实现TCC分布式事务案例详解
目录一、概述二、案例说明和数据库、表准备三、服务注册中心搭建四、搭建中国建设银行BBC微服务五、搭建中国工商银行ICBC微服务六、测试七、总结一、概述前面一篇文章,我们已经详细介绍了TCC是如何处理分布式事务,主要分别三个阶段:try:负责业务检查及资源预留; confirm:用来执行业务逻辑; cancel:实现一个与Try相反的操作既回滚操作;前面一篇文章,大部分都是理论相关知识,我们都知道理论必须结合实践才能加深对其理解,所以本篇文章我们将会以一个银行转账
2020-12-28 20:20:34
60
原创 分布式事务解决方案之TCC方案
目录一、概述二、TCC原理图三、TCC解决方案四、TCC方案常见问题五、案例说明六、总结一、概述TCC是Try、Confirm、Cancel三个词语的缩写,TCC协议采用预处理Try、确认Confirm、撤销Cancel三个阶段来处理分布式事务。其中:try:负责业务检查及资源预留; confirm:用来执行业务逻辑; cancel:实现一个与Try相反的操作既回滚操作;TM事务管理器首先发起所有的分支事务的try操作,任何一个分支事务的try操作执行失败,TM将会
2020-12-27 20:38:42
34
原创 Spring Cloud整合Seata实现2PC二阶段分布式事务
目录一、业务说明二、环境准备三、搭建Eureka服务注册中心四、搭建用户微服务五、搭建积分微服务六、测试七、Seata执行流程八、总结一、业务说明本篇文章将通过Seata第三方分布式事务框架,模拟新用户注册的同时,赠送用户积分过程。用户微服务,插入新用户信息,连接用户数据库;积分微服务,插入用户积分信息,连接积分数据库;上述两个步骤,要么一起成功,要么一起失败,必须是一个整体性的事务,由于跨JVM进程,所以必然需要处理分布式事务,否则可能存在数据不一致问题。
2020-12-26 10:20:55
48
原创 SpringBoot整合Atomikos实现2PC二阶段分布式事务
目录一、概述二、XA解决分布式事务三、总结一、概述前面一篇文章我们已经对2PC两阶段提交解决分布式事务方案进行了详细的介绍,并介绍了常见的两种方法:XA协议方案; Seata方案;本篇文章我们将总结使用Springboot整合多数据源,Mybatis+jta+automatic实现分布式的事务,其实是XA方案的一个实现。注意:这里的多数据源采用分包的方式。二、XA解决分布式事务本案例我们使用的是MySQL数据库,MySQL是支持XA协议的,数据库驱动中也有一个co
2020-12-23 10:59:13
38
原创 分布式事务解决方案之2PC(两阶段提交)介绍
一、概述前面一篇文章我们已经学习了分布式事务的基础理论,以理论为基础,针对不同的分布式场景业界常见的解决方案有2PC、TCC、可靠消息最终一致性、最大努力通知这几种。下面我们先回顾一下分布式事务基础知识:什么是分布式事务?分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。分布式事务的产生的原因? 数据库分库分表简单的说就是原来的一个数据库变成了多个数据库,应用程序一个
2020-12-11 20:08:03
90
原创 分布式事务之基础理论(CAP/BASE理论)篇
一、概述通过前面的学习,我们了解到了分布式事务的基础概念。与本地事务不同的是,分布式系统之所以叫分布式,是因为提供服务的各个节点分布在不同机器上,相互之间通过网络交互。不能因为有一点网络问题就导致整个系统无法提供服务,网络因素成为了分布式事务的考量标准之一。因此,分布式事务需要更进一步的理论支持,接下来,我们先来学习一下分布式事务的CAP理论。在讲解分布式事务控制解决方案之前需要先学习一些基础理论,通过理论知识指导我们确定分布式事务控制的目标,从而帮助我们理解每个解决方案。二、CAP理论CAP是
2020-12-09 10:40:17
55
原创 分布式事务之基础概念篇
目录一、什么是事务二、本地事务三、分布式事务四、分布式事务产生的场景五、总结一、什么是事务事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的工作单元(工作逻辑单元)。上面的概念稍稍有些抽象,不好理解,我们举个生活中的例子:假设张三给李四转账100元, "张三账户余额扣减100元"和"李四账户增加100元"就是一个典型的事务的例子。 "张三账户余额扣减100元"和"李四
2020-12-08 20:39:49
42
原创 分布式文件存储FastDFS之客户端API实现文件上传下载
目录一、概述二、文件上传、下载和删除实现三、总结一、概述前面几篇文章已经搭建好了FastDFS环境,在实际工作中,一般都是使用FastDFS客户端API来上传或者下载文件,本篇文章就将总结一下如何通过客户端API实现文件的上传和下载。FastDFS_Client源码Github地址:https://github.com/tobato/FastDFS_Client二、文件上传、下载和删除实现首先,我们创建一个springboot项目,项目目录结构大体如下:【a】引入F.
2020-12-01 15:36:52
74
原创 分布式文件存储FastDFS之配置Nginx模块
目录一、概述二、整合 fastdfs-nginx-module模块三、扩展模块执行流程一、概述前面一篇文章,我们已经通过安装Nginx实现了从浏览器访问FastDFS中的文件信息,在生产环境中,我们的存储服务storage一般都是有几台机器组成一个组,当上传一个文件后,同组存储服务器之间需要进行文件复制,可能存在同步延迟的问题。什么是同步延迟问题?举个例子:假设 Tracker 服务器将文件上传到了 192.168.179.133,上传成功后文件 ID已经返回给客户端。此时 F
2020-12-01 15:17:02
50
1
原创 分布式文件存储FastDFS之安装Nginx实现文件访问
目录一、概述二、安装Nginx一、概述前面一篇文章已经成功实现了文件上传到Storage中,但我们暂时还不能下载文件,需要安装Nginx作为服务器以支持Http方式访问文件。Nginx只需要安装到StorageServer所在的服务器即可,用于访问文件。二、安装Nginx【a】安装nginx所需环境安装gcc-c++、PCRE pcre-devel、zlib、OpenSSL由于上一篇文章已经安装过gcc-c++了,这里无需重复安装。[root@localho..
2020-11-30 17:10:34
60
原创 分布式文件存储FastDFS之环境搭建篇
目录一、概述二、下载安装 libfastcommon三、下载安装FastDFS四、配置FastDFS跟踪器(Tracker)五、配置 FastDFS 存储 (Storage)六、文件上传测试七、总结一、概述前面一篇文章我们对FastDFS进行了详细的介绍,相信小伙伴们对分布式文件存储有了进一步认识。本篇文章我们将在Linux环境下搭建一个FastDFS环境。二、下载安装 libfastcommonlibfastcommon是从 FastDFS 和 FastDHT
2020-11-30 16:56:35
57
原创 分布式文件存储FastDFS之基础知识篇
一、分布式文件系统分布式文件系统 (Distributed File System) 是一个软件/软件服务器,这个软件可以用来管理文件。但这个软件所管理的文件通常不是在一个服务器节点上,而是在多个服务器节点上,这些服务器节点通过网络相连构成一个庞大的文件存储服务器集群,这些服务器都用于存储文件资源,通过分布式文件系统来管理这些服务器上的文件。常见的分布式文件系统有:FastDFS、GFS、HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS等。二、FastDFS简介
2020-11-24 16:12:52
95
原创 【Shiro第九篇】SpringBoot + Shiro整合JWT
一、概述JWT,即Json Web Token,JWT作为当下比较流行的身份认证方式之一主要的特点是无状态,把信息放在客户端,服务器端不需要保存session,适合在分布式环境下使用。传统的Token认证方式:用户登录,服务器端返回Token,并将Token保存在服务器端,以后用户再次访问时,需携带Token,服务器端获取Token后,再去数据库中获取Token进行校验。 基于JWTToken认证方式:用户登录,服务器端给用户返回一个Token,但是服务器端不保存,以后用户再次访问时,需要携带To
2020-11-21 17:07:01
91
原创 【Shiro第八篇】SpringBoot + Shiro使用Shiro标签
一、概述前面的文章总结了Shiro如何实现用户授权功能,并且当用户访问未授权的资源时,会跳转到未授权页面,在实际项目中,一般如果当前用户登录后,针对某个资源,如果没有授权,那么这些资源压根就不应该展示出来,所以Shiro提供了标签用于控制这些资源的显示隐藏。实际上Thymeleaf官方并没有提供Shiro的标签,我们需要引入第三方实现thymeleaf-extras-shiro。接下来就通过案例说明Thymeleaf整合Shiro标签实现资源的控制。二、Shiro标签的使用【a】引入thym
2020-11-21 11:50:59
125
原创 【Shiro第七篇】SpringBoot + Shiro实现会话管理
一、概述Shiro 提供了完整的企业级会话管理功能,不依赖于底层容器(如 web 容器 tomcat),不管 JavaSE 还是 JavaEE 环境都可以使用,提供了会话管理、会话事件监听、会话存储 / 持久化、容器无关的集群、失效 / 过期支持、对 Web 的透明支持、SSO 单点登录的支持等特性,即直接使用 Shiro 的会话管理可以直接替换如 Web 容器的会话管理。二、重要概念会话所谓会话,即用户访问应用时保持的连接关系,在多次交互中应用能够识别出当前访问的用户是谁,且可以在多次交互中
2020-11-21 10:45:19
131
原创 【Shiro第六篇】SpringBoot + Shiro集成缓存功能
一、概述Shiro 提供了类似于 Spring 的 Cache 抽象,即 Shiro 本身不实现 Cache,但是对 Cache 进行了又抽象,方便更换不同的底层 Cache 实现。Shiro 提供的 Cache 接口:public interface Cache<K, V> { //根据Key获取缓存中的值 public V get(K key) throws CacheException; //往缓存中放入key-value,返回缓存中之前的值
2020-11-20 21:31:05
65
原创 【Shiro第五篇】SpringBoot + Shiro实现用户授权功能
一、概述在前面一篇文章:SpringBoot + Shiro实现用户身份认证功能中,我们的自定义Realm继承了AuthenticatingRealm,并实现了doGetAuthenticationInfo()方法完成了用户认证操作,但是AuthenticatingRealm仅仅只是提供了用户认证的功能,在实际工作中,一般不使用AuthenticatingRealm抽象类,通常我们都使用AuthorizingRealm抽象类:public abstract class AuthorizingR
2020-11-20 10:12:51
209
原创 【Shiro第四篇】SpringBoot + Shiro实现记住登录状态
一、概述Shiro 提供了记住我(RememberMe)的功能,比如访问如淘宝等一些网站时,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问,基本流程如下:首先在登录页面选中 RememberMe 然后登录成功;如果是浏览器登录,一般会把 RememberMe 的 Cookie 写到客户端并保存下来; 关闭浏览器再重新打开;会发现浏览器还是记住你的; 访问一般的网页服务器端还是知道你是谁,且能正常访问; 但是比如我们访问淘宝时,如果要查看我的订单或进行支付时,此时还是需要
2020-11-20 09:09:47
110
原创 【Shiro第三篇】SpringBoot + Shiro实现用户认证(密码加密)
一、概述前面一篇文章我们通过示例详细说明了Shiro如何进行用户身份认证的,但是我们是比对的明文密码,本篇文章将总结一下Shiro的加密功能,实现密文的比对。如果还没有阅读前面一篇Shiro实现用户身份认证的,可以通过下面的链接进行阅读:https://weishihuai.blog.csdn.net/article/details/109779347二、调整Shiro全局配置类【a】Shiro全局配置类中注入HashedCredentialsMatcher密码匹配凭证管理器/**
2020-11-19 14:24:33
62
原创 【Shiro第二篇】SpringBoot + Shiro实现用户身份认证功能
一、概述前面一篇文章,我们已经总结了Shiro相关的一些概念以及架构知识,相信小伙伴们对Shiro安全框架都有了一定的认识。本篇文章我们将通过示例详细说明在日常工作中常见的-----用户身份认证功能。什么是身份认证呢,简单理解,就是在应用中谁能证明他就是他本人。一般提供如他们的身份 ID 一些标识信息来表明他就是他本人,如提供身份证,用户名 / 密码来证明。在 shiro 中,用户需要提供principals(身份)和credentials(证明)给 shiro,从而应用能验证用户身份:...
2020-11-18 20:04:10
133
原创 【Shiro第一篇】 Shiro权限框架简介
一、Shiro概述Apache Shiro 是一个强大易用的 Java 安全框架,提供了认证、授权、加密和会话管理等功能,对于任何一个应用程序,Shiro 都可以提供全面的安全管理服务。并且相对于其他安全框架,如Spring Security等,Shiro 要简单的多。目前,使用 Apache Shiro 的人越来越多,因为它相当简单,对比 Spring Security,可能没有 Spring Security 做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的 Shir
2020-11-18 20:02:43
54
原创 Redis为什么这么快?
一、Redis为什么这么快?Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由C语言编写,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。以下几点造就了Redis非常快的特点:单线程不用处理上下文的切换,cpu利用率会比多线程高;采用单线程避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU。不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为出现死锁而导致的性能消耗。数据结构简单,操作节省时间;数据结构简单,对数据操作也
2020-11-18 09:41:03
76
原创 数据结构之红黑树插入案例详解
一、概述前面一篇文章介绍了红黑树插入的几种情况以及怎么自平衡操作,但是理论知识比较多,不好理解,今天我们用一个简单的示例总结一下前面的一些自平衡操作,包括变色、左旋、右旋等。二、红黑树插入案例【a】首先我们先准备一颗已经平衡的红黑树,如下图:
2020-11-17 20:19:58
71
原创 数据结构之红黑树插入详解
一、概述红黑树是一颗二叉平衡树,并且查找不会破坏树的平衡,所以查找跟二叉平衡树的查找没有什么区别,可以看前面的文章进行学习,这里不再过多阐述。本节我们主要总结红黑树插入相关的知识。二、红黑树插入红黑树的插入包含两个步骤:在树中查找插入的位置;插入后自平衡;查找流程:从根节点开始查找;若根节点为空,那么插入节点作为根节点,结束;若根节点不为空,那么把根节点作为当前节点;若当前节点为null,返回当前节点的父节点,结束;若当前节点key等于查找key,那么该key所在节点就是插入节点
2020-11-16 20:44:25
87
原创 数据库索引是什么,它的作用是什么?
一、概述数据库索引是为了提高查询速度而对表字段附加的一种标识。简单来说,索引其实是一种数据结构。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。首先我们需要明白为什么索引会提高查询速度,数据库在执行一条SQL语句的时候,默认扫描方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历
2020-11-14 21:02:29
174
原创 数据结构之红黑树简介
一、红黑树定义红黑树是二叉查找树,二叉查找树这一数据结构并不难,而红黑树之所以难是难在它是自平衡的二叉查找树,在进行插入和删除等可能会破坏树的平衡的操作时,需要重新自处理达到平衡状态。红黑树是一种含有红色和黑色节点并能自平衡的二叉查找树,红黑树和其他二叉查找树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的性质,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的:它可以在 O(log n) 时间内做查找,插入和删除,这里的 n 是树中元素的
2020-11-14 08:26:47
80
zipkin-server jar.zip
2020-08-29
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人 TA的粉丝