技术点梳理
文章平均质量分 68
土豆rose
这个作者很懒,什么都没留下…
展开
-
分布式事务相关
1、两阶段提交方案-XA常见的场景:1个系统操作多个数据库 基于spring+JTA就可以搞定但是不合法,一个系统跨多个库是不合法的。。。2、TCC方案-三阶段(写大量跟业务相关的代码 ,跟钱打交道的一般用,因为强一致),但是代码比较难维护比如订单先插入一条流水,先查询库存服务,然后再调用库存扣减服务,再查询订单服务,如果符合库存,就认为成功,如果不符合,就调用库存回滚操作。3、本地消息表(依赖与本地mysql表)(1)A系统在自己本地操作业务同时,插入.原创 2021-11-19 11:31:10 · 825 阅读 · 0 评论 -
设计模式相关
DDD领域驱动:(理论上就是把OOP应用于业务模型 最近再看一本书:Eric Evans <<领域驱动设计>>)DDD第一原则:将数据和操作结合DDD第二原则:界限上下文 这是将“单一职责”应用于我们的领域模型实现:1、使用通用语言:类、方法、字段的命名 要符合业务,使用业务语言命名,之后再客户或者团队交流更加流畅2、理解业务:例如做一个理财系统,要亲自去和卖理财产品的人聊聊或者买个理财产品,这样数据库中那些对你毫无意义的字段才变得有血有肉。充血.原创 2021-11-19 11:30:33 · 190 阅读 · 0 评论 -
限流算法相关
1、计数器算法在一定时间内,对处理的请求数进行计数,每次到达时间临界点则计数器清零。在一定时间间隔内,若计数器数字超限,则进行限流缺点:该算法的问题是,在两端临界点附加可能出现两倍的流速。2、滑动窗口算法基于计数器算法,把时间间隔分片。例如服务限流每秒处理10000个请求,把1秒分为10个窗口。每100毫秒移动一次,内存中保留每次的请求次数。每次移动判断一下总次数是否超出10000限制。当滑动窗口的格子划分的越多,滑动窗口的滚动就越平滑,限流的统计就会越精确。滑动窗口算法原创 2021-11-19 11:29:16 · 212 阅读 · 0 评论 -
分布式id生成相关
1 、利用全局的一张表 但是并发很大就有瓶颈2、利用uuid 不适合做主键 太长3、利用 业务编号+时间戳 但是高并发也会重复4、snowflake算法 twitter开源的 (64位的long型变量来保存)第一段 1bit:不用,因为我们生成的都是正数 所以统一是0第二段:41bit:标识的是时间戳 单位是毫秒 41bit可以标识的数字多达2的41次方-1 也就是69年的时间第三段:10bit 记录机器id 标识服务最多可以部署在2的10次方台机器上 也就是1024台...原创 2021-11-19 11:28:27 · 636 阅读 · 0 评论 -
HashMap相关
DK8中的HashMap与JDK7的HashMap有什么不一样?JDK8中新增了红黑树,JDK8是通过数组+链表+红黑树来实现的 JDK7中链表的插入是用的头插法,而JDK8中则改为了尾插法(1.7头插法实际上是插入效率更高,但是他会形成圆环,,增加了碰撞的几率,所以8后改成了尾插法,虽然插入效率上有所降低,但是可以忽略不记,而且8后也采取了红黑树,插入和查询效率有所提高,,) JDK8中数组扩容的条件也发了变化,只会判断是否当前元素个数是否查过了阈值,而不再判断当前put进来的元素对应的数组下原创 2021-11-19 11:27:59 · 126 阅读 · 0 评论 -
Dubbo相关
看过dubbo源码?1、服务调用过程最外层是Mock逻辑,调用前,调用后进行Mock从服务目录中,根据当前调用的方法和路由链,筛选出部分服务Invoker(DubboInvoker) 对服务Invoker进行负载均衡,选出一个服务Invoker 执行Filter链 AsyncToSyncInvoker完成异步转同步,因为DubboInvoker的执行是异步非阻塞的,所以如果是同步调用,则会在此处阻塞,知道拿到响应结果 DubboInvoker开始异步非阻塞的调用HeaderExcha原创 2021-11-19 11:26:33 · 1239 阅读 · 0 评论 -
Elastic Search相关
es 怎么解决查询慢的问题?1、只存关键数据,其他数据存入hbase,查询的时候根据id 查询一批数据,然后根据id的范围去hbase中查询,效率会相当高。2、因为es有一个file system cache ,第一次查询数据时,其实是去磁盘读,然后刷进缓存的,所以缓存要存热点数据,内存容量有限,,我们可以先预热一下,比如后台有一个刷到缓存的数据进程,,这样每次查询都会去缓存中查询。。倒排索引?字典表(内存中 hash表形式存储)倒排列表 磁盘中以跳表的形式存储(链表+索引的原创 2021-11-19 11:24:57 · 1398 阅读 · 0 评论 -
分布式锁相关
Redis锁实现:加锁操作:set key value nx px 3000 如果成功上锁成功,如果不成功就每间隔1s 尝试去拿这把锁释放锁操作: lua脚本:比较当前value是否与redis中value一致,一致才删除。。存在的问题:1、redis宕机了,,或者主从切换数据丢了,然后锁就失效了。2、一旦一个线程死了,如果没有设置合理的过期时间,那么就释放不了这把锁了。Red-Lock 算法:这个场景假设有一个redis cluster 有5个r...原创 2021-11-19 11:23:46 · 618 阅读 · 0 评论 -
大数据相关
一.hadoop是什么Hadoop被公认是一套行业大数据标准开源软件,在分布式环境下提供了海量数据的处理能力。几乎所有主流厂商都围绕Hadoop开发工具、开源软件、商业化工具和技术服务。今年大型IT公司,如EMC、Microsoft、Intel、Teradata、Cisco都明显增加了Hadoop方面的投入。二 .hadoop能干什么hadoop擅长日志分析,facebook就用Hive来进行日志分析,2009年时facebook就有非编程人员的30%的人使用HiveQL进行数据分析;淘宝搜索中的自原创 2021-11-19 11:23:09 · 83 阅读 · 0 评论 -
mq相关知识
为什么使用mq?解耦、异步、消峰mq怎么保证高可用?比如kafaka高可用:一个topic有多个partition分布在不同的机器上,类似于分片,每个partition对应有至少两个副本纵向部署在不同机器上,分布主从。mq 选型问题?activemq:万级请求,很成熟,但社区不活跃,不是分布式rabbitmq:延时很低,管理界面强大,社区活跃,不是分布式rocketmq:单机吞吐量十万级,阿里的可靠,java的源码kafaka:单机十万级,分布原创 2021-11-19 11:19:51 · 92 阅读 · 0 评论 -
网络知识点
为什么会发生TCP粘包、拆包?发生TCP粘包、拆包主要是由于下面一些原因:1. 应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。2.应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包。3.进行MSS(最大报文长度)大小的TCP分段,当TCP报文长度-TCP头部长度>MSS的时候将发生拆包。4.接收方法不及时读取套接字缓冲区数据,这将发生粘包。粘包、拆包解决办法?TCP本身是面向流的,作为网络服务器,如何原创 2021-11-18 18:16:58 · 231 阅读 · 0 评论 -
多线程和锁
ThreadLocal用过么,用途是什么,原理是什么,用的时候要注意什么?(1)每个Thread维护着一个ThreadLocalMap的引用(2)ThreadLocalMap是ThreadLocal的内部类,用Entry来进行存储(3)ThreadLocal创建的副本是存储在自己的threadLocals中的,也就是自己的ThreadLocalMap。(4)ThreadLocalMap的键值为ThreadLocal对象,而且可以有多个threadLocal变量,因此保存在map中(5..原创 2021-11-18 18:15:31 · 282 阅读 · 0 评论 -
Spring知识点
描述一下Spring中Bean的生命周期解析类得到BeanDefinition 如果有多个构造方法,则要推断构造方法 确定好构造方法后,进行实例化得到一个对象 对对象中的加了@Autowired注解的属性进行属性填充 回调Aware方法,比如BeanNameAware,BeanFactoryAware 调用BeanPostProcessor的初始化前的方法 调用初始化方法 调用BeanPostProcessor的初始化后的方法,在这里会进行AOP 如果当前创建的bean是单例的则会把be原创 2021-11-18 18:14:34 · 143 阅读 · 0 评论 -
Redis知识点梳理
脑裂问题(由于网络原因选举出两个master,此时client还在写一个老的master)解决方案:通过配置 min-slave-to-write 和 min-slave-max-lag 要求至少有一个slave复制和同步数据延迟不能超过10秒,就是说一旦所有slave复制数据都超过了10秒,整个时候master就不再接受请求了(client 端可以通过降级或者将消息写到kafaka 然后每10秒拉去消息尝试重新写到master)主从复制的完整流程:1 slave .原创 2021-11-18 18:13:55 · 312 阅读 · 0 评论 -
数据结构和算法
AVL树:平衡二叉树,一般是用平衡因子差值决定并通过旋转来实现,左右子树树高差不超过1,那么和红黑树比较它是严格的平衡二叉树,平衡条件非常严格(树高差只有1),只要插入或删除不满足上面的条件就要通过旋转来保持平衡。由于旋转是非常耗费时间的。我们可以推出AVL树适合用于插入删除次数比较少,但查找多的情况。红黑树:平衡二叉树,通过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,确保没有一条路径会比其他路径长2倍,因而是近似平衡的。所以相对于严格要求平衡的AVL树来说,它的旋转保持平衡次数较少.原创 2021-11-18 18:13:03 · 331 阅读 · 0 评论 -
JVM知识点
JVM 分为三个模块:1、类加载子系统2、运行时数据区3、执行引擎类加载过程:1 、加载(将磁盘class文件加载到内存)2、连接 2.1、验证 验证字节码的正确性 2.2、准备 给类的静态变量分配内存 并赋值默认值 2.3、解析 类装载器装载类所引用的其他类3、初始化 为类的静态变量赋予正确的初始值,上述的准备阶段为静态变量赋予的是虚拟机默认的初始值,此处赋予的才是程...原创 2021-11-18 18:12:15 · 287 阅读 · 0 评论 -
DDD知识点
面临的问题:代码可读性很差,每个服务之间调用繁杂,流程混乱 修改优化某服务业务代码时,促使无关的服务的测试用例失败,同时单个功能开发者很难快速就明确问题关键所在。 测试用例特别难编写,需要 mock 大量数据来拉起整块服务DDD解决的问题: 1、DDD 帮助解决微服务拆分困境: DDD 对业务分析时,首先会使用「聚合」把关联性强的业务概念划分在一个边界下,并限定「聚合」和「聚合」之间只能通过「聚合根」来访问,这是第一层边界。其次,在「聚合」基础之上根据「业务相关性」、「业原创 2021-11-18 18:11:19 · 454 阅读 · 0 评论 -
Mysql
mysql acid特性详细分析:https://www.cnblogs.com/kismetv/p/10331633.html你们先上线上怎么分库分表的?库:取模表:整除后在取模32*32 =1024张表 4台服务器 每台8个库线上预估能存50个亿的数据 目前存了20亿。。如果想提高写并发 可以扩容机器,,将每台机器只放一个库即可。。。mysql主从复制原理:1、主库和从库各有一个io线程来通信做主从同步2、主库io线程从..原创 2021-11-18 18:07:44 · 115 阅读 · 0 评论 -
如何设计一个秒杀系统
秒杀系统的核心特点:秒杀时大量用户会在同一时间同时进行抢购,网站瞬时访问流量激增。 秒杀一般是访问请求数量远远大于库存数量,只有少部分用户能够秒杀成功。 秒杀业务流程比较简单,一般就是下订单减库存客户端设计:-代理层设计:1、缓存一些读多写少的数据 ,比如用户信息2、限流 ,限制某一个IP的某段时间的请求量,防止某一个ip请求太多次限流的阈值可以动态调控,比如服务器有一台挂了,那么可以减少阈值,,可以通过lua脚本来动态读取zk的服务器情况..原创 2021-11-18 18:02:46 · 107 阅读 · 0 评论 -
java 基础
进程、线程、协程区别: 1、进程进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。 2、线程线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序原创 2021-11-18 17:58:49 · 395 阅读 · 0 评论