自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(311)
  • 问答 (3)
  • 收藏
  • 关注

原创 centos安装以及镜像

https://zhuanlan.zhihu.com/p/79047510镜像保存在阿里云网盘中。

2021-09-02 09:36:30 600

原创 redis作为分布式锁很好的一篇文章

来源:https://www.cnblogs.com/gxyandwmm/p/9588383.html

2021-08-26 15:14:16 581

原创 MySQL的索引使用了B+树的数据结构。那么为什么不用B树呢?

B+树只有叶子结点包含实际的值,B+树的叶子结点都是相连的,因此对整棵树的遍历只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以查找效率没有B+树好。...

2021-08-26 14:47:37 817

原创 项目流程中用到的环境

一个软件产品从开发到用户使用都涉及哪些环境?开发环境、测试环境、回归环境、预发布环境、生产环境。回归环境:回归bug的环境,其实就是我们的测试环境,在测试环境上测试、回归验证bug。预发布环境和生产环境区别:1)预发环境中新功能为最新代码,其他功能代码和生产环境一致。2)预发环境和生产环境的访问域名不同。另外,还有个灰度发布,发生在预发布环境之后,生产环境之前。生产环境一般会部署在多台机器上,以防某台机器出现故障,这样其他机器可以继续运行,不影响用户使用。灰度发布会发布到其中的几台机

2021-08-26 14:38:26 254

原创 自定义注解的应用场景

参考:https://blog.csdn.net/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 381

原创 spring和spring boot相关

AOP意为面向切面编程,它是一种编程思想,是面向对象编程(OOP)的一种补充,AOP将一些程序抽象成切面,可以保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能。使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。通知(Advice):切面必须要完成的工作。即,它是类中的一个方法。五种增强/通知前置通知(@Before)后置通知(@Ater)返回通知(@AfterReturning)异常通知(@AfterThrowing)环绕通知(@Aroun

2021-08-20 14:39:25 66

原创 redis过期键删除和内存淘汰策略

Redis的过期键删除策略:定时删除、惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,那就返回该键;定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于删除多少过期键,以及要检查多少个数据库,则由算法决定。Redis服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种删除策略,服务器可以很好地在合理使用CPU时间和避免浪费内存空间之间取得平衡。内存淘汰策略:长期将Redis作为缓存使

2021-08-20 11:13:26 81

原创 redis持久化

Redis持久化RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘,它恢复时是将快照文件直接读到内存里。RDB的缺点是最后一次持久化后的数据可能丢失。我们默认的就是RDB,一般情况下不需要修改这个配置。rdb保存的文件是dump.rdb。AOF(Append Only File)将我们的所有命令都记录下来,以日志的形式来记录每个写操作,将redis执行过的所有指令记录下来,只许追加文件,不可以改写文件。redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根

2021-08-20 11:04:23 58

原创 数据库三范式

参考:https://www.cnblogs.com/JTrun/p/11069652.html第一范式(1NF):每一列都是不可分割的原子数据项第二范式(2NF):在1NF基础上,非码属性必须完全依赖于候选码第三范式(3NF):在2NF的基础上,任何的非主属性不依赖于其他非主属性...

2021-08-20 10:36:36 57

原创 ReentrantLock是一个悲观锁

ReentrantLock底层是由AQS实现的,ReentrantLock机制可以说是实打实的悲观锁。来自:https://blog.csdn.net/qq_35688140/article/details/101223701众所周知,ReentrantLock是一个悲观锁,但是查看源码,发现底层实现使用的是compareAndSet相关方法实现的,于是产生疑问:为什么ReentrantLock使用的和CAS一样的compareAndSet相关的方法实现的,CAS确实乐观锁,ReentrantLo

2021-08-19 22:42:16 2009 1

原创 接口响应过慢的原因排查

接口响应过慢的原因排查排查的顺序:1、确定是哪个接口存在性能问题2、确定这个接口的内部逻辑是怎样的,做了哪些事情3、分析接口存在性能问题的根本原因4、寻找确立优化方案5、回归验证方案效果接口慢排查:一般会从以下几个方面入手:1.是不是资源层面的瓶颈,硬件、配置环境之类的问题2.针对查询类接口,是不是没有添加缓存,如果加了,是不是热点数据导致负载不均衡3.是不是有依赖于第三方接口,导致因第三方请求拖慢了本地请求4.是不是接口涉及业务太多,导致程序执行跑很久5.是不是sql层面

2021-08-19 22:12:23 13408

原创 更加深入的认识索引

如果经常需要同时对两个字段进行AND查询,那么使用两个单独索引不如建立一个复合索引,因为两个单独索引通常数据库只能使用其中一个,而使用复合索引因为索引本身就对应到两个字段上的,效率会有很大提高。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c)。 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找。...

2021-08-19 21:35:47 57

原创 会触发JVM进行full gc的情况

会触发JVM进行full gc的情况:1、System.gc()方法的调用2、老年代空间不足3、堆中分配很大的对象所谓大对象,是指需要大量连续内存空间的java对象,例如很长的数组,此种对象会直接进入老年代,而老年代虽然有很大的剩余空间,但是无法找到足够大的连续空间来分配给当前对象,此种情况就会触发JVM进行Full GC。...

2021-08-19 16:51:43 239

原创 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 62

原创 跳表的学习

什么是跳表跳表全称为跳跃列表,它允许快速查询,插入和删除一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表,且每一层链表中的元素是前一层链表元素的子集。一开始时,算法在最稀疏的层次进行搜索,直至需要查找的元素在该层两个相邻的元素中间。这时,算法将跳转到下一个层次,重复刚才的搜索,直到找到需要查找的元素为止。增加了向前指针的链表叫作跳表。跳表全称叫做跳跃表,简称跳表。跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链

2021-08-19 11:40:00 74

原创 ThreadPoolExecutor二次学习

参考链接:https://blog.csdn.net/qq_39104442/article/details/90378858多线程以及并发变成已经成为了必问的问题,今天就来总结下多线程在项目中的应用以及线程池的使用。多线程的使用: 比如在庞大的项目中,一个请求中,可能要调用N多个服务, 比如调用积分服务,订单服务,地址服务,库存服务或者一些其他公司的服务等,多次调用过程中如果每个服务都用掉500ms,那么整体的时长就是n*500,。so,这个时间是无法忍受的, 所以就要使用多线程来干这个事情了。.

2021-08-19 09:52:03 69

原创 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 96

原创 坚持梦想,发奋图强

2024年5月13日再回头看

2021-08-17 16:48:35 64

原创 Docker和k8s简介

Docker是一个容器引擎,开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到Linux或Windows机器上。Kubernetes是容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处

2021-08-16 17:52:30 144

原创 Unsafe类

参考:https://www.jianshu.com/p/db8dce09232dJava中的Unsafe类为我们提供了类似C++手动管理内存的能力。Unsafe类,全限定名是sun.misc.Unsafe,从名字中我们可以看出来这个类对普通程序员来说是“危险”的,一般应用开发者不会用到这个类。...

2021-08-16 13:02:22 94

原创 快速排序和归并排序

排序:所谓排序,即将原本无序的序列重新排列成有序序列的过程。稳定性:稳定性:当待排序列中有两个或两个以上相同的关键字时,排序前和排序后这些关键字的相对位置,如果没有发生变化就是稳定的,否则就是不稳定的。快速排序:快速排序是“交换”类的排序,它通过多次划分操作实现排序。每趟选择一个关键字(通常是第一个),比关键字小的放在左边,比关键字大的放在右边;左右子序列重复执行上述操作。public void quickSort(int[] nums, int low, int high) {

2021-08-15 17:33:06 95

原创 记录一下开发中遇到的问题,以及解决方案。

我负责维护的项目因为业务逻辑变更,需要修改代码逻辑,再提交代码之前,我评估了影响范围有缺失,导致测试人员没有测试完全,导致出现了线上bug。

2021-08-14 23:12:46 92

原创 Java开发手册中关于线程池的要求以及线程池参数

【强制】线程资源必须通过线程池提供,不允许在应用中自行显示创建线程。也就是说,我们尽量使用线程池【强制】线程池不允许使用Executors创建,而是通过ThreadPoolExecutor的方式创建,这样的处理方式能让编写代码的工程师更加明确线程池的运行规则,避免资源耗尽的风险。public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, ...

2021-08-14 22:37:09 136

原创 如何保证消息的顺序性?消息积压解决

如果一个生产者多个消费者的话,生成的数据是数据1、数据2、数据3,消费的数据是数据2、数据1、数据3,此时消费者没有按生产者的顺序。那么如何保证消息的顺序性呢?我们可以使用三个queue,每个消费者就消费其中的一个queue,把需要保证顺序的数据分别发送到不同的queue中。...

2021-08-14 22:24:40 228

原创 乐观锁常见的两种实现方式

1、版本号机制在数据表中加上一个版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读到的version值与当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。2、cas...

2021-08-14 19:21:05 191

原创 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 4411

原创 《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 116

原创 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 5254

转载 session与token的区别

来自:https://blog.csdn.net/mydistance/article/details/84545768我们先来看session当用户第一次通过浏览器使用用户名和密码访问服务器时,服务器会验证用户数据,验证成功后在服务器端写入session数据,向客户端浏览器返回sessionid,浏览器将sessionid保存在cookie中,当用户再次访问服务器时,会携带sessionid,服务器会拿着sessionid从服务器获取session数据,然后进行用户信息查询,查询到,就会将

2021-08-13 23:15:04 519

原创 ThreadLocal的应用场景

ThreadLocal 用作保存每个线程独享的对象,为每个线程都创建一个副本,这样每个线程都可以修改自己所拥有的副本, 而不会影响其他线程的副本,确保了线程安全。在项目中前后端分离,用户登录后,用户的信息会保存到token中;我们可以在拦截器中解析token,获取用户信息,然后存入到ThreadLocal中,那么当前线程在任何地方如何需要使用用户信息都可以使用ThreadLocal的get()方法来获取。自我语言描述ThreadLocal的实际应用场景:Thr...

2021-08-13 22:40:09 253

原创 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 689

原创 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 63

原创 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 607

原创 4/38浏览器输入URL到页面展示发生了什么?

1、请求发起后,浏览器首先会解析这个域名,首先它会查看本地硬盘的hosts文件,看看其中有没有和这个域名对应的规则,如果有的话就直接使用hosts文件里面的ip地址。2、如果在本地的hosts文件没有能够找到对应的ip地址,浏览器会发出一个DNS请求到本地域名服务器。3、本地域名服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果,如果没有,本地域名服务器还要向其他根域名服务器继续发出查询请求报文。4、在拿到域名对应的IP地址后,会以随机端口(1024~~65535)向WEB

2021-08-11 10:31:30 44

原创 2/38 Java锁机制、锁升级

Java锁机制、锁升级Java锁机制从公平性来说可以分为公平锁和非公平锁,从可重入来说可以分为可重入锁和非可重入锁,还可以分为独占锁和共享锁,乐观锁和悲观锁,自旋锁、偏向锁、轻量级锁、重量级锁锁升级:偏向锁、轻量级锁、重量级锁偏向锁会偏向于第一个获取它的线程,如果在接下来的执行过程中,该锁一直没有被其他线程获取,则持有该偏向锁的线程将永远不需要再进行同步。当锁对象第一次被线程获取的时候,虚拟机将会把对象头中的偏向模式设置为“1”,表示进入偏向模式。同时使用cas操作把获得这个锁

2021-08-10 22:54:50 49

原创 1/38 java内存模型

《Java虚拟机规范》定义了“Java内存模型(JMM)”来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。java内存模型中规定所有变量都存储在主内存中,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作必须在工作内存中进行,首先要将变量从主内存拷贝到自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,工作内存中存储着主内存中的变量副本拷贝。工作内存是每个线程的私有数据区域,因此不同的线程间无

2021-08-10 14:16:52 49

原创 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 67

原创 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 66

原创 mysql优化(这里主要指sql语句优化)

参考链接:https://blog.csdn.net/qq_35571554/article/details/82800463MySQL慢查询就是在日志中记录运行比较慢的SQL语句。现在要对SQL慢查询优化:每周从平台中导出生产数据库的慢查询文件进行分析,进行SQL优化的手段也主要是修改SQL写法,或者新增索引。步骤:1、数据库中设置SQL慢查询,开启mysql慢查询修改配置文件在my.ini增加几行: 主要是慢查询的定义时间(超过2秒就是慢查询),以及慢查询log日志记录( slo.

2021-08-08 19:19:05 81

原创 序列化、反序列化、serialVersionUID

序列化:把对象转换为字节序列的过程称为对象的序列化。反序列化:把字节序列恢复为对象的过程称为对象的反序列化。java如何实现序列化实现Serializable接口即可JAVA序列化的机制是通过 判断类的serialVersionUID来验证的版本一致的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较。如果相同说明是一致的,可以进行反序列化,否则会出现反序列化版本一致的异常,即是InvalidCastExce

2021-08-07 23:17:21 114

空空如也

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

TA关注的人

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