- 博客(27)
- 资源 (2)
- 收藏
- 关注
原创 Pyecharts可视化插件
前言安装Python3 下载地址设置环境变量 C:\Users\xxx\AppData\Local\Programs\Python\Python39
2021-06-02 14:14:25
242
原创 高可用系统设计
为什么使用分布式? 分布式系统的开发维护成本远远高于单体应用,为什么我们还要使用分布式架构?单体应用分布式开发逻辑简单需要考虑分布式带来的问题性能单机性能有限可无限扩容部署全部编译,耗时较长资源隔离,水平扩展 分布式系统带来的问题:分布式事务的实现难度要远高于单机事务;分布式架构提供的高可用需要集群达到一定数量,例如zookeeper的高可用需要集群有三台机器才能容忍一台机器异常;分布式架构的并发问题处理方式更为复杂。常规方法论高性能
2021-05-26 16:39:35
181
1
原创 Redis与Kafka作为消息队列对比
前言 高可用需要解决的问题主要有单点故障和大流量。Redis部署架构实现备注单点部署单点启动可能造成单点故障主从复制Slave主动请求,通过RDB同步流量大导致RDB文件过大,同步慢Codis代理模式+主从复制分桶1024个,不支持KEYSRedis Cluster去中心化,客户端分片分桶16384,不支持SELECT,官方出品Codis架构 Codis-HA作为协调者也可能出现单点故障,同样需要主从部署。协调者会观测代理和集群的状
2021-04-30 11:18:31
1524
2
原创 分布式系统的挑战
分布式系统的挑战 尽管之前已经聊了很多分布式系统的问题和处理方式,例如节点失效,主从复制滞后,以及事务并发控制。实际上分布式系统带来的问题和挑战远远不止之前讨论的一些,本书的作者一直在极力的描述软件系统各个环节的不可靠性,故障是一定会发生。我们的目标是构建可靠性的软件,本书推崇的方式是通过软件控制来保证系统在各种出错的情况下仍可以完成预定工作。故障与部分失效 单个节点会以确定性的方式运行:要么运行成功,要么运行失败,这涉及到一个计算机设计非常谨慎的选择:如果发生了某个系统内部错误,我们宁愿使计算机
2021-04-26 15:17:54
965
原创 数据密集型系统的基石
前言 想用一篇文章去概括一整本是一件很困难的事情,写读书观感的原因还是因为想把自己能学习吸收的知识记录下来,反复琢磨,再与原书对照温故而知新。全书脉络第一部分 数据密集型系统的基石第一章 可靠性、可扩展性与可维护性第二章 数据模型与查询语言第三章 存储引擎与检索第四章 数据序列化与演化第二部分 分布式系统第五章 数据复制第六章 数据分区第七章 事务第八章 分布式系统的挑战第九章 一致性第三部分 异构数据库第十章 批处理系统第十一章 流处理系统第十二章 数据系统
2021-04-26 11:34:48
594
原创 Netty(一)基础知识
Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。BIO,NIO,AIO阻塞和非阻塞同步和异步BIO 同步阻塞IO它是基于流模型实现的,交互的方式是同步、阻塞方式,也就是说在读入输入流或者输出流时,在读写动作完成之前,线程会一直阻塞在那里,它们之间的调用时可靠的线性顺序。它的有点就是代码比较简单、直观;缺点就是 IO 的效率和扩展性很低,容易成为应用性能瓶颈。NIO 同步非阻塞IONIO提供了 Channel、Selector、B.
2021-04-02 17:18:14
227
原创 最短击中气球路径
问题假设有不同颜色的气球用数字标识 n = 5, [1,2,3,4,5]玩家可以用枪打破气球序列为 m = 11,[1,2,2,3,4,5,2,2,0,2,1],0为未击中如果连续击中所有不同颜色气球,可以获得奖品,求最短获奖路径示例m = 11,n = 5,arr = [1,2,2,3,4,5,2,1,0,2,1]有五种气球,玩家一共开了11枪有效序列[1,2,2,3,4,5]长度为6有效序列[3,4,5,2,1]长度为1如果没有有效序列则返回-1思路找到一个有效序列,确定移动
2021-03-31 11:57:53
136
原创 Innodb事务实现
SQL执行逻辑引自《极客时间 mysql45讲》事务Innodb引擎引入事务,可以认为事务是一组SQL语句的序列,事务具有ACID特性。ACID原子性一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作。持久性一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中。隔离性在并发环境中,并发的事务时相互隔离的,一个事务的执行不能不被其他事务干扰。一致性一个事务在执行之前和执行之后,数据库都必须处于一致性状态。快照读InnoDB在每行数
2021-03-30 16:34:20
255
原创 算法随笔(六)
层序遍历二叉树 public int[] levelOrder(TreeNode root) { if(root == null) return new int[0]; Queue<TreeNode> queue = new LinkedList(); List<Integer> list = new ArrayList(); queue.add(root); while(!queue.isEmpty(
2021-03-28 15:01:25
103
原创 面试知识点整理
进程间通信方式管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进
2021-03-27 10:35:01
244
原创 算法随笔 (五)
判断平衡二叉树 def isBalanced(self, root: TreeNode) -> bool: def recur(root): if not root: return 0; # 左右子树不平衡直接返回 -1 left = recur(root.left) if left == -1 :return -1 right = recur(root.ri
2021-03-26 19:48:40
117
原创 算法随笔(四)
最大不重复子串动态规划 记录字母前一次出现位置 dp[i] = temp + 1 if temp < i - front else i - front def lengthOfLongestSubstring(self, s: str) -> int: index = {} temp = res = 0 for i in range(len(s)): front = index.get(s[i],-1)
2021-03-25 19:18:51
154
1
原创 算法随笔(三)
买卖股票的最佳时机买卖一次动态规划,记录每一次买卖的值 def maxProfit(self, prices: List[int]) -> int: first_buy = - prices[0]; frist_sell = 0; for i in range(1,len(prices)): #第一次购买价值 first_buy = max(first_buy,-prices[i]) #第一次卖的价值 fr
2021-03-24 11:26:08
75
原创 算法随笔(二)
剪绳子dp方程 max(dp[i],dp[i-j]*dp[j],dp[i-j]*j,(i-j)*dp[j],(i-j)*j) public int cuttingRope(int n) { int[] dp = new int[n+1]; dp[1] = 1; dp[2] = 1; for(int i = 3;i <= n;i++){ for(int j = 1;j <= i/2;j++){
2021-03-23 16:46:25
96
原创 算法随笔(一)
翻转链表 public ListNode reverseList(ListNode head) { ListNode pre = null; ListNode iterator = head; while(iterator != null){ //记录下一个值 ListNode next = iterator.next; //后继改前驱 iterator.next
2021-03-22 11:14:49
147
原创 Flume
前言Apache Flume 是一个分布式、高可靠、高可用的用来收集、聚合、转移不同来源的大量日志数据到中央数据仓库的工具。Flume具有强大的功能和精简配置化实现功能的使用方式。中文文档地址EventEvent是Flume定义的一个数据流传输的最小单元。AgentAgent就是一个Flume的实例,本质是一个JVM进程,该JVM进程控制Event数据流从外部日志生产者那里传输到目的地(或者是下一个Agent)。SourceSource消耗由外部传递给它的Event。外部以Flume Sou
2021-03-01 19:57:12
195
1
原创 关于风控的一些思考
前言风控系统,顾名思义风险控制,风险控制有两个主体,用户和系统。用户包括用户身份信息(userId,手机号,邮箱,设备指纹,IP)用户行为(点击,刷新,停留)通过用户身份和行为以及实际的场景可对用户行为进行建模分析,对于高危用户行为预定策略处置。另外,各行业系统的风险有所不同,关注的用户行为和处理策略也应该根据实际情况具体分析。...
2021-02-24 18:39:22
399
原创 《持续交付》观感
前言作为一个软件从业者,我们的工作就是用最快的速度将用户的点子转换成软件交付。从两个实际问题入手一个复杂项目新特性的部署需要多久?在你的公司里,仅涉及一行代码的改动需要花多长时间才能部署上线?你是处理方式是否可重复和可靠?从“决定某种修改“到“修改部署上线”这段时间被称为周期时间,是项目的一个重要的度量指标。交付的问题人力资源是昂贵而有价值的,应该集中人力资源来生产用户所需要的的新功能,尽可能快速交付这些新功能,而不是做枯燥且易出错的工作。问题手工部署软件开发完成才向类生产环境
2021-02-19 15:26:38
107
原创 外观模式
前言从应用场景出发,如果一个方法由多个不同的子方法组成,且这个方法的组成结构可能会发生变化,这个时候就需要使用外观模式。例如,从多个存储获取配置文件信息,或者是定时的异步补偿策略等等等等,几乎在所有场景都可以使用外观模式来屏蔽底层的差异。简例假设在一个商店里有Tom和Jerry两个商贩,每年年底都商店要求员工做年底总结,看下各位的KPL。定义Tom的KPIpublic class Tom { public void KPI(){ System.out.println("今
2021-02-19 11:49:11
163
1
原创 Spring Starter组件开发
前言在我开始接触JAVA开发时候,Spring生态已经发展比较完善。从繁琐的XML配置转变约定大于设计的配置方式,Spring没有改变简化企业化开发的初衷,并一直向着这个目标努力。spring核心思想(1)基于POJO的轻量级和最小侵入性编程。(2)通过依赖注入和面向接口实现松耦合。(3)基于切面和惯性进行声明式编程。(4)通过切面和模板减少样板式代码。spring实现方式(1)Bean(BOP)(2)依赖注入(DI)(3)面向切面(AOP)Spring组件Sring的易用性让企业开
2021-02-04 16:52:52
381
1
原创 JAVA线程交替打印数字
问题两个线程交替输出0到9代码public static void main(String[] args) { ReentrantLock reentrantLock = new ReentrantLock(); Condition condition1 = reentrantLock.newCondition(); Condition condition2 = reentrantLock.newCondition(); new Thre
2021-02-03 20:23:58
327
原创 JAVA读取Excel
前言需求:完成10万+记录行Excel上传分析与数据落库。问题:后台读取Excel方式,JVM堆空间是否足够使用Apache Poi完成文档解析 文档地址过程引入pom文件,注意版本号的一致 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.0</version>
2021-02-02 20:00:41
159
3
原创 数据库事务
事务基本概念事务是数据库逻辑执行的基本单位。什么是事务?事务可以具象为一组连续的操作,比如生成订单和减库存、消费和账户扣费。事务有什么特性?原子性(Atomicity) 事务中的任何操作都是不可分割的。独立性(Isolation) 事务的独立性,事务执行过程中互相不影响。另外,事务的特性与一致性(Consistency) 、持久性(Durability)共同构成关系型数据库的基本属性。显式事务BEGIN <SQL语句>COMMIT [ROLLBACK]通常事务以BEG
2021-01-26 20:47:05
2176
原创 JVM内存模型
一大堆的题外话无论是程序员,学生,或者是编程爱好者,也不管我们是初学编程还是想掌握一门新的编程语言,我们要做的基本都是先在电脑上安装开发环境,然后编程在控制台上输出“hello world”。但是一个程序,到底是如何运行起来的呢?首先我们需要一台计算机,为什么不是一个鞋盒子而是一个计算机?什么样的设备可以被称作计算机?它到底是用来做什么的?这和我们说的JVM又有什么关系?计算机是人类发明的辅助计算的工具,帮助人类解决运算问题。我们这里把计算机比作一个人,来分解一下你的求助过程。第一步,告诉他问题是什么
2021-01-23 16:54:21
514
原创 给2021年的自己
前言今年是我从事开发的第三个年头了,在这之前自建过很多博客,但是总因为各种各样的原因荒废了,每年都在重复造轮子,索性还是用别人的平台更为方便。2020年是坎坷的一年,疫情让今年的生活和工作都多了一些磕磕绊绊;2020年是奋斗的一年,年中我毅然决定离开自己的舒适区来到了上海并开始了真正意义上的互联网开发;2020年也是收获的一年,通过一群志同道合的同事的共同努力,我们完成了亿级流量系统的重构,这也让我对未来努力的方向认识的更为清晰。贴一张个人的技术结构图,还有许多待完善的地方。成长需要体系化思考和阶
2021-01-20 21:19:42
185
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人