自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL Interview Speedrun

3.readview读视图,它里面定义了一些规则,快照读(直接select)会根据这些规则和事务id,选择一个最合适的版本进行读取,rr可重复读和rc读已提交是不同的,rr只有事务开启的第一次快照读会生成读视图,而rc每次快照读都会生成读视图。1.读未提交,会产生脏读。1.使用左模糊查询like '%xx’时,2.使用联合索引但查询条件不包含联合索引的第一个字段时,3.使用联合索引范围查询右边的字段时,范围查询字段的之后字段的索引失效,4.索引列上运算,5.字段是字符串类型但查询条件没加双引号或单引号时。

2024-01-19 20:27:12 483

原创 Redis Interview Speedrun

全量同步是第一次同步,从节点请求主节点同步数据,主节点检测到是第一次同步数据,然后同步版本信息,把replicationId和offset偏移量给从节点,然后去bgsave生成rdb文件发给从节点读取,生成的途中如果有其他的写操作,则会记录到一个叫repl_baklog的日志文件中,然后把日志文件给从节点同步剩下的。缓存穿透是指对一个不存在的key进行大量并发请求访问,因为不存在,所以直接访问数据库,并且也不会添加到缓存,所以所有请求走的都是数据库,数据库压力过大,容易宕机。redis分布式锁使用场景。

2024-01-19 20:26:04 987

原创 数据库常用锁

锁是计算机中一种用于协调多个进程或线程并发访问共享资源的机制。在数据库系统中,除传统的计算资源(CPU、RAM、I/O)以外,数据也是一种供许多用户共享的重要资源,如何保证数据的并发访问一致性和有效性是数据库系统必须解决的核心问题。而数据库锁就是为了解决这一问题而设计的,在MySQL数据库里就提供了多种类型的锁,通过合理使用这些数据库锁,可以避免数据竞争和并发访问引起的问题,确保数据库操作的正确性和可靠性。

2023-12-11 21:04:35 234 1

原创 CPU密集型和IO密集型与CPU内核之间的关系

CPU密集型:核心线程数=CPU内核数+1IO密集型:核心线程数=CPU内核数*2。

2023-12-07 21:27:44 423

原创 ELK的日志解决方案

然后再定义Controller方法,刚开始使用loadFromDb()把图书数据放到ES里,然后就能用findAll()或者findByStr(bookStr)去从ES里查询数据了,bookStr可以匹配作者、标题、简介。接下来讲一下Logstash的配置,在resources目录下新建logback-spring.xml,里面内容按下面方式配置,然后在yml文件开启日志就行了。创建elk目录,elk目录下创建elasticsearch,logstash,plugins目录。

2023-12-06 21:02:47 305

原创 线程池,及7大参数,4大拒绝策略详解

线程池是一种利用池化技术思想来实现的线程管理技术,旨在复用已创建的线程、方便地管理线程和任务,并将线程的创建和任务的执行解耦。在main方法中定义一个线程池(核心线程数为2,最大线程数为3,空闲线程存活时间为0,阻塞队列大小为2,使用AbortPolicy这种抛异常的拒绝策略)我们再试试其他的,CallerRunsPolicy,使用的是调用者所在的线程所在的main线程。而如果将任务5的时间改为0,则救急线程执行完任务5后就里面执行阻塞队列里的任务3和任务4。执行main,线程池的初始状态如下。

2023-12-05 23:59:46 82

原创 @Scheduled,Quartz,XXL-Job三种定时任务总结

简介@Schedule是Spring框架提供的一种简单的定时任务调度方法,通过注解的方式即可实现定时任务的调度。它适用于简单的定时任务需求,例如每隔一段时间执行一次任务或者在特定时间执行任务。@Scheduled可以轻松地集成到Spring应用中,但在处理复杂地调度需求时可能显得不够灵活。代码示例。

2023-12-04 20:38:35 632

原创 docker全解

总之,Docker 架构是一个客户端-服务器架构,客户端通过 Docker 命令行工具与 Docker Daemon 交互,Docker Daemon 负责管理容器的生命周期,Docker Registry 用于存储和分享 Docker 镜像,Docker 镜像是容器的基础,Docker 容器是 Docker 镜像的运行实例。docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。

2023-12-03 19:35:58 110

原创 JDK6中对synchronized的优化

本文讲解了从jdk6开始使用的 4 种优化 synchronized 的方案,其中锁膨胀和自适应自适应自旋锁是 synchronized 关键字自身的优化实现,而锁消除和锁粗化是 JVM 虚拟机对 synchronized 提供的优化方案(编译器级别的),这些优化方案最终使得 synchronized 的性能得到了大幅的提升,也让它在并发编程中占据了一席之地。

2023-11-30 21:24:52 89

原创 过滤器,拦截器,aop之间差异

AOP(Aspect Oriented Programming):作用对象更加抽象和广泛,不仅局限于拦截请求和访问静态资源,而是通过在连接点上执行额外的逻辑,实现对横切关注点的模块化和重用。在Spring Boot项目中,我们经常会使用到过滤器、拦截器和AOP,来实现一个切面的功能,那么他们之间的差异有哪些,在某个场景下我们应该选择哪个去使用呢?用户请求——>过滤器——>拦截器——>aop切面——>Controller方法——>aop切面——>拦截器——>过滤器——>返回给用户。拦截器与过滤器的区别。

2023-11-29 22:02:05 111

原创 Java代理的三种方式

远程代理(Remote Proxy): 当某个对象位于不同的地址空间,需要通过网络进行远程访问时,可以使用远程代理。远程代理隐藏了对象存在于不同地址空间的事实,使得客户端可以像访问本地对象一样访问远程对象。虚拟代理(Virtual Proxy): 虚拟代理是一种延迟加载的代理,用于按需创建开销较大的对象。在需要时,虚拟代理才会真正创建目标对象,而在目标对象创建之前,虚拟代理可以提供一些占位信息。保护代理(Protection Proxy): 保护代理用于控制对目标对象的访问。

2023-11-28 20:10:42 583

原创 Spring是如何解决循环依赖的

举个例子,看下面代码,有两个类,分别是类A和类B,头上都加上了注解@Component,说明都被Spring管理了,我们再来看两者的属性,类A注入了一个B属性,类B注入了一个A属性,也就是说A依赖于B,并且B也依赖于A,这样的话,创建A对象需要使用B对象,创建B对象又需要使用到A对象,那么就会产生循环依赖,或者叫做循环引用。@Component@Autowired@Component@Autowired当然,循环依赖不只限于两者之间,可以是三者已经相互引用,或者自己引用自己本身。

2023-11-28 01:51:02 37

原创 RPC协议和HTTP的区别

HTTP是Web上数据传输的基础,它是一种无状态、请求-响应协议,客户端向服务器发送HTTP请求,服务器向客户端返回HTTP响应。HTTP协议和实现了RPC协议的框架,都能够去实现跨网络节点之间的一些服务通信,并且他们底层都使用了TCP协议作为通信基础,但是由于RPC只是一种标准协议规范,只要符合RPC协议规范的框架,都属于RPC框架,因此,RPC网络通信协议层也可以使用HTTP协议来实现,比如说gRPC、OpenFeign,它们底层都采用了HTTP协议作为通信基础。HTTP协议是什么?

2023-11-26 15:29:15 31

原创 设计模式——建造者模式(Builder Pattern)

建造者模式可以帮助我们将复杂对象的构建过程与其表示分离,并且可以灵活定制构建过程,使得客户端可以根据需要创建不同配置的产品。通常作为配置类的构建器将配置的构建和表示分离开来,同时也是将配置从目标类中隔离出来,避免作为过多的setter方法。设计模式是在软件开发中常用的一种解决问题的方法论,它提供了一套经过验证和经验积累的解决方案,用于解决特定类型的问题。建造者模式(Builder Pattern)是一种创建型设计模式,用于将复杂对象的构建过程与其表示分离,以便可以按照相同的构建过程构建不同的表示。

2023-11-23 20:35:36 34

原创 HTTP协议和WebSocket协议

WebSocket协议是H5的提出的在单个TCP协议上进行全双工通信的协议,它允许服务器主动向客户端推送数据,客户端和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,并进行双向数据传输,WebSocket是基于HTTP协议的,借助HTTP协议来完成握手。HTTPS就是加密的HTTP,它通过HTTP进行通信,利用SSL/TLS建立安全信道,加密数据包,是计算机网络进行安全通信的传输协议。其中,SYN 是同步序列编号的缩写,用于建立连接;这个过程中,客户端和服务器都确认彼此能够通信,建立了连接。

2023-11-23 00:49:56 79

原创 HashMap和ConcurrentHashMap的区别

在segment中的put方法,加锁lock(),再次hash确定存放的hashEntry数组中的位置,在链表中根据hash值和equals方法进行比较,如果相同就直接覆盖,如果不同就插入到链表中,最后把锁给释放。如果把上面的执行用一句话来归纳的话,就相当于是ConcurrentHashMap通过对头结点加锁来保证线程安全,这样设计的好处是使得锁的粒度相比segment来说更小了,发生hash冲突和加锁的频率也更低了,而在并发场景下的操作性能也提高了,数据量大的时候,查询性能也得到了进一步的提升。

2023-11-22 00:00:25 274

原创 OSI七层模型

数据到达物理层后,变成信号传输。传输层为网络中的主机提供端到端的通信,即计算机程序到程序之间的通信,使源端和目的端主机上的对等实体可以进行会话,可以理解为小明使用QQ发送消息,那么小红要接收消息也得使用QQ而不能使用微信。总之,TCP和UDP都是传输层的协议,TCP提供可靠的数据传输和拥塞控制,适用于对数据传输可靠性要求高的应用;计算机接收到“你好”2个字之后,它会对数据进行格式转换,转换为计算机自己能够理解的语言,也就是二进制的0和1的组合,当然表示层还有其他功能,比如说是安全加密,压缩解压等。

2023-11-20 20:41:38 232

原创 gitlab的搭建流程

打开网页,输入linux虚拟机ip(http://192.168.102.100/)进入gitlab,输入用户名密码登录。再次查询gitlab的内存占用(2.5G,比之前的3.8G少占了1.3G内存)创建gitlab文件夹和它下面的config,logs,data文件夹。复制链接,打开idea进行克隆(记得把链接第一段改为虚拟机ip)查询docker镜像gitlab-ce(gitlab社区版)使配置生效并重启容器(在容器内分别执行下面的两条命令)查询gitlab的内存占用(3.8G)

2023-11-18 17:28:06 93

原创 生产者消费者模型

在不使用缓冲区的情况下,如果生产者生产一件产品完成,而没有消费者来取(处理数据太慢),生产者就不能生产下一个,直到消费者取走(处理完成),这大大降低生产者的生产效率。而使用了缓冲区,生产者每生产一个就可以往缓存里一丢,缓存一有东西消费者就可以来取,两者的工作互不影响,可以异步进行。等生产者的制造速度慢下来,消费者再慢慢处理掉,由此可以平衡生产和消费的速度,提高系统的稳定性。如果生产者直接调用消费者的方法,那么生产者就会对消费者产生依赖(耦合),之后要是消费者的方法代码发生改变,说不定会影响到生产者。

2023-10-30 20:11:28 87 1

原创 数据库分表分库的原则

在管理层面,如果需要删除某一个分区的数据,只需要删除对应的分区即可。分区一般都是放在单机里的,用的比较多的是时间范围分区,方便归档。随着业务量的增长,数据量也会随之增加,当单表的数据量达到千万行以后,数据库性能显著降低,并且优化索引、添加从库等方案可能对数据库性能提升效果不明显,此时就要考虑对其进行切分了。上述例子将orders表按照date列的年份进行范围分区,并在每个年份分区中使用哈希分区,将数据分散到4个子分区中。列表分区表:根据一个离散的值列表将数据分区,通常用于按照特定列的值进行分区。

2023-10-28 23:59:46 130 1

原创 ThreadLocal对象的使用

ThreadLocal 是Java中的一个线程局部变量。当使用 ThreadLocal 维护变量时,ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程。

2023-10-25 22:03:11 45

原创 线程安全之CAS

对变量V执行CAS操作,如果V等于预期值E,说明该变量没有被其他线程修改过,就将V的值更新为N;如果V的值不等于预期值E,则说明该变量被其他线程进行更改过了,所以不进行更新操作,接下来就是重新读取V值进行CAS操作再次尝试更新变量。线程安全问题指的是在多线程环境下,对共享资源的访问和操作而导致数据的不一致或不正确的结果。在多线程编程中,由于线程的并发执行,多个线程可能同时访问和修改共享的数据,如果没有合适的同步机制,就会出现竞态条件(Race Condition)和数据冲突等问题。

2023-10-24 20:30:54 124

原创 搭建nexus私服部署项目

为防止每次新创建项目时maven配置重置为默认,可按如下图进入配置。之后新建的项目中,我们可以直接在pom.xml中引入了。pom中部署maven(多模块开发在父pom中设置)查看nexus仓库,已经部署成功。配置activeProfile。

2023-10-23 19:40:02 32

原创 RBAC-基于角色权限的模型

RBAC(Role-Based Access Control)是一种基于角色权限的访问控制模型。它是一种将系统访问权限限制在授权用户范围内的方法,该范围是根据用户在组织中的角色来确定的。RBAC将权限分配给角色,而不是个别用户,从而更容易管理访问权限和执行安全策略。用户根据其职责被分配特定的角色,这些角色确定了他们在系统中可以执行的操作。RBAC帮助组织提高安全性,简化访问管理,并减少未经授权的访问或数据泄露的风险。

2023-10-23 00:31:07 29

原创 redis的五种常用数据类型

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统,是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它支持多种数据结构(数据类型),通常被称为数据结构服务器。

2023-10-19 21:17:06 40 1

原创 SpringBoot项目中缓存Cache的使用

当调用被@Cacheable注解标记的方法时,Spring Boot会首先在缓存中查找对应的结果,如果找到则直接返回缓存中的结果,否则执行方法的逻辑,并将方法的返回值存储到缓存中。@Cacheable注解可以指定缓存的名称和缓存的key,以及其他的一些属性。当调用被@CacheEvict注解标记的方法时,Spring Boot会先执行方法的逻辑,然后从缓存中删除对应的数据。与@Cacheable不同的是,@CachePut注解会执行方法的逻辑,并将方法的返回值存储到缓存中,而不会先在缓存中查找结果。

2023-10-18 20:21:07 199 1

原创 SpringMVC的工作流程

Spring MVC 是 Spring 框架中的一个模块,它是一个基于 MVC(Model-View-Controller)架构的 Web 框架,用于构建 Web 应用程序。Spring MVC 提供了一种灵活、可扩展的方式来处理 Web 请求和响应,将业务逻辑与视图解耦,使开发人员可以更专注于业务逻辑的实现。

2023-10-17 20:11:36 57

原创 mysql数据库引擎-InnoDB,MyISAM

​ 数据库引擎是数据库管理系统(DBMS)的核心组件之一,用于管理和处理数据库中的数据。它负责数据的存储、检索、更新和删除等操作,以及处理数据库事务、并发控制、数据完整性和安全性等方面的功能。​ 数据库引擎提供了一种将数据存储在物理设备上的方式,并提供了一套操作和管理这些数据的接口。它定义了数据的组织结构、存储格式、索引方式和查询优化等方面的规则和算法。

2023-10-16 19:57:29 67 1

原创 企业中私服maven仓库Nexus

由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。(Version policy=Snapshot)只允许上传带SNAPSHOT版本尾缀的包,默认部署策略是Allow redeploy,允许重复上传相同版本号信息的jar,每次上传的时候会在jar的版本号上面增加时间后缀信息。配置镜像(以下的配置二选一)(由于中央仓库在境外,网络访问不稳定,故在开发过程中大多配置中央仓库的镜像仓库)

2023-10-12 20:18:48 96

原创 对spring boot项目的接口测试和并发测试

Swagger是一组围绕 OpenAPI 规范构建的开源工具,可帮助您设计、构建、记录和使用 REST API。主要的 Swagger 工具包括:Swagger Editor – 基于浏览器的编辑器,您可以在其中编写 OpenAPI 规范。swagger2于17年停止维护,现在最新的版本为 Swagger3(Open Api3)。JMeter是一个用于性能测试和负载测试的开源工具。JMeter官方网站(https://jmeter.apache.org/)下载JMeter,并按照官方文档中的说明进行安装。

2023-10-11 20:08:56 743

原创 springboot整合Dockerfile

ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。​ 使用指令使容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可以共享给其它容器。​ 用于指定维护者的信息,用于为Dockerfile署名。

2023-10-10 20:01:32 406 3

原创 docker中的mysql主从数据库搭建

5. 切换到从服务器3310,修改从服务器与master关联,并开启slave,查询slave状态,当出现2个Yes时主从搭建成功(Navicat不支持show slave status \G命令,直接进容器mysql_3310里面查询,从3311也是同样配置)6 .创建从服务器的只读账号,这样,从服务器用只读账号连接数据库就无法修改数据了。3. 进入主服务器中创建与从服务器通信的用户slave。4. 查看master状态,记住以下的两个值。

2023-10-09 18:58:09 60 2

原创 docker的常用命令

2. docker pull mysql:版本号/docker pull+刚才查询到的name——拉取mysql镜像,后面不加:版本号就默认拉取的是最新版的mysql镜像。5. docker run -it --name xxx(自定义容器名称) -e MYSQL_ROOT_PASSWORD=123 -d+镜像名称——创建并运行容器。18. docker run -v linux文件/文件夹位置:容器的文件/文件夹位置——在创建运行容器时将容器内部文件挂载到linux指定文件上,保证数据持久化。

2023-10-08 19:27:34 52 1

原创 数据量过大时的深度分页优化以及前端优化

1.首先我想到的第一种方法是内嵌子查询,查出符合条件的所有id,然后通过id来查询所要的数据,由于id是主键,这样就能走最快的聚簇索引,提高查询速度,优化后的sql查询语句为select * from task where id in (select id from (select id from task where publisherId = 5 limit 1000000,10) as a) order by id。4.另外,还有种更快的优化方式,就是不用limit?

2023-08-11 01:26:14 1277 1

原创 对MySQL数据库索引的基本理解

2.而MySQL数据库的索引和刚才的简易索引的原理其实差不多,并且进行了改进,他们发现目录项和用户记录差不多,只不过目录项中的两个列是主键和页号而已,所以他们复用了之前存储用户记录的数据页来存储目录项,利用记录头信息里的record_type属性来区分是目录项记录(1)还是普通的用户记录(0),另外还有最小记录(2),最大记录(3),将前面使用的目录项放到数据页就像下面的图一样。6.那么,一个完整的数据库查找应该是这样的:先逐页遍历,确定页,然后在页内通过二分查找加线性遍历的方式找到最终的数据。

2023-07-28 18:01:24 76 1

原创 JavaScript普通方法调用和把方法当作参数的方法调用以及Java中的lambda表达式

sum=1^2*2^2*3^2*..*10^2,使用anthingOfAnything(10,x=>x*x,((x,y)=>x*y),1),结果为13168189440000。第三题的sum=1^3+2^3+3^3+...+5^3,sumOfAnything(5,x=>x*x*x),输出结果为225。第二题的sum=1^2+2^2+3^2+..+10^2,sumOfAnything(10,x=>x*x),输出结果为385。2.假如我们要求sum=1^2+2^2+3^2+..+n^2。

2023-07-05 20:01:48 221

原创 二叉树的遍历和Map的性能分析

map的两种常用操作get和set,get(17) -> {return arr[17%10];->...->list.get(i)==17,时间复杂度为O(n)1.List和Map查找的区别,以arr = {10,11,22,13,4,5,16,17,48,69}为例,2.二叉树的添加数据方法(这里是以二叉排序树的方式添加,左子树<根结点<右子树)(2)Map是17%10=7 -> arr[7],时间复杂度为O(1);6.二叉树的添加、遍历测试。

2023-07-04 20:21:12 91

原创 排序实现及时间复杂度分析

若数组长度为n,则第i层,有2^i个子问题,每个子问题长度为n/2^i,运算次数为n,共有log2(n)层,总共的运算次数为nlog2(n),所以时间复杂度为O(nlogn)。设sort()的时间复杂度为f(n),merge的时间复杂度与数组a长度n有关,为O(n),令其为cn,则f(n)=2*f(n/2)+cn。令n=2^k,则k=log2(n),所以f(n)=nf(1)+cnlog2(n)=O(nlogn),时间复杂度为O(nlogn)。递归调用sort排序前后两部分。

2023-07-03 19:36:40 73 1

空空如也

空空如也

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

TA关注的人

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