- 博客(313)
- 问答 (3)
- 收藏
- 关注
原创 从今天开始,我要连续学习半年,每天至少6个小时,休息日12个小时,年中冲刺3万月薪。
从今天开始,我要连续学习半年,每天至少6个小时,休息日12个小时,年中冲刺3万月薪。
2025-01-04 09:59:02
103
原创 MySQL的索引使用了B+树的数据结构。那么为什么不用B树呢?
B+树只有叶子结点包含实际的值,B+树的叶子结点都是相连的,因此对整棵树的遍历只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以查找效率没有B+树好。...
2021-08-26 14:47:37
860
原创 项目流程中用到的环境
一个软件产品从开发到用户使用都涉及哪些环境?开发环境、测试环境、回归环境、预发布环境、生产环境。回归环境:回归bug的环境,其实就是我们的测试环境,在测试环境上测试、回归验证bug。预发布环境和生产环境区别:1)预发环境中新功能为最新代码,其他功能代码和生产环境一致。2)预发环境和生产环境的访问域名不同。另外,还有个灰度发布,发生在预发布环境之后,生产环境之前。生产环境一般会部署在多台机器上,以防某台机器出现故障,这样其他机器可以继续运行,不影响用户使用。灰度发布会发布到其中的几台机
2021-08-26 14:38:26
304
原创 自定义注解的应用场景
参考:https://blog.youkuaiyun.com/weixin_36380516/article/details/108396260应用场景:自定义注解+AOP 实现日志打印先导入切面需要的依赖包<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></d...
2021-08-23 14:10:39
481
原创 spring和spring boot相关
AOP意为面向切面编程,它是一种编程思想,是面向对象编程(OOP)的一种补充,AOP将一些程序抽象成切面,可以保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能。使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。通知(Advice):切面必须要完成的工作。即,它是类中的一个方法。五种增强/通知前置通知(@Before)后置通知(@Ater)返回通知(@AfterReturning)异常通知(@AfterThrowing)环绕通知(@Aroun
2021-08-20 14:39:25
94
原创 redis过期键删除和内存淘汰策略
Redis的过期键删除策略:定时删除、惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,那就返回该键;定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于删除多少过期键,以及要检查多少个数据库,则由算法决定。Redis服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种删除策略,服务器可以很好地在合理使用CPU时间和避免浪费内存空间之间取得平衡。内存淘汰策略:长期将Redis作为缓存使
2021-08-20 11:13:26
112
原创 redis持久化
Redis持久化RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘,它恢复时是将快照文件直接读到内存里。RDB的缺点是最后一次持久化后的数据可能丢失。我们默认的就是RDB,一般情况下不需要修改这个配置。rdb保存的文件是dump.rdb。AOF(Append Only File)将我们的所有命令都记录下来,以日志的形式来记录每个写操作,将redis执行过的所有指令记录下来,只许追加文件,不可以改写文件。redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根
2021-08-20 11:04:23
81
原创 数据库三范式
参考:https://www.cnblogs.com/JTrun/p/11069652.html第一范式(1NF):每一列都是不可分割的原子数据项第二范式(2NF):在1NF基础上,非码属性必须完全依赖于候选码第三范式(3NF):在2NF的基础上,任何的非主属性不依赖于其他非主属性...
2021-08-20 10:36:36
81
原创 ReentrantLock是一个悲观锁
ReentrantLock底层是由AQS实现的,ReentrantLock机制可以说是实打实的悲观锁。来自:https://blog.youkuaiyun.com/qq_35688140/article/details/101223701众所周知,ReentrantLock是一个悲观锁,但是查看源码,发现底层实现使用的是compareAndSet相关方法实现的,于是产生疑问:为什么ReentrantLock使用的和CAS一样的compareAndSet相关的方法实现的,CAS确实乐观锁,ReentrantLo
2021-08-19 22:42:16
2448
1
原创 接口响应过慢的原因排查
接口响应过慢的原因排查排查的顺序:1、确定是哪个接口存在性能问题2、确定这个接口的内部逻辑是怎样的,做了哪些事情3、分析接口存在性能问题的根本原因4、寻找确立优化方案5、回归验证方案效果接口慢排查:一般会从以下几个方面入手:1.是不是资源层面的瓶颈,硬件、配置环境之类的问题2.针对查询类接口,是不是没有添加缓存,如果加了,是不是热点数据导致负载不均衡3.是不是有依赖于第三方接口,导致因第三方请求拖慢了本地请求4.是不是接口涉及业务太多,导致程序执行跑很久5.是不是sql层面
2021-08-19 22:12:23
14403
原创 更加深入的认识索引
如果经常需要同时对两个字段进行AND查询,那么使用两个单独索引不如建立一个复合索引,因为两个单独索引通常数据库只能使用其中一个,而使用复合索引因为索引本身就对应到两个字段上的,效率会有很大提高。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c)。 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找。...
2021-08-19 21:35:47
83
原创 会触发JVM进行full gc的情况
会触发JVM进行full gc的情况:1、System.gc()方法的调用2、老年代空间不足3、堆中分配很大的对象所谓大对象,是指需要大量连续内存空间的java对象,例如很长的数组,此种对象会直接进入老年代,而老年代虽然有很大的剩余空间,但是无法找到足够大的连续空间来分配给当前对象,此种情况就会触发JVM进行Full GC。...
2021-08-19 16:51:43
276
原创 Garbage First(G1)收集器
jdk1.7、jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)jdk1.9 默认垃圾收集器G1G1收集器开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。G1把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。收集器能够对扮演不同角色的Region采用不同的策略去处理。...
2021-08-19 15:59:20
84
原创 跳表的学习
什么是跳表跳表全称为跳跃列表,它允许快速查询,插入和删除一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表,且每一层链表中的元素是前一层链表元素的子集。一开始时,算法在最稀疏的层次进行搜索,直至需要查找的元素在该层两个相邻的元素中间。这时,算法将跳转到下一个层次,重复刚才的搜索,直到找到需要查找的元素为止。增加了向前指针的链表叫作跳表。跳表全称叫做跳跃表,简称跳表。跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链
2021-08-19 11:40:00
108
原创 ThreadPoolExecutor二次学习
参考链接:https://blog.youkuaiyun.com/qq_39104442/article/details/90378858多线程以及并发变成已经成为了必问的问题,今天就来总结下多线程在项目中的应用以及线程池的使用。多线程的使用: 比如在庞大的项目中,一个请求中,可能要调用N多个服务, 比如调用积分服务,订单服务,地址服务,库存服务或者一些其他公司的服务等,多次调用过程中如果每个服务都用掉500ms,那么整体的时长就是n*500,。so,这个时间是无法忍受的, 所以就要使用多线程来干这个事情了。.
2021-08-19 09:52:03
110
原创 0818积累
0818013.常见的HTTP请求头有哪些,User-Agent的作用HTTP最常见的请求头如下:Accept-Charset 浏览器可以接受的字符编码集。Accept-Language 浏览器可接受的语言Cookie HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。Content-Length 请求的内容长度HTTP Responses Header 响应头:Content-Language 响应体的语言 Con...
2021-08-18 17:46:12
126
原创 Docker和k8s简介
Docker是一个容器引擎,开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到Linux或Windows机器上。Kubernetes是容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处
2021-08-16 17:52:30
183
原创 Unsafe类
参考:https://www.jianshu.com/p/db8dce09232dJava中的Unsafe类为我们提供了类似C++手动管理内存的能力。Unsafe类,全限定名是sun.misc.Unsafe,从名字中我们可以看出来这个类对普通程序员来说是“危险”的,一般应用开发者不会用到这个类。...
2021-08-16 13:02:22
119
原创 快速排序和归并排序
排序:所谓排序,即将原本无序的序列重新排列成有序序列的过程。稳定性:稳定性:当待排序列中有两个或两个以上相同的关键字时,排序前和排序后这些关键字的相对位置,如果没有发生变化就是稳定的,否则就是不稳定的。快速排序:快速排序是“交换”类的排序,它通过多次划分操作实现排序。每趟选择一个关键字(通常是第一个),比关键字小的放在左边,比关键字大的放在右边;左右子序列重复执行上述操作。public void quickSort(int[] nums, int low, int high) {
2021-08-15 17:33:06
126
原创 记录一下开发中遇到的问题,以及解决方案。
我负责维护的项目因为业务逻辑变更,需要修改代码逻辑,再提交代码之前,我评估了影响范围有缺失,导致测试人员没有测试完全,导致出现了线上bug。
2021-08-14 23:12:46
124
原创 Java开发手册中关于线程池的要求以及线程池参数
【强制】线程资源必须通过线程池提供,不允许在应用中自行显示创建线程。也就是说,我们尽量使用线程池【强制】线程池不允许使用Executors创建,而是通过ThreadPoolExecutor的方式创建,这样的处理方式能让编写代码的工程师更加明确线程池的运行规则,避免资源耗尽的风险。public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, ...
2021-08-14 22:37:09
178
原创 如何保证消息的顺序性?消息积压解决
如果一个生产者多个消费者的话,生成的数据是数据1、数据2、数据3,消费的数据是数据2、数据1、数据3,此时消费者没有按生产者的顺序。那么如何保证消息的顺序性呢?我们可以使用三个queue,每个消费者就消费其中的一个queue,把需要保证顺序的数据分别发送到不同的queue中。...
2021-08-14 22:24:40
285
原创 乐观锁常见的两种实现方式
1、版本号机制在数据表中加上一个版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读到的version值与当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。2、cas...
2021-08-14 19:21:05
227
原创 sql是否会走索引的几种情况
<、>、BETWEEN走范围索引range。!=、<>不走索引(查看表的索引的语句:show keys from 表名)like 模糊查询 前模糊或者 全模糊不走索引or条件走不走索引:1、只要有一个条件字段没有添加索引,就不走索引。比如:explain select * from users u where u.name = 'mysql测试' or u.password ='JspStudy'password如果没有加所以,这条sql就不会走索引。2、
2021-08-14 16:01:57
4939
原创 《Java开发手册》mysql数据库
一、建表规约1、小数类型为decimal,禁止使用float和double2、表必备三字段:id、gmt_create、gmt_modified3、字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循:1)不是频繁修改的字段。2)不是varchar超长字段,更不是text字段。4、当单表行数超过500万行或者单表容量超过2GB时,才推荐进行分库分表。二、索引规约1、sql性能优化的目标:至少要达到range级别,要求是ref级别,最好是consts。三
2021-08-14 13:05:11
151
原创 in会不会走索引
参考来源:https://www.cnblogs.com/bulushengse/p/12703789.html结论:IN肯定会走索引,但是当IN的取值范围较大时会导致索引失效,走全表扫描当我们执行sql:explain select * from student where sid in(1)得到执行计划,可以看到字段type:consttype:all:没有使用索引,全表扫描index:全部扫描,但是使用了索引,扫描方式是按照索引的顺序range:有范围的索引扫描,相对于in
2021-08-14 09:59:06
6348
转载 session与token的区别
来自:https://blog.youkuaiyun.com/mydistance/article/details/84545768我们先来看session当用户第一次通过浏览器使用用户名和密码访问服务器时,服务器会验证用户数据,验证成功后在服务器端写入session数据,向客户端浏览器返回sessionid,浏览器将sessionid保存在cookie中,当用户再次访问服务器时,会携带sessionid,服务器会拿着sessionid从服务器获取session数据,然后进行用户信息查询,查询到,就会将
2021-08-13 23:15:04
702
原创 ThreadLocal的应用场景
ThreadLocal 用作保存每个线程独享的对象,为每个线程都创建一个副本,这样每个线程都可以修改自己所拥有的副本, 而不会影响其他线程的副本,确保了线程安全。在项目中前后端分离,用户登录后,用户的信息会保存到token中;我们可以在拦截器中解析token,获取用户信息,然后存入到ThreadLocal中,那么当前线程在任何地方如何需要使用用户信息都可以使用ThreadLocal的get()方法来获取。自我语言描述ThreadLocal的实际应用场景:Thr...
2021-08-13 22:40:09
286
原创 20/38 HTTP和HTTPS
HTTP超文本传输协议HTTP协议被用于在浏览器和服务器之间传输信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等信息。为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。(SSL(Secure Sockets Layer 安全套接字协议)HT
2021-08-11 15:29:21
1615
原创 SQL语句中exists和in的区别
参考链接:https://www.cnblogs.com/emilyyoucan/p/7833769.html(快速记忆:in是先查子查询,where是先查主查询)SELECT *FROM `user`WHERE `user`.id IN ( SELECT `order`.user_id FROM `order` )in:in在查询的时候,首先查询子查询的表,然后将内表和外表做一...
2021-08-11 11:51:24
80
原创 5/38 NIO\BIO\AIO的区别和使用场景(HTTP请求时NIO还是BIO)
BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。AIO(NIO.2):异步非阻塞式IO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理.
2021-08-11 11:02:14
727
原创 4/38浏览器输入URL到页面展示发生了什么?
1、请求发起后,浏览器首先会解析这个域名,首先它会查看本地硬盘的hosts文件,看看其中有没有和这个域名对应的规则,如果有的话就直接使用hosts文件里面的ip地址。2、如果在本地的hosts文件没有能够找到对应的ip地址,浏览器会发出一个DNS请求到本地域名服务器。3、本地域名服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果,如果没有,本地域名服务器还要向其他根域名服务器继续发出查询请求报文。4、在拿到域名对应的IP地址后,会以随机端口(1024~~65535)向WEB
2021-08-11 10:31:30
70
原创 2/38 Java锁机制、锁升级
Java锁机制、锁升级Java锁机制从公平性来说可以分为公平锁和非公平锁,从可重入来说可以分为可重入锁和非可重入锁,还可以分为独占锁和共享锁,乐观锁和悲观锁,自旋锁、偏向锁、轻量级锁、重量级锁锁升级:偏向锁、轻量级锁、重量级锁偏向锁会偏向于第一个获取它的线程,如果在接下来的执行过程中,该锁一直没有被其他线程获取,则持有该偏向锁的线程将永远不需要再进行同步。当锁对象第一次被线程获取的时候,虚拟机将会把对象头中的偏向模式设置为“1”,表示进入偏向模式。同时使用cas操作把获得这个锁
2021-08-10 22:54:50
78
原创 1/38 java内存模型
《Java虚拟机规范》定义了“Java内存模型(JMM)”来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。java内存模型中规定所有变量都存储在主内存中,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作必须在工作内存中进行,首先要将变量从主内存拷贝到自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,工作内存中存储着主内存中的变量副本拷贝。工作内存是每个线程的私有数据区域,因此不同的线程间无
2021-08-10 14:16:52
66
原创 redis五个数据类型的应用场景
参考:https://www.cnblogs.com/jasonZh/p/9513948.htmlhash:存储对象list:微博的关注列表,粉丝列表等都可以用redis的list来实现。应用场景:Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择。Set 就是一个集合,集合的概念就是一堆不重复值的组合。利用Redis提供的Set数据结构,可以存储一些集合性的数据。
2021-08-10 11:36:01
100
原创 mysql临时表
MySQL 临时表MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。CREATE TEMPORARY TABLE SalesSummary ( product_name VARCHAR(50) NOT NULL, total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00, avg_unit_price DECIMAL(7,2) NOT NULL DE...
2021-08-08 19:38:15
79
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人