- 博客(35)
- 收藏
- 关注
原创 了解MySQL 开发规范
数据库的主要职责是存储和管理数据,而不是执行复杂的计算。尤其是涉及到大量数据时,数据库的负荷会变得沉重,影响系统性能。将复杂运算移到业务应用层,有助于分担数据库的压力。
2024-02-03 09:54:19 913
原创 MySQL性能优化
分库分表中间件是一种简化分库分表操作和管理的工具,它提供了自动化的分片、路由等功能,减轻了开发人员和数据库管理员的负担。这样一来,每个小表的数据量减少,查询速度相对提高,同时减轻了单表的负担。面对大数据量的情况下,采用分库分表策略是一种有效的手段,可以显著提高查询速度、降低单表数据量,从而增强数据库的性能和扩展性。通过调整MySQL的配置参数,我们可以更好地适应不同的系统环境,提升数据库的性能表现。索引在MySQL中扮演着关键角色,良好的索引设计可以显著提升查询效率。
2024-02-03 09:53:46 905
原创 JVM之Java内存区域
堆区是Java虚拟机中用于存储对象实例的内存区域。在堆区中,每个对象都有唯一的地址标识,可以通过该地址访问对象。栈区是Java虚拟机中用于存储局部变量、操作数栈、方法出口等数据的内存区域。每个线程都有自己的栈,用于存储线程私有的数据。本地方法栈是Java虚拟机中用于存储本地方法(Native Method)的内存区域。本地方法是用其他语言(如C、C++)编写并通过Java本地接口(JNI)调用的方法。程序计数器是一块较小的内存区域,用于存储当前线程正在执行的字节码指令地址。
2024-02-03 09:53:10 1247
原创 深入Spring MVC的工作流程
通过对Java应用程序中Spring MVC框架中HTTP请求的流程进行了解,我们总结一下其基本流程:用户发起请求,请求首先被转发到DispatcherServlet,它是Spring MVC的前端控制器。DispatcherServlet的主要任务是统一处理用户发来的请求和响应,扮演着中央协调者的角色,有助于减少各组件之间的耦合性。
2024-02-03 09:51:18 1820
原创 Spring容器启动流程
refresh()主要用于容器的刷新,Spring 中的每一个容器都会调用 refresh() 方法进行刷新,无论是 Spring 的父子容器,还是 Spring Cloud Feign 中的 feign 隔离容器,每一个容器都会调用这个方法完成初始化。⑥ registerBeanPostProcessors(beanFactory):向容器中注册Bean的后置处理器BeanPostProcessor,它的主要作用是干预Spring初始化bean的流程,从而完成代理、自动注入、循环依赖等功能。
2024-01-19 23:00:49 425 1
原创 Redis与数据库双写一致性问题
所谓的双写一致性是当修改数据库的数据也要同时更新缓存数据,数据库和缓存要保持一致。因为写和读是并发操作,没法保证顺序,就会出现缓存和数据库的数据不一致的问题。讨论这个问题的前提是明确业务场景。如果业务一致性要求比较高,需要采用的是一种方案,如果业务允许延迟一致,则又是另一种方案。
2024-01-19 17:45:05 532
原创 CPU密集型与IO密集型任务_线程池配置
在使用线程池时,我们需要根据任务类型的不同进行优化配置。这里介绍一下CPU密集型和IO密集型任务的特点,并研究在这两种场景下使用线程池时应该注意的事项。
2023-12-07 20:25:12 441
原创 基于ELK的日志解决方案_安装_测试
ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称,它是一套企业级日志解决方案。Elasticsearch:分布式搜索和分析引擎,具有高可伸缩、高可靠和易管理等特点。基于 Apache Lucene 构建,能对大容量的数据进行接近实时的存储、搜索和分析操作。通常被用作某些应用的基础搜索引擎,使其具有复杂的搜索功能。Logstash:数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置。
2023-12-06 20:37:46 60
原创 线程池_ThreadPoolExecutor参数_拒绝策略介绍
默认的拒绝策略是中止策略。当线程池无法接受新的任务时,中止策略会让executor抛出一个RejectedExecutionException。适用场景:适用于对任务丢失敏感的场景,当线程池无法接受新任务时,希望立即知道并处理该异常。
2023-12-05 23:41:44 51
原创 Schedule、Quartz和xxl-job
fixedRate,按照指定频率执行任务,并以此规则开始周期性的执行调度。当方法的执行时间超过任务调度频率时,调度器会在当前方法执行完成后立即执行下次任务。在Springboot中,Schedule的使用非常简单,只需要在入口类或配置类加上@EnableScheduling注解就可以启用定时任务。运行容器后,通过http://自己的IP:设置的端口/xxl-job-admin/可以进入管理页面。fixedDelay,下一次的任务执行时间,是从方法最后一次任务执行结束时间开始计算。完成xxl-job配置类。
2023-12-04 20:20:48 159
原创 学习synchronized关键字
使用 synchronized 关键字来保证线程安全往往被视为一种相对简单粗暴的手段,因为它在一定程度上隐藏了底层的锁机制,简化了线程同步的编码过程。但是,这种方式也带来了一些问题,比如锁的粒度过大、阻塞式等待等问题,会导致性能瓶颈和竞争问题。在 JDK 1.6 中,针对 synchronized 进行了一些优化,包括偏向锁、轻量级锁和自旋锁等,以减少其在某些情况下的性能开销。这些优化使得 synchronized 的性能得到了显著提升。
2023-11-30 20:36:50 50
原创 过滤器、拦截器和AOP的区别
它可以在请求进入Servlet之前进行预处理操作,也可以在响应离开Servlet之后进行后处理操作。过滤器的实现方式是通过实现javax.servlet.Filter接口,并重写其中的doFilter方法来处理请求和响应。与过滤器类似,拦截器也可以在请求进入Controller之前进行预处理操作,也可以在响应离开Controller之后进行后处理操作。AOP,面向切面编程是一种重要的编程思想,它将横切关注点(如安全管理、事务控制、日志记录等)与业务逻辑分离,通过统一的处理方式来完成这些横切关注点的功能。
2023-11-29 22:51:17 66
原创 JAVA中代理实现的三种方式
代理(Proxy)是一种设计模式,它提供了访问目标对象的另一种方式。通过代理对象访问目标对象可以带来诸多好处,比如在不修改目标对象的基础上,增加额外的功能操作,从而扩展了目标对象的功能。这种方法体现了一个编程中重要的思想:避免随意修改他人已经编写的代码或方法,而是通过代理的方式来对其进行扩展和增强。代理模式的实现可以分为两类,动态代理和静态代理。其中动态代理有可以分为jdk动态代理和cglib动态代理两种。
2023-11-28 20:07:27 897
原创 Spring如何解决循环依赖_三级缓存
由于 prototype 作用域的bean,Spring容器每次都会生成一个新的对象,所以没办法通过类似单例的方法解决循环依赖问题。简单地,以A依赖B,B依赖A为例,当实例化A时,我们通过调用doGetBean(“A”)来完成。当B对象初始化完成后,再回到A对象的属性填充阶段,此时可以获取到B对象,并成功完成属性填充。通过提前暴露对象并利用Map进行缓存,避免了重复实例化的情况,确保了循环依赖的正确处理。循环依赖指的是就是两个或多个bean相互之间的引用,A引用B,B引用C,C又引用A,最终形成一个循环。
2023-11-28 08:53:09 51
原创 RabbitMQ保证数据一致性的策略
第一个参数message对象中的deliveryTag,第二个参数,true的时候不接收消息,第三个参数,是否将消息恢复到Rabbitmq的消息队列中,重复发送,直到异常处理结束。channel.basicAck(deliveryTag,false)参数:第一个就是message对象中的deliveryTag ,消息的标识符,第二个参数就是是否接收消息。当消息没有交换机发送到匹配的队列中,则会触发ReturnCallback回调方法,根据用户的抉择,判断是否需要返回给消息生产者。
2023-11-22 23:17:39 643
原创 HashMap与ConcurrentHashMap
HashMap是java.util包下的一个存储键值对数据的集合。它的底层是数组+链表的结构,在JDK1.8以后又引入了红黑树。/*** 底层的数组*//***链表结构*/V value;// ...HashMap中hash的含义Object类有一个hashCode方法,它返回一个int类型的值。在同一个Java程序执行过程中,对同一个对象多次调用hashCode方法,返回结果始终相同。
2023-11-21 23:44:41 60 1
原创 OSI模型及TCP/IP介绍
它们都是网络通信模型,但TCP/IP模型进行了简化和合并,将会话层、表示层合并到了应用层中,同时将数据链路层和物理层合并成了链路层,没有明确的第五、第六层。在OSI参考模型中,有七层模型,而TCP/IP只是其中的一种协议族,它并没有完全对应于OSI的七层模型,而是进行了简化和合并,形成了这个四层模型。TCP/IP最常用的传输层协议是TCP和UDP。UDP则是非面向连接、不可靠的传输协议,无序传递。它将网络通信模型分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
2023-11-20 19:26:48 71 1
原创 生产者消费者模型
在一个多线程系统中,存在着两种线程,负责生产数据的“生产者”,负责消费数据的“消费者”。在这两者之间有一个缓冲区——阻塞队列。它对任务的生产和消费实现了分离。
2023-10-30 20:14:27 41 1
原创 数据库分库分表
并且根据用户和商品的ID等信息,对数据量大的表进行分表,确保每张表的数据量相对平衡。像热门商品的信息可以平均的存在不同表中,以减轻单表的压力。如果数据库中表的数量达到了几百上千张,如此多的业务模块都依赖于这个数据库,它的压力会非常大。根据订单创建时间的范围来进行分片,将订单信息按时间段存储到不同的表中。当表的数据达到了千万级别,再做很多操作都会碰到性能问题,这时候就要考虑进行分表了。每个数据库结构和数据都不相同,所有库数据的并集就是全部数据。垂直切分的优点是可以解决业务层面的耦合,便于维护和拓展。
2023-10-30 01:22:10 38 1
原创 Threadlocal介绍与简单使用
多线程同时访问一个共享变量时容易出现并发问题。一般访问者在访问共享变量时需要进行如“加锁”的同步措施,才能实现线程安全。Threadlocal是另外一种解决这类线程安全问题的方法。它的思路是为每一个线程创建一个数据副本,实现线程间的数据隔离,避免线程安全问题。
2023-10-25 20:21:10 31 1
原创 多线程的CAS
CAS的全称是Compare And Swap,是本质是一种并发算法,它是乐观锁的一种实现,用于解决并发环境下的数据竞争问题。CAS的基本流程是,线程把数据更新到主内存时会再次读取主内存变量的值,如果与期望值相等,将新值写入内存,并返回操作成功。如果不相等,说明其他线程已经修改了共享变量的值,当前线程需要重新尝试或执行其他逻辑。乐观锁和悲观锁,两种不同的锁策略。它们都是用来解决多线程中出现的数据竞争问题。乐观锁认为冲突很少发生,在读的时候不会阻塞其他线程的写操作。
2023-10-24 20:36:17 40 1
原创 搭建nexus私服_部署项目
将release和snopshot库导入maven-public,主要是为了看到自定义仓库里的东西。只需要改一下Name,Version policy,deployment policy即可。实际开发中一般会把仓库分为release和snopshot版本库。因为nexus的安装和搭建之前已经写过了,因此今天略过前面的步骤。release表示公开版本,snopshot表示快照版本。id的名字是不能重复的,在pom中引入时用的就是这个名字。配置一下本地仓库的位置,配过的忽略。
2023-10-23 19:41:21 62
原创 RBAC_基于角色的权限模型
销售经理是销售员的上级,所以用户一旦拥有了销售经理的角色,就必然拥有销售员的角色。用户和角色,角色和权限都是多对多的关系。责任分离原则:即给比较重要或者敏感的事件设置不同的角色,不同的角色间是相互约束的,由其一同参与完成。数据抽象原则:每个角色都只能访问其需要的数据,而不是全部数据,不同的角色能访问到的数据也不同。例如,初高级销售员可以进行更精细的划分,高级销售员初级销售员不具备的修改订单的权力。RBAC模型中的权限指的是对受保护的对象(如页面、菜单、数据等)进行操作的能力。例如,张三是销售部门的经理。
2023-10-23 01:11:35 86
原创 Redis的五种基本数据类型
Redis是一种非关系型数据库(NoSQL)。Redis存储数据的结构是一种键值对结构(key-value)。key为字符串类型,value可以为五种基本数据类型:字符串(String)、哈希(哈希)、列表(list)、集合(set)、有序集合(sorted set)。
2023-10-19 22:38:25 44
原创 Spring缓存相关四个注解
数据库每秒能接受的请求次数或者说数据的读写都是有限的,为了支撑更多的并发量,有效的办法就是引入缓存,每个环节中请求可以从缓存中直接获取目标数据并返回,从而减少计算量,有效提升响应速度,让有限的资源服务更多的用户。CachePut和 Cacheable 不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。
2023-10-18 19:27:07 67 1
原创 SpringMVC的工作流程拆解
控制器(Controller):负责协调模型和视图之间的交互,处理用户的输入和事件,以及控制应用程序的流程。它接收用户的行为和输入,然后根据具体的逻辑进行处理,可能会修改数据模型并触发相应的视图更新。SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等,最常用的视图是 jsp。DispatcherServlet是前端控制器,由它统一处理用户发来的请求并和响应,相当于一个中控,减少组件之间的的耦合性。完成的结果返回给用户。
2023-10-17 20:13:34 40
原创 MySQL数据库引擎介绍_InnoDB_MyISAM
数据库引擎是数据库负责存储、处理和访问数据的核心组件和模块。它提供了对数据库的操作接口和底层数据存储机制。它还负责管理数据的物理存储和索引结构,以及处理并发访问和事务的控制。不同的数据库引擎在实现上有所不同,可能采用不同的数据结构、索引算法、锁机制、缓存策略等。这些差异直接影响了数据库的性能、可用性和扩展性。我们一般不直接接触数据库引擎,因为大多数数据库管理系统都是通过程序编程接口(API),来实现用户与其底层引擎进行交互的。
2023-10-16 19:41:03 77 1
原创 Nexus私服maven仓库的搭建和使用
nexus默认就有不少仓库,简单介绍一下它们。在仓库列表中,每个仓库都具有一系列属性:Type:仓库的类型,Nexus 中有 3种仓库类型:group(仓库组)、hosted(宿主仓库)以及proxy(代理仓库)。Format:仓库的格式。Status:仓库的状态。URL:仓库的路径。我们选择maven2(hosted)来搭建我们的私服仓库这里要填写仓库名称以及仓库策略类型(Snapshot可以理解为测试库,Release是正式库,Mixed是混合)
2023-10-12 20:21:20 212
原创 集成swagger进行接口测试_使用JMeter进行迸发测试
这里介绍一下好用的工具——“knife4j”,它是一个集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j (xiaominfo.com)Swagger是一组围绕 OpenAPI 规范构建的开源工具,可以用于设计、构建、记录和使用 REST API。JMeter是一个功能强大的开源性能测试工具,它用于对软件、网络和服务器进行压力测试、负载测试和功能测试。运行项目后,进入http://localhost:9090/doc.html页面。使用knife4j前,需要进行实现的配置。
2023-10-11 20:10:58 236
原创 Dockerfile介绍_SpringBoot整合Dockerfile
Dockerfile 是一个用来构建Docker镜像的文本文件。基础镜像维护者信息镜像操作指令容器启动指令FROM指令——指定基础镜像。tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像MAINTAINER——指令指定镜像的维护者信息MAINTAINER xxx 维护者信息ENTRYPOINT指令——设定容器启动时要执行的命令CMD指令——设定容器启动时要运行的命令CMD用于设置容器启动时的默认命令或可执行文件。
2023-10-10 20:03:49 143 1
原创 Linux中MySQL主从数据库的搭建
在实际生产环境下,MySQL可能会面临同一时间处理大量数据的压力,如果使用单一数据库来处理增删改查所有请求,会造成性能下降的问题。拷贝一个my.cnf文件到3306/conf,然后在里面写需要的相关配置,配置内容与主(master)不同。从容器中拷贝一个my.cnf文件到3306/conf,然后在里面写需要的相关配置。在mysql文件夹中创建3306、3310两个目录(或者再创建一个3311,一主二从)修改my.cnf(这是主需要的配置)写在文档下方。在master中创建用户slave。
2023-10-09 20:28:17 173 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人