自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 Linux搭建

elsearch:1.https://blog.csdn.net/yuanzelin8/article/details/1085087592.安装之后启动报错,把所有提示的目录授权3.公网访问需要配置本机公网地址:vim /etc/elasticsearch/elasticsearch.yml将 network.host: localhost 配置项改成 network.host: 公网IP4.公网访问需要配置至少一个主机Hostsvim /etc/elasticsearch//elastics

2021-04-11 18:18:34 75

原创 mysql隔离级别

脏读:读到其他事务未提交的数据不可重复读:当前事务中第一次读个第二次读到的数据不一致。幻读:和不可重复读一样,区别是读到新增的数据,而不可重复读是读到被修改的数据。悲观锁:总是认为数据会有其他线程修改读锁:加读锁,其他线程可以读,不可以写写锁:其他线程不可读不可写乐观锁:总是认为数据不会被更改,只有在更改数据的时候才去比较一下数据是否被更改过。读未提交:啥问题都有读已提交:有不可重复读和幻读的问题可重复读:有幻读问题串行化:啥问题没有...

2021-03-27 22:21:46 68

原创 快速排序和冒泡排序

快速排序和冒泡排序快速排序:以第一个位置为基准数,存为temp,首尾两个指针,从尾指针开始查找,找到比基准数小的数就替换掉首指针指向的数(此时尾指针指向的数已经没用的),再从首指针找比基准数大的数,找到就替换掉尾指针的数,直到首尾指针重合,把基准数放到重合的位置,第一轮结束,基准数前面都是比他小的,基准数后面都是比他大的,以最终基准数位置为中心,分为两个区间,递归前面的步骤,直到区间只有一个数为止。冒泡排序:第一个数和第二个数比较,大就交换,第一次下来数组最后一个位置就是最大的数,重复这个步骤直到没有交

2021-03-27 22:03:53 108

原创 Spring

IOC:控制反转,把依赖对象的控制权交给外部容器,有外部容器管理管理这些对象的生命周期。DI:依赖注入,组件之间的依赖关系由第三方容器注入。AOP:面向切面编程,对OOP的补充,用于将业务无关的代码抽象一个可重用的模块,减少代码耦合,提高可维护性SpringBean的生命周期:创建一个对象 > 注入属性 > 检查Awar相关接口 > BeanPostProcessor的前置处理 > 如果实现InitalizingBean接口调用接口方法 > 如果有就调用定义的In

2021-03-22 14:27:23 84

原创 Dubbo

Dubbo的注册中心功能接收服务端的注册与客户端的引用,即将引用与消费建立关联,并支持多对多。当服务非正常关闭时能即时清除其状态当注册中心重启时,能自动恢复注册数据,以及订阅请求注册中心本身的集群Dubbo采用的是定时心跳的机制 来维护服务URL的有效期,默认每30秒更新一次有效期。基于Zookeeper 临时节点机制实现,在客户端会话超时后 Zookeeper会自动删除所有临时节点,默认为40秒。提供者宕机后 ,其与客户端的链接也随即断开,客户端在调用前会检测长连接状态。dubbo调用

2021-03-15 16:43:00 160

原创 异步非阻塞IO框架Netty

NIO(同步非阻塞IO):服务端创建ServerSocketChannel监听端口,绑定Selector并监听连接事件(Selector监听ServerSocketChannel感兴趣的事件)。客户端发起连接请求Selector就会感知到,创建新的SocketChannel(accept方法)注册Selector监听感兴趣的事件。Selector(多路复用器):底层使用linux的epoll实现,每当有IO事件就绪,系统注册的回调函数就会被调用,会延迟100毫秒,延迟期间可能会有其他请求过来,一并处理。

2021-02-04 11:02:46 304 3

原创 MySQL

适合建立索引:主键自动建立唯一索引。频繁作为查询条件的字段。与其他表关联字段。不适合建立索引:频繁更新的字段不适合做索引,对表做增删改操作会对索引做相应操作Where条件里用不到的字段不建立索引尽量建立组合索引排序字段通过索引去访问大大提高排序速度Group by 也要符合索引Explain 查询:id:表的读取顺序,id大的先执行,id相同由上至下执行。select_type:查询的类型,table:查询的表,Derived2表示id为2,select_type为Deri..

2021-01-17 10:57:36 50

原创 MySQL原理/日志

MySQL连接客户端发起连接请求,通过连接器连接,加载系统数据库用户权限,连接管理对象管理权限,判断是否有执行操作权限,然后执行操作。MySQL读取磁盘数据,调用系统内核,内核调用驱动程序把数据加载到内核的内存,再复制到用户空间的内存之中基本逻辑结构MySQL执行查询语句,先查找缓冲区是否有语句对应的key,没有就进行语法分析(检查语句是否正确),语法正确之后进行语句优化(是否有索引字段,先查哪张表),执行器调用存储引擎接口,存储引擎查询对应的数据文件,返回结果集给执行器,执行器判断如果开启缓存

2020-12-07 14:50:25 92 1

原创 java锁

CASCAS(轻量级锁),做操作之前,先获取oldValue为预期值,修改值,再调用原子类的比较交换方法,对比预期值和oldValue相同才更为新的值。CAS原子性问题:比较交换是多个语句,在硬件级别加lock缓存行锁(超过64K总线锁)实现原子操作。CAS ABA问题:线程1拿到预期值,线程2执行快,把值改变了,又改为原来的值,线程1比较发现是原来的值(本质变了)。通过加版本号,比较值相同在比较版本号。CAS如果并发线程多,所有线程都在自旋,CPU占用多,可能不如重量级锁进入队列等待。偏向锁

2020-12-06 22:31:20 73

原创 垃圾回收

垃圾回收算法:标记清除 -位置不连续 产生碎片复制算法 -没有碎片 浪费空间标记整理 -没有碎片 效率偏低引用计数法:对象中添加引用计数器,无法解决循环引用。可达性算法:从GC ROOT根开始,找到引用链,没在引用链上的对象就是垃圾对象。MinorGC也会STW,但是扫描的对象少,需要复制的存活对象也少,所以特别快。CMS垃圾收集器:找GC ROOT根引用链的第一个引用(短暂STW),并发执行标记(会浮标和错标,标记的时间长所以并发),再重新标记(短暂STW),并发清理,大大减少STW时间。

2020-12-06 21:54:47 75

原创 spring 循环依赖

构造器依赖无法解决,使用三级缓存解决field属性依赖。A的属性依赖B,B的属性依赖A创建A,设置依赖属性B,发现B没有创建,创建B,设置依赖属性A,先从一级缓存singletonObjects中去获取。(如果获取到就直接return)如果获取不到或者对象正在创建中(isSingletonCurrentlyInCreation()),那就再从二级缓存earlySingletonObjects中获取。(如果获取到就直接return)如果还是获取不到,且允许singletonFactories(allo

2020-11-23 20:32:21 55

原创 一次http请求

域名解析–>TCP连接–> 建立TCP连接后发起http请求–>服务器响应http请求–> 浏览器解析响应结果域名解析:浏览器先搜索自身DNS缓存,没找到再搜索操作系统DNS缓存,没找到再搜索hosts文件,没找到就去DNS服务器发起域名解析请求。TCP连接:拿到IP地址后,浏览器使用一个随机端口像服务器的80端口发起TCP连接请求,经过三次握手后,建立连接客户端发起http请求服务器响应http请求:服务器端应用接受到http请求,处理请求返回响应结果浏览器解析响应结果:浏

2020-11-23 16:29:58 62

原创 SpringMVC执行流程

SpringMVC执行流程1.客户端发送请求,到前端控制器2.前端控制器通过处理器映射器查找处理器3.处理器映射器返回处理器执行链给前端控制器4.前端控制器再去找到对应的处理器适配器5.处理器适配器执行处理器方法6.处理器返回ModelAndView对象给处理器适配器7.处理器适配器返回ModelAndView对象给前端控制器8.前端控制器调用视图解析器9.返回View对象10.把Model中的数据填充至View对象中渲染视图11.返回给客户端...

2020-11-23 14:34:28 155

原创 线程池

线程池的意义线程池线程池有核心线程、非核心线程、任务队列、拒绝策略四个核心概念,假设有两个核心线程,两个非核心线程,任务队列五个,当主线程分配任务,直接分配给核心线程,如果核心线程已经被占用,就会把任务放入任务队列,当任务队列也满了,再来任务就会调用非核心线程,如果非核心线程也满了,再来的任务就会执行拒绝策略。线程执行完成后自旋,不让线程被回收。线程池五种状态...

2020-11-23 10:58:54 109

原创 线程

java线程Java线程与系统内核线程Java线程创建依赖系统内核,创建一个线程开销非常大,所以要使用线程池线程生命周期创建一个线程对象(NEW状态),调用了start方法,线程进入就绪状态,当CPU分配时间片执行线程(RUNNING状态),期间如果调用了join,sleep,wait等设置了超时时间的方法,进入超时等待状态,调用join,wait等进入等待状态,等待状态超时时间结束,或者被唤醒,重新进入到就绪状态,如果对象加锁,没争抢到锁的进入阻塞状态,获取到锁运行状态,当线程执行完就会进入终

2020-11-23 10:38:39 128

原创 zookeeper

zookeeperzookeeper:分布式协调框架,主要解决分布式应用中的数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。zookeeper核心概念zookeeper客户端和服务端通过sessionid通信,有过期时间,每次请求都会增加存活时间,客户端挂掉,服务端通过超时机制释放连接,同时把sessionid对应的临时节点也删除掉(临时节点不能创建子节点)。zookeeper应用配置中心可以使用zookeeper设置一个配置中心,创建一个配置节点/orde

2020-11-21 09:54:27 112

原创 HashMap

HashMapHashMap1.7以数组加链表的形式存储元素,先根据key模除计算出hash值,放在对应的位置,如果发生hash冲突,以链表的形式存储。HashMap1.8以数组链表加红黑树的形式存储元素,对key做与运算,计算出hash值,放在对应的位置,如果链表的长度大于8,先判断hashMap大小是否大于64,小于64优先扩容,大于64链表转红黑树。Hashmap1.7扩容会死锁,两个线程同时扩容,转移元素上下位置会转变,下面元素指针指向上面元素,另一个线程转移这个元素,也调换位置,本来为nul

2020-11-21 09:01:42 133

原创 Redis存储

redis介绍redis底层使用C语言实现,key使用SDS类型(len存储数据长度,free表示剩余空间,char数组存字符串。例原来字符串"abc",新字符串"abcdef",空间不够,扩容大小位len+需要扩容大小后乘2,如果超过1M,每次扩容1M)。3.2之前len和free是int类型,可以存储32亿,通常用不到,浪费空间,3.2之后对SDS类型做了扩展sdshdr5/sdshdr8/sdshdr16等,用flags表示具体类型(flags前三位存放string的类型,后五位存放字符串长度,

2020-11-15 11:50:49 344

原创 Redis实现分布式锁

redis分布式锁实现原理锁1.0:使用redis,string类型的setnx命令,如果key为空,设置成功获取锁成功,如果key存在设置失败返回false获取锁失败.上图代码如果执行过程中抛出异常怎么办?锁1.1,加try finally代码块释放锁,使锁始终释放如果程序down掉了怎么办?锁1.2:把redis的key设置超时时间,超时自动清除key获取锁和设置超时时间不是原子代码块,如果拿到锁,没加超时时间就down掉了,怎么办?锁1.3:stringRedisTemplate提

2020-11-12 21:35:48 105

原创 Redis五种数据类型

Redis五种数据类型String![在这里插入图片描述](https://img-blog.csdnimg.cn/20201108102613748.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM3MTY0Mjk=,size_16,color_FFFFFF,t_70#pic_center)...

2020-11-08 10:46:55 156

原创 volatile关键字

java内存模型CPU运行程序是把数据从硬盘拿出来,放到主内存,再把数据加载到高速缓存,真正运行程序主要和高速缓存打交道线程会把主内存的共享变量copy一份副本到工作内存,每个线程的共享变量的值是工作内存共享变量副本的值...

2020-11-07 13:40:13 125

原创 JVM调优思路

亿级流量电商网站订单系统分析亿级流量电商(每日用户点击上亿次),每个用户浏览购买大概点击二三十次,日活跃500万用户,假定付费转化率10%,日均50万订单,促销活动订单集中在抢购前几分钟产生每秒1000多单,三个订单系统,每个订单系统每秒300多单,每个对象假定1KB,每秒300K订单对象生成,下单还涉及其他优惠券积分等对象,放大20倍,300KB20每秒,可能同时还有其他操作订单查询等,再放大10倍,300KB20*10每秒60M的对象1秒后都变为垃圾对象。如果按照JVM默认参数,堆内存分配3G,老年

2020-11-06 10:58:20 62

原创 Java虚拟机堆内存

堆内存总600m 老年代占2/3,新生代1/3 ,新生代的eden8/10,survivor区1/10堆内存总体分为年轻代和老年代。年轻代又有eden区和suivivor区。suivivor区分为from区域和to区域。堆用来存放对象,new的对象都会放入eden,eden区满了触发minor gc,字节码执行引擎执行垃圾回收,根据可达性算法回收垃圾,垃圾回收之后存活下来的对象放入from区域,对象的分代年龄+1(分代年龄存放在对象的Object Header中),from区域有对象之后(eden

2020-11-04 22:00:50 209

原创 Java虚拟机

java虚拟机JVM运行步骤Java虚拟机分三个区域:运行时数据区,类装载子系统,字节码执行引擎。运行时数据区又分为:堆/栈/本地方法栈/方法区和程序计数器Math.java 代码如下public int compute(){ int a =1; int b =2; int c = (a+b)*10;}public static void main(String[] args){ Math math = new Math(); math.compute();}JVM运行步骤

2020-11-03 21:23:11 76

原创 MySQL存储引擎

MySQL存储引擎MyISAM存储引擎innoDB存储引擎MyISAM存储引擎MyISAM存储引擎是非聚集索引(索引和数据MYI/MYD两个文件)。在磁盘上一张表分为三个文件存储。数据以MyISAM形式存储,MySQL查询语句执行过程:select * from table where col=’49’ ,where条件的字段如果是索引字段,先去myi索引文件根据B+树特性定位索引49的元素(树的根节点是常驻内存的),从根节点开始找,找到15和56中间的指针,把指针指向的节点load进内存,在比对找

2020-11-03 09:37:44 101

原创 MySQL索引

MySQL索引索引的数据结构二叉树:红黑树:B树B+树hash表索引:类似书的目录,方便定位想要查找的内容。是帮助数据库更高效的查询所排好序的数据结构。索引的数据结构二叉树:最基本的树,有一个根节点,左边的节点永远小于右边的节点红黑树:也叫二叉平衡树,二叉树的变种,节点分为黑色和红色,根节点和叶子节点为黑色,每个红色节点的两个子节点也是黑色,有连续的两个红色节点就做一次平衡。B树B树在红黑树基础上改造,把节点横向扩展,每个节点存放多个索引,索引不重复,非叶子节点存放指针,指向叶子节点,叶

2020-11-02 20:08:55 95

原创 我的第一篇博客

我的第一篇博客工作一年多,每天都是增删改查,审视自己,没用到的基础都快忘没了,用到再去找资料,然而看别人的博客理解起来还是有些麻烦,所以就想到维护一个自己的博客,当作笔记使用了,如果也能帮助到大家那就更好了,有问题的地方欢迎大家一起讨论,哈哈哈...

2020-11-02 18:52:59 49

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除