摘要:问题:给定一个无序数组,这个数组中只包含0,1,2三种数字,对这个数组进行排序。 解题思路:要充分利用题给的条件:只含有0或1或2可以这样想:0应该往前放,1应该不变,2应该往后扔。 定义三个变量begin指向首下标,end指向尾下标,current最开始指向首下标。 当current对应数组值是0
阅读全文
摘要:删除策略 Redis的数据过期删除策略采用:定时删除和惰性删除两种策略 定时删除策略:Redis启用一个定时器监视所有的key,判断key是否过期,过期的话就删除。这种策略可以保证过期的key最终被删除,但是也存在严重的缺点:每次遍历都遍历内存中所有的key,非常消耗CPU资源,并且当key已过期,
阅读全文
摘要:FastLeaderElection 目前有5台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5;按编号依次启动,它们的选举流程如下: 服务器1启动,给自己投票,然后发投票信息,由于其他机器还没有启动所以它收不到任何反馈信息,服务器1的状态一直属于Looking。 服务器2启动,给自
阅读全文
摘要:ZAB协议包含两种模式: 崩溃恢复模式 消息广播模式 崩溃恢复模式: Zookeeper集群服务刚刚启动 Leader宕机 Leader重启 网络故障导致不存在过半服务器与Leader保持正常通信 当进入崩溃恢复模式时,所有服务器参与重新选举,首先选举产生新的Leader,然后集群中Follower
阅读全文
摘要:zookeeper不是为高可用设计的 由于要跨机房容灾,很多系统实际上是需要跨机房部署的。出于性价比的考虑,通常会让多个机房同时工作,而不会搭建N倍冗余。也就是说单个机房肯定撑不住全流量。由于zookeeper集群只能有一个master,因此一旦机房之间出现故障,zookeeper master就只
阅读全文
摘要:基本思想 本文以从小到大排序的方式进行讲解。 快速排序的基本思想是任取待排序序列的一个元素作为中心元素(可以用第一个,最后一个,中间的任意一个),称之为枢轴元素,pivot。 1)将数组中所有比pivot小的放左边; 2)将数组中所有比pivot大的放右边; 3)形成左右两个子表 4)然后对左右两个
阅读全文
摘要:RocketMQ和Kafka区别 1)适用场景 Kafka适合日志处理 RocketMQ适合业务处理 结论:平手,根据具体业务定夺 2)性能 kafka单机写入TPS号称在百万条/秒; RocketMQ大约在10万条/秒; 结论:追求性能的话,kafka单机性能更高 3)可靠性 RocketMQ支持
阅读全文
摘要:缓存常见问题 缓存击穿 概念:对于一些设置了过期的key,如果这个key可能会在某些时间点被超高并发地访问,是一个热点数据 原因:缓存在某个时间点过期的时候,恰好在这个时间点对这个key有大量的并发请求过来,该key没有命中,大量请求穿透到数据库服务器。 解决方案: 1)使用互斥锁;在缓存失效的时候
阅读全文
摘要:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。 示例 1: 输入:n = 2 输出:2 示例 2: 输入:n = 7 输出:21 示例 3: 输
阅读全文
摘要:概括:缓存是通过牺牲强一致性来提高性能的。 这个是由CAP理论决定的。缓存系统适用的场景就是非强一致性的场景,它属于CAP中的AP。 强一致性还是弱一致性? CAP理论,指的是在一个分布式系统中,只能满足其中两项,三者不可兼得。 CAP理论作为分布式系统的基础理论,它描述的是一个分布式系统在以下三个
阅读全文
摘要:Redis的双写问题 双写的情况下,是先操作数据库还是先操作缓存呢? 在Cache-Aside缓存模式中,有些小伙伴会有疑问,在写入请求的时候,为什么是先操作数据库呢?为什么不先操作缓存呢? 假设有A、B两个请求,请求A做更新操作,请求B做查询读操作。 A、B两个流程如下: 线程A发起一个写操作,第
阅读全文
摘要:谈谈一致性 一致性是指数据保持一致,在分布式系统中,可以理解为多个节点中的数据是一致的。 强一致性:用户写入什么数据,就可以读出什么数据。这种一致性最符合用户的直觉,用户体验好,但实现起来往往对系统的性能影响最大。 弱一致性:在用户写入系统成功后,不承诺可以立即读出写入的数据,也不承诺多久数据可以达
阅读全文
摘要:写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加
阅读全文
摘要:题目:给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 [1 3 -1] -3 5 3 6 7 3 1 [3 -1
阅读全文
摘要:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。 示例: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0)
阅读全文
摘要:后微服务时代(Cloud Native) 从软件层面独力应对微服务架构问题,发展到软、硬一体,合力应对架构问题的时代,此即为“后微服务时代”。 上节提到的分布式架构中出现的问题,如注册发现、跟踪治理、负载均衡、传输通信等,其实在 SOA 时代甚至可以说从原始分布式时代起就已经存在了,只要是分布式架构
阅读全文
摘要:微服务架构(Microservices) 微服务是一种通过多个小型服务组合来构建单个应用的架构风格,这些服务围绕业务能力而非特定的技术标准来构建。各个服务可以采用不同的编程语言,不同的数据存储技术,运行在不同的进程之中。服务采取轻量级的通信机制和自动化的部署机制实现通信与运维。 “微服务”这个技术名
阅读全文
摘要:SOA架构 面向服务的架构是一次具体地、系统性地成功解决分布式服务主要问题的架构模式 为了对大型的单体系统进行拆分,让每一个子系统都能独立地部署、运行、更新,开发者们曾经尝试过多种方案,这里列举以下三种较有代表性的架构模式,具体如下。 烟囱式架构 : 信息烟囱又名信息孤岛(Information I
阅读全文
摘要:单体架构(Monolithic) “单体”只是表明系统中主要的过程调用都是进程内调用,不会发生进程间通信,仅此而已。 单体架构是今天绝大多数软件开发者都学习、实践过的一种软件架构,许多介绍微服务的书籍和技术资料中也常把这种架构风格的应用称作“巨石系统”(Monolithic Application)
阅读全文
摘要:保持接口与实现的简单性,比系统的任何其他属性,包括准确性、一致性和完整性,都来得更加重要。 Richard P. Gabriel 可能与绝大多数人心中的认知会有差异,“使用多个独立的分布式服务共同构建一个更大型系统”的设想与实际尝试,反而要比今天大家所了解的大型单体系统出现的时间更早。 在 20 世
阅读全文
摘要:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 解题思路: 考虑遍历链表,并在访问各节点时修改 next 引用指向package Algriothm; public cl
阅读全文
摘要:RocketMQ消息发送 RocketMQ发送普通消息有三种方式: 可靠同步发送:发送者向MQ执行发送消息API时,同步等待,直到消息服务器返回发送结果。 可靠异步发送:发送者向MQ执行发送消息API时,指定消息发送成功后的回调函数,然后调用消息发送API后,立即返回,消息发送者线程不阻塞,直到运行
阅读全文
摘要:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例1: 输入: ["CQueue","appendTail","delet
阅读全文
摘要:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例: 输入:head = [1,3,2] 输出:[2,3,1] 解题思路: 首先这个链表的长度第一时间无法确认,所以无法直接使用下标的方式创建数组 其次需要从尾到头反过来输出数组,想到使用栈的【先入后出】的特点,所以使用栈作为中
阅读全文
摘要:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示例: 输入:s = "We are happy." 输出:"We%20are%20happy." 解题思路: 字符串由字符组成,首先将字符串转化成字符数组,然后遍历字符数组。 如果需要将空格替换成其他字符串,就不能使用数组的下标直接替换
阅读全文
摘要:前言 数据结构是为实现堆计算机数据有效使用的各种数据组织形式,服务于各类计算机操作。不同的数据结构具有各自对应的适用场景,目的是降低各种算法计算的时间与空间复杂度,达到最佳的任务执行效率。 常见的数据结构包括:线性数据结构、非线性数据结构。具体为:数组、链表、栈、队列、树、图、散列表、堆 数组 数组
阅读全文
摘要:概念定义 输入空间:存储输入数据所需的空间大小 暂存空间:算法运行过程中,存储所有中间变量和对象等数据所需的空间大小 输出空间:算法运行返回时,存储输出数据所需的空间大小 通常情况下,空间复杂度是指在输入数据大小为N时,算法运行所使用的【暂存空间】 + 【输出空间】的总体大小 而根据不同来源,算法使
阅读全文
摘要:基础概念 分布式服务SOA架构体系中会有服务注册中心,分布式服务SOA的注册中心主要提供服务调用的解析服务,指引服务调用方(消费者)找到对应的服务提供者,完成网络通信。 架构设计 消息中间件的设计思路一般基于主题的订阅发布机制,消息生产者(Producer)发送某一主题的消息到消息服务器,消息服务器
阅读全文
摘要:数据结构与算法一览: Data Structure 数据结构 Algorithm 算法 Array 数组 General Coding 一般编码 Stack / Queue 栈 / 队列 In-order / Pre-order / Post-order traversal 前序 / 中序 / 后序
阅读全文
摘要:知识分类 学习的第一步,就是知识的获取途径,如果没有途径 ,你将无法进入学习过程。目前学习的途径有很多,我们可以通过线上的视频、博客,线下可以通过书籍和源码分析; 同时对知识进行分类也很重要,当然书籍都会对知识进行分类。 知识脉络 捋清楚知识所涉及的关键点,能将知识点用一张图进行绘制出来;如果能够将
阅读全文
摘要:设计理念 RocketMQ的设计是基于主题的发布与订阅模式,核心功能包括:消息发送、消息存储、消息消费; 整体设计有两个目标:简单与高性能,具体体现如下三个方面: 首先,引入Nameserver作为协调组件,与业界普通使用Zookeeper作为协调组件不同,RocketMQ通过自研Nameserve
阅读全文