- 博客(26)
- 收藏
- 关注
原创 RocketMQ更新中
专业术语说明: 1.Producer 消息生产者,负责产生消息,一般由业务系统负责产生消息。 2.Consumer 消息消费者,负责消费消息,一般是后台系统负责异步消费。 3.Push Consumer Consumer 的一种,应用通常吐 Consumer 对象注册一个 Listener 接口,一旦收到消息,Consumer 对象立刻回调 Listener 接口方法。 4.Pull Consumer Consumer 的一种,应用通常主动调用 Consumer 的拉消息方法从 Broker .
2021-03-03 20:35:42
336
1
原创 Java堆外内存
1.为啥需要堆外内存? 1.在Java中NIO数据传输的时候使用了堆外内存,为啥要使用呢?堆内内存咋了嘛?一个很大的原因,可能是堆内内存不够会产生GC,导致一定程度的传输速率下降,因此出现其他性能问题。 2.但是有个疑问,那数据传输使用堆外内存,不是堆内内存-->堆外内存-->内核socket缓冲区(网卡省略),那堆内拷贝到堆外不是也有可能发生GC吗?这里涉及到safe point, GC只会发生在代码进入到safe point的时候,而堆内拷贝到堆外不可能进入到safe point,而直.
2021-02-12 17:46:32
462
原创 简单讲讲AC自动机理念
敏感词有{"hers", "his", "she"} ,然后对于字符串s="ahishers" , 经过敏感词过滤后,变成字符串t=”a“。 如何以O(len(s))的时间复杂度,来实现这个功能呢? 如下图所示: 每个节点都有一个fail指针,i->fail=j, 那么代表着: word[j]是word[i]的最长后缀。 下图红色线是fail指针,黑色线是前缀树指针,从中就可以知道,游走的算法是可以达到O(n)的。 ...
2020-12-22 19:40:12
250
原创 Zookeeper学习
//投票的时候的源码架构图 刚进入程序,解析完配置文件后,会调用QromaPeer的start方法,做了以下四步 1.加载数据(datatree快照和事务日志文件,当然只加载datatree快照) 2.开启读取数据的线程(recvworker):开启channel.accept来接收其他服务器的请求,开始监听。 3.进行领导者选举,确定服务器的角色,再针对不同的服务器进行初始化操作,比如ServerSocket.accept来等待接收vote,以及应用层的sendqueue和r...
2020-12-20 19:27:52
302
1
原创 Redis问题多多
1.对Redis理解,使用什么场景?你用它干什么?解决什么问题? 就是一个远程的缓存,利用内存来用空间换取时间,当然对比本地缓存的优势当然是能分布式下共享数据。 用它来存储一些热点数据。解决了查询效率。 2.redis基础数据类型,底层如何实现?跳表?为什么单线程快?哪些可能会导致Redis慢,哪些命令会慢? 主要回答Redis慢(其实可以通过慢查询日志分析): 1.大key导致,数据结构不规范导致 2.Redis查询命令不规范,扫描很多 3.持久化导致,fork阻塞,AOF刷盘阻..
2020-12-18 18:33:50
215
1
原创 Nginx+LVS+DNS 负载均衡
1.Nginx的负载均衡属于七层负载均衡,会建立TCP链接,产生流量的那种 1.轮训法 2.随机 3.加权轮训 4.加权随机 5.原地址哈希法(能保证每次请求都打在同一台机器上) 6.最少连接数 最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢。 ==》它是根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求, 尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。 2.LVS的负载均衡(主要用..
2020-12-18 17:43:37
1036
1
原创 HTTP版本演进
1.http 0.9 可以忽略,就只是get请求方法。 2.http 1.0 报文分为了header和body部分,支持了get post等请求方法类型,但是默认采用短连接,长连接只是一个拓展项。 3.http 1.1 现在(2020)普遍采用的一个方式, 报文header部分新增字段keep-alive默认true,默认采用长连接。 ==〉 解释下长连接,长连接意味着多个http报文可以都使用同一个tcp连接进行数据传输。可以减少tcp连接创建关闭的开销。 ==〉 另外同一个域名,tcp连接数是有
2020-11-30 12:25:58
219
原创 蓄水池算法(简单代码)
1.一个不知道文本行数的文件,如何随机获得其中一行?要求还不能随机读,必须一行一行读。 这时蓄水池算法就出现了。伪代码如下: 此时,所有的行被选取的概率都是1/N i = 0 #行号 s = null #随机选取的行 for line in 文本文件: i = i+1 r = 生成[0,1)之间的随机数 if r < 1/i : s = line #替换 2.如果随机选取k行?(前提当然是行数>k) i ...
2020-11-16 20:06:13
630
原创 TCP,UDP,IP报文首部字段整理以及TCP相关常见问题
(1)TCP报文 //可以看到TCP报文头部是固定的,数据部分就不知道了。 1.两个端口号总和4个字节, 2.序列号4个字节 3.确认号4个字节 4.(4位首部长度+6位保留+6位报文类型) 2个字节+窗口大小两个字节 ==> 4个字节 5. 检验和2个字节+紧急指针2个字节 ==> 四个字节 6.选项部分,最多40字节 ==> TCP首部大小范围 (20字节到60字节) (2)UDP报文 1.原端口+目的端口=4个字节 2.长度+校验值...
2020-11-16 15:29:39
1064
原创 IO多路复用(个人记录)
(1) Linux系统中断 1.软中断是执行中断指令产生的,而硬中断是由外设引发的。 2.硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。 3.硬中断是可屏蔽的,软中断不可屏蔽。硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间。 硬中断: 外设QAQ 举个例子,网卡缓存接受到报文数据,DMA将数据直接拷贝到内核页缓存上,这是会触发中断程序。 (后续会跟IO多路复用有关) 软中断: 指的是,当CPU执行代码指令的时候,发生...
2020-11-16 14:22:58
163
原创 记录遇到的几个场景题
(1) 如何实现亿级数据的全排序 其实考察的就是merge思想,内存不够时候的解决方案。现在的成熟解决框架,就是hadoop,storm这些。以hadoop为例,记录下什么阶段会排序。 1.map最后阶段进行partition分区,一般使用job.setPartitionerClass设置的类,如果没有自定义Key的hashCode()方法进行分区。在map阶段写出到环形缓冲区,在环形缓冲区溢写时会进行一次排序,每个分区内部调用job.setSortComparatorClass设置的key的比较函数类
2020-11-03 14:37:29
290
原创 理解String,StringBuilder,StringBuffer的区别
1.String 1) 成员变量有final类型的char数组,代表其是不可变的。 2) 线程安全与否就不用讨论了,都不可修改了。 3) 一般b=b+b; 其实b不是被修改了,而是生成了新的String对象。 /** The value is used for character storage. */ private final char value[]; 2.StringBuilder 1) 继承的 AbstractStringBuilder类中,有成员变量char[]数组,可以对..
2020-10-30 12:41:07
193
原创 理解漏桶和令牌桶算法区别
1.漏桶算法(假设qps=10) 1.首先初始化capacity=qps,代表桶的容量。且这个容量每秒会流失capacity的水,空了就不流。一旦水满出去,溢出的就是拒绝的请求。 2.当一个请求进来的时候,计算(now-lastTime)/1000*capacity,知道间隔时间流出了多少水,然后获取remainCapacity,如果remainCapacity还是小于桶容量的,那么加水,否则就溢出。 3.自己加的水成功流出,才能执行下一步,所以会阻塞等待个(remainCapacity/capaci
2020-10-29 16:32:00
1009
原创 Mysql(索引+事务)
1.Mysql索引机制 1.B+树和B树的区别: 2.联合索引怎么设置,索引下推 3.唯一索引和普通索引字段可以是null吗,会导致走不上索引吗 4.一千w的数据,B+树的高会是多少。通过存储最小单位数据页16K来计算下。 ...
2020-10-27 16:31:59
216
原创 Java线程状态,线程池状态
1.Java线程状态 可以分为以下几种状态: 1.新建状态: 刚创建Thread对象。 2.就绪状态: 调用了Thread.start()方法,一切资源已经获取,只等待获取CPU执行。 3.运行状态: 获取CPU执行。 4.死亡状态: 线程已经执行结束生命周期。 5.阻塞状态: 还没获取足够的资源。 阻塞的情况分三种: (01) 等待阻塞 -- 通过调用线程的wait()方法,让线程等待某工作的完成。 (02) 同步阻塞 -- 线程在获取synchroni...
2020-10-25 19:30:39
354
原创 粘包和半包(个人总结)
1.首先盗个图,阐述下半包粘包问题的产生。 首先知道TCP连接层每次传输的数据有个最大限制MTU(Maximum Transmission Unit),一般是1500比特。然而tcp为提高性能,发送端会将需要发送的数据发送到缓冲区,等待缓冲区满了之后,再将缓冲中的数据发送到接收方。同理,接收方也有缓冲区这样的机制,来接收数据。 发生TCP粘包、拆包主要是由于下面一些原因(主要是缓冲区和MTU导致): 应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。 应用程序写入数据小于套接字
2020-10-25 16:35:17
1095
原创 原码-反码-补码(简单介绍)
(0) 先给结论: 在计算机系统中,数值一律用补码来表示(存储. 主要原因==> 1. 使用补码,可以将符号位和其它位统一处理; 2. 同时,减法也可按加法来处理. 3. 另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃. (1) 原码是什么样子 由于最高位是符号位: +7 = 0000 0111B -7 = 1000 0111B (2) 反码是什么样子 +7 = 0000 0111B (和原码表示一样) -7 = 1111 1000...
2020-10-24 14:18:40
193
原创 Redis单机基础知识
(1). Redis底层IO多路复用 PS:首先说下,Redis启动的一个进程,并不是只有一个线程,只是处理IO,验证命令和执行命令都是单个线程执行。还有其他的模块,比如内存淘汰,处理一些异常数据还是多线程的。 1.select存在的问题: 代码: 用bitmap来表示哪个fd有数据,然后检测到有数据就标识1然后通过内核态和用户态的切换提高检测效率.去取出数据的时候,会根据max_id来遍历. ==>但是上面这个逻辑,并不是死循环执行的,当有socket buffer有数据的时候,会有中断程.
2020-10-23 20:28:10
213
原创 CountDownLatch+ReentreenLock+ArrayBolckingQueue
(1) AQS(AbstractQueuedSynchronizer)概念: 有三个元素 1. volatile int state 2. 双向队列 3. CAS操作 (2) CountDownLatch 1.countDownLatch继承了AQS 2.其构造方法传入参数,state=其参数 3.当其他线程调用countDown()方法的时候,CAS(Unsafe.compareAndSetState)得将state-1,如果发现state=0的时候,会唤醒在双向队列中的线程Lock..
2020-10-23 19:19:33
274
原创 ConcurrentHashMap1.8(老生常谈)
1.ConcurrentHashMap.put(key,val) 对key进行hashcode^(hashcode>>16)取模,获得桶编号,如果桶内没元素,插入,插入失败重试,如果已经有元素,synchronized锁头,然后形成链表-> >8个节点变为红黑树。 2.ConcurrentHashMap.get(key) 没有任何的加锁操作,但是值得注意的是桶数组是volatile,Node类中的key和val也都是volatile,保证了可见性,所以仅仅查看的时候,是线程安全
2020-10-23 18:06:56
1018
原创 kafka个人所学总结
主要从Kafka特性和使用角度来学Kafka (1).Kafka吞吐量高的三个原因 1.底层采用零拷贝 2.可以批量来发送接收数据 3.磁盘顺序存储 4.分区存储,分区消费 拓展描述下零拷贝: 常见调用进程读取a.txt文件,发送a.txt字节流到其他机器过程描述: 1.读取磁盘文件,存入到内核态的内存页缓存上。 2.切换到用户态,将页缓存上的数据拷贝到用户态内存上。(一般情况下如果做计算操作,那就在用户编写的代码上体现) 3.用户态切换回内核态,将数据拷贝到socket b..
2020-10-23 17:56:43
225
原创 Mysql查询+hiveSQL查询+SparkSQL查询对比(个人总结)
1.首先讲下Mysql吧,适用于实时性的查询,一般使用场景都是通过走B+树索引,来让查询效率维持在毫秒级。但是缺点也很明显,举个例子查询的量过大,有百万级别,Mysql直接OOM了。存在性能的瓶颈。而hiveSQL和sparkSQL的查询不存在这种问题,计算完成后的数据都是分布式存储的。 2.所以和Mysql对比,hiveSQL查询和sparkSQL查询都是分布式上的操作了,假设两种查询都是查询的hive表,hive表底层存储的数据方式依赖于HDFS(一个分布式的文件存储系统),hiveSQL会转化.
2020-10-23 16:29:59
4065
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅