什么是数据结构与算法
数组与链表的应用数组的内存模型1int[] data = new int[5]; 通过上面这段声明,计算机会在内存中分配一段连续的内存空间给这个 data 数组。 获取数组元素的方式是按照以下的公式进行获取的: 1base_address + index(索引)× data_size(数据类型大小) data 这个数组被分配到的起始地址是 0x80000000,是因为 int 类型数据占据了 4 个字节的空间,如果我们要访问第 5 个元素 data[4] 的时候,按照上面的公式,只需要取得 0x80000000 + 4 × 4 = 0x80000010 这个地址的内容就可以了。随机访问的背后原理其实也就是利用了这个公式达到了同等的时间访问到一组数据中的任意元素。 12345678public void add(int index, E element) { ... System.arraycopy(elementData, index, elementData, index + 1, ...
什么是消息投递,幂等
前言我们小伙伴应该都听说够消息中间件MQ,如:RabbitMQ,RocketMQ,Kafka等。引入中间件的好处可以起到抗高并发,削峰,业务解耦的作用。 如上图: (1)订单服务投递消息给MQ中间件 (2)物流服务监听MQ中间件消息,从而进行消费 我们这篇文章讨论一下,如何保障订单服务把消息成功投递给MQ中间件,以RabbitMQ举例。 分析问题小伙伴们对此会有些疑问,订单服务发起消息服务,返回成功不就成功了吗?如下面的伪代码: 上面代码中,一般发送消息就是这么写的,小伙伴们觉得有什么问题吗? 下边说一个场景,如果MQ服务器突然宕机了会出现什么情况?是不是我们订单服务发过去的消息全部没有了吗?是的,一般MQ中间件为了提高系统的吞吐量会把消息保存在内存中,如果不作其他处理,MQ服务器一旦宕机,消息将全部丢失。这个是业务不允许的,造成很大的影响,关注公众号码猿技术专栏,获取更多面试资源。 持久化有经验的小伙伴会说,我知道一个方法就是把消息持久化,RabbitMQ中发消息的时候会有个durable参数可以设置,设置为true,就会持久化。 这样的话MQ服务器即使宕机,重启后磁盘文件 ...
Java性能优化
性能优化,有哪些衡量指标?需要注意什么?性能,就是使用有限的资源在有限的时间内完成工作。最主要的衡量因素就是时间。 吞吐量和响应速度QPS 代表每秒查询的数量,TPS 代表每秒事务的数量,HPS 代表每秒的 HTTP 请求数量等,这都是常用的与吞吐量相关的量化指标。 响应时间衡量平均响应时间:AVG 所有的请求耗时加起来,然后除以请求的次数。 百分位数:TP 值 和中位数、平均数等是类似的 并发量指系统同时能处理的请求数量,这个指标反映了系统的负载能力。 复用优化缓冲和缓存 缓冲(Buffer),常见于对数据的暂存,然后批量传输或者写入。多使用顺序方式,用来缓解不同设备之间频繁地、缓慢地随机写,缓冲主要针对的是写操作。 缓存(Cache),常见于对已读取数据的复用,通过将它们缓存在相对高速的区域,缓存主要针对的是读操作。 对于对象的池化操作 ,比如数据库连接池、线程池等。由于这些对象的创建和销毁成本都比较大,我们在使用之后,也会将这部分对象暂时存储,下次用的时候,就不用再走一遍耗时的初始化操作了。 计算优化
什么是ELK日志系统
ELKElasticsearch、Logstash 和 Kiabana组成一个日志分析平台 。 Elasticsearch分布式的 Restful 风格的搜索和数据分析引擎。 Logstash收集服务器日志,具有实时管道功能,可以动态地将来自不同数据源的数据统一起来,并将数据标准化到您所选择的目的地。 输入 过滤器 输出 Kibana数据面板。 ELK工作流程 ELK 平台搭建Elasticsearch安装 下载Elasticsearch 7.6.2的docker镜像: 1docker pull elasticsearch:7.6.2 修改虚拟内存区域大小,否则会因为过小而无法启动: 1sysctl -w vm.max_map_count=262144 使用如下命令启动Elasticsearch服务: 123456docker run -p 9200:9200 -p 9300:9300 --name elasticsearch \-e "discovery.type=single-node" \-e "cluster.name=elas ...
深入理解java虚拟机
JVM内存管理JVM 内存布局 JVM 堆中的数据是共享的,是占用内存最大的一块区域。 可以执行字节码的模块叫作执行引擎。 执行引擎在线程切换时怎么恢复?依靠的就是程序计数器。 JVM 的内存划分与多线程是息息相关的。像我们程序中运行时用到的栈,以及本地方法栈,它们的维度都是线程。 本地内存包含元数据区和一些直接内存。 虚拟机栈在每个 Java 方法被调用的时候,都会创建一个栈帧,并入栈。 一旦完成相应的调用,则出栈。所有的栈帧都出栈后,线程也就结束了。每个栈帧,都包含四个区域: 局部变量表 操作数栈 动态连接 返回地址 本地方法栈是和虚拟机栈非常相似的一个区域,它服务的对象是 native 方法。 程序计数器存的,就是当前线程执行的进度 还存储了当前正在运行的流程,包括正在执行的指令、跳转、分支、循环、异常处理等。 堆是 JVM 上最大的内存区域 存储对象 垃圾回收,操作的对象就是堆。 随着对象的频繁创建,堆空间占用的越来越多,就需要不定期的对不再使用的对象进行回收。这个在 Java 中,就叫作 GC(Garbage Collection) 对象创 ...
开发必备idea操作
idea神操作Ctrl 快捷键 介绍 Ctrl + Y 删除光标所在行 或 删除选中的行 (必备) Ctrl + D 复制光标所在行 或 复制选择内容,并把复制内容插入光标位置下面 (必备) Ctrl + W 递进式选择代码块。可选中光标所在的单词或段落,连续按会在原有选中的基础上再扩展选中范围 (必备) Ctrl + E 显示最近打开的文件记录列表 Ctrl + N 根据输入的 类名 查找类文件 Ctrl + Q 光标所在的变量 / 类名 / 方法名等上面(也可以在提示补充的时候按),显示文档内容 Ctrl + U 前往当前光标所在的方法的父类的方法 / 接口定义 Ctrl + B 进入光标所在的方法/变量的接口或是定义出,等效于 Ctrl + 左键单击 Ctrl + K 版本控制提交项目,需要此项目有加入到版本控制才可用 Ctrl + T 版本控制更新项目,需要此项目有加入到版本控制才可用 Ctrl + H 显示当前类的层次结构 Ctrl + O 选择可重写的方法 Ctrl + I 选择可继承的方法 Ctrl + + 展 ...
开发必备linux命令
常用命令(含docker/mysql) find ls ls -lh: 显示MB ,ls -ltr: 按时间升序,ls -F: 显示文件类型 pwd cd mkdir mkdir -p: 创建路径文件夹 df df -h:显示磁盘使用量 rm rm -r :遍历删除 mv cp 拷贝 scp 传输 scp -r /usr/bak root@192.168.77.75:/opt/bak rsync 快一点的传输 rsync -avzP /usr/bak root@192.168.77 ...
Transactional失效场景
@Transactional 注解 它能保证方法内多个数据库操作要么同时成功、要么同时失败。 一、事务主要分为编程式事务和声明式事务两种。 编程式事务:是指在代码中手动的管理事务的提交、回滚等操作,代码侵入性比较强,如下示例: 1234567try { //TODO something transactionManager.commit(status);} catch (Exception e) { transactionManager.rollback(status); thrownew InvoiceApplyException("异常失败");} 声明式事务:基于AOP面向切面的,它将具体业务与事务处理部分解耦,代码侵入性很低,所以在实际开发中声明式事务用的比较多。声明式事务也有两种实现方式,一是基于TX和AOP的xml配置文件方式,二种就是基于@Transactional 注解了。 123456@Transactional @GetMapping(" ...
hexo搭建
Hexo搭建 1、安装Node.js 官网:https://nodejs.org/zh-cn/ 建议使用 Node.js 10.0 及以上版本,最新版本貌似和hexo5有冲突。 一路next傻瓜操作 2、安装hexocmd输入 1npm install -g hexo-cli 3、建站Github Page配置参见官网:https://pages.github.com/ 记得本地hexo仓库要关联到github page 1git remote add origin github.com/你的github名字/你的github名字.github.io.git 新建hexo文件夹,打开git bash,一步步输入 12345678910//初始化hexo init//安装依赖npm install//生成文件hexo g//开启服务hexo s//本地启动http://localhost:4000 大功告成,放个鞭炮庆祝下 ...
什么是阻塞队列
阻塞队列public interface BlockingQueue extends Queue{…} BlockingQueue 下面有 6 种最主要的实现,分别是 ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、DelayQueue、PriorityBlockingQueue 和 LinkedTransferQueue take方法 获取并移除队列的头结点 一旦执行 take 方法的时候,队列里无数据,则阻塞,直到队列里有数据。一旦队列里有数据了,就会立刻解除阻塞状态,并且取到数据 pull方法 插入元素 如果队列已满,那么就无法继续插入,则阻塞,直到队列里有了空闲空间 无界队列 LinkedBlockingQueue 有界队列 ArrayBlockingQueue BlockingQueue 中最常用的和添加、删除相关的 8 个方法 1、抛出异常:add、remove、element2、返回结果但不抛出异常:offer、poll、peek3、阻塞:put、take add 往队列里添加一个元素,如果队列满了, ...