- 博客(247)
- 收藏
- 关注

原创 Java架构师学习小目标
前言:目前需要加强的方向,Leetcode算法,分布式架构,JVM优化思路,常见问题解决/设计方案,框架源码原理。希望以后能对于老生常谈的IO模型、并发安全、GC原理,JUC、分布式系统常见一、LeetCode算法题LeetCode常用算法和大厂历年真题二、多线程并发编程和NIO线程安全和线程池同步异步死锁reentrantLock锁读写锁可重入锁Lock接口和个Synchronized区别volatile关键字的作用nio阻塞和非阻塞Netty异步高性能的通信框架...
2020-09-23 00:04:05
772
原创 Jenkins安装配置
Jenkins是一款CICD(持续集成与持续交付)工具。Jenkins可以帮你在写完代码后,一键完成开发过程中的一系列自动化部署的工作。Jenkins 2.346.1 版本支持 jdk1.8 和 jdk11,最后一版支持jdk1.8的版本。安装Jenkins前必须先安装JDK,最新版的Jenkins需要jdk11以上,这里我安装jenkins-2.346.1+jdk8,同时安装好git和maven做好配置,方便后期使用。
2023-05-28 18:52:06
545
原创 Linux安装Redis6.0版本教程
采用Redis源码压缩包解压编译的安装方式。因为centos7.x的gcc版本还是4.8.5,而GCC编译指定的版本是需要5.3以上。
2023-05-19 12:42:32
363
原创 No primary or default constructor found for interface javax.servlet.http.HttpServletRequest
在我们使用spring-boot-starter-web依赖的时候,我们可以在controller的接口类的方法参数中使用HttpServletResponse或HttpServletRequest进行参数返回或获取,但是一旦修改为了spring-boot-starter-webflux依赖,那么就不能再方法参数中使用HttpServletResponse或HttpServletRequest了,否则会出现下面的错误。
2023-04-13 17:47:35
211
原创 SpringBoot集成Thymeleaf模板引擎的html、css和js存放位置
如我的页面为hello-world.html,它所在的目录结构就应该为resource–> templates --> hello-world.html在controller中,return的值则为 /hello-world ,系统会自动给加上.html的后缀。css引入增加 th:href配置路径,js引入增加th:src路径配置。我的页面中本来都是直接使用的element-ui和vue直接提供的在线js,但是因为页面嵌套会有跨域的问题,所以页面中的js、css都要改为使用本地文件。
2023-04-12 21:24:31
606
原创 Yum方式安装Nginx
使用Nginx源码进行安装过程比较繁琐,需要提前下载安装GCC编译器、PCRE兼容正则表达式库、zlib压缩库和OpenSSL安全通信的软件库包,然后才能进行Nginx的安装。采用Yum最简单的安装方式能自动解决这些安装依赖,默认情况Centos7中无Nginx的源rpm,需要添加Nginx的源RPM。
2023-04-12 20:33:10
476
原创 [Centos7 yum源报错] repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found 解决方案
用公司的ECS yum方式安装JDK1.8,出现yum源找不到的问题,具体报错如下:http://yum.tbsite.net/epel/7/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
2023-04-12 14:36:42
659
原创 RedisTemplate最常用方法
RedisTemplate常用方法介绍,根据RedisTemplate封装了Redis的一些常用的原生操作RedisUtil工具类
2023-02-20 01:02:28
294
原创 工作中常用的Stream集合处理
Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,它允许把函数作为一个方法的参数,让我们的代码更优雅简洁。Java8最大的特性就是引入Lambda表达式,即函数式编程,可以将行为进行传递。总结就是:使用不可变值与函数,函数对不可变值进行处理,映射成另一个值。
2023-02-13 23:30:39
256
原创 【线上故障记录】MySQLTransactionRollbackException: Lock wait timeout exceeded
当表是Innodb表,当表上有慢查询,不阻塞Select 和DML,其他的DDL操作都会被阻塞,比如出现waiting for table metadata lock。
2023-01-04 10:21:51
1191
原创 【线上故障记录】java.lang.OutOfMemoryError: GC overhead limit exceeded和Java heap space
Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded 超出GC开销限制原因:详细消息“超出 GC 开销限制”表示垃圾收集器一直在运行,Java 程序进展非常缓慢。在垃圾收集之后,如果Java进程花费大约 98% 以上的时间进行垃圾收集,并且如果它正在恢复堆的不到 2%,并且到目前为止一直在进行最后5次(编译时常量)连续垃圾收集,则Java进程将停止。将抛出 lang.OutOfMemoryError。
2023-01-03 14:36:51
819
原创 Redis面试连环15问
1、Redis基本数据类型有哪些?Redis 是一种基于键值对的NoSQL缓存数据库,key都是由字符串构成的,而它的值主要由string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合)五种基本数据结构构成,除此之外还支持一些其他的数据结构和算法。在开发中,字符串类型是用的最多的数据类型,导致我们忽视了redis的其他四种数据类型,在具体场景下选择具体的数据类型对提升Redis性能有非常大的帮助。 String(字符串) Hash(哈希) L
2022-05-07 13:38:47
757
原创 Redis高可用:主从复制、哨兵集群、Cluster 切片集群
前言:Redis高可用:主从复制、哨兵集群、Cluster 分片集群。一、主从同步Redis 的同步方式有:主从同步、从从同步(由于全部都由 master 同步的话,会损耗性能,所以部分的 slave 会通过 slave 之间进行同步)。同步过程: 建立连接,然后从库告诉主库:“我要同步啦,你给我准备好”,然后主库跟从库说:“收到”。 从库拿到数据后,要把数据保存到库里。这个时候就会在本地完成数据的加载,会用到 RDB 。 主库把新来的数据 AOF 同步给从库。
2022-05-06 15:09:40
1093
2
原创 高并发下的秒杀系统设计
前言:高并发下如何设计出健壮的秒杀系统?比如淘宝和小米手机的秒杀活动。秒杀一般出现在商城的促销活动中,指定了一定数量(比如:10个)的商品(比如:手机),以极低的价格(比如:0.1元),让大量用户参与活动,但只有极少数用户能够购买成功。这类活动商家绝大部分是不赚钱的,说白了是找个噱头宣传自己。虽说秒杀只是一个促销活动,但对高并发场景下的后端多方面的知识要求不低。一、秒杀促销活动应该考虑哪些问题?1.1、库存超卖分析秒杀的业务场景,最重要的有一点就是超卖问题,假如备货只有100个,但是最终超卖了2
2022-04-29 16:48:28
1546
原创 Redis 处理接口幂等性的两种方案
前言:接口幂等性问题,对于开发人员来说,是一个跟语言无关的公共问题。对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单。接口幂等性是指用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。一、接口幂等性1.1、什么是接口幂等性在HTTP/1.1中,对幂等性进行了定义。它描述了一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络
2022-04-25 15:16:56
5161
1
原创 Redis 布隆过滤器总结
前言:开发中,经常有让我们判断一个集合中是否存在某个数的case;大多数情况下,只需要用map或是list这样简单的数据结构。但是在高并发环境下,所有的case都会极端化,如果这是一个十分庞大的集合(给这个庞大一个具体的值吧,一个亿),简单的一个HashMap,不考虑链表所需的指针内存空间,一亿个int类型的整数,就需要380多M(4byte × 10 ^8),十亿的话就是4个G,不考虑性能,光算算这内存开销,即使现在满地都是128G的服务器,也不好吃下这一壶。在海量数据面前,需要高效的去重数据结构布.
2022-01-26 02:16:35
3341
1
原创 Redis 6.0多线程模型总结
前言:Redis 6.0.1 于 2020 年 5 月 2 日正式发布了,如 Redis 作者 antirez 所说,这是迄今为止最“企业”化的版本,也是有史以来改动最大的一个 Redis 版本。这个版本提供了诸多令人心动的新特性及功能改进,比如新网络协议RESP3,新的集群代理,ACL等,其中关注度比较高的应该是多线程模型了。1、Redis6.0之前的版本真的是单线程吗?Redis在处理客户端的请求时,包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的
2022-01-24 00:35:05
5121
2
原创 Redis进阶使用和实战技巧
前言: Redis 大家用的不少,但是我们大多数人可能都只是关注业务本身,对于底层的细节则经常忽略,久而久之,对个人的成长帮助甚少。本文为大家总结了关于 Redis 常见用法的进阶指南,希望帮助大家加深对这门技术的理解。转载于腾讯技术工程:进阶指南!Redis 用法总结作者:何永康,腾讯 CSIG 后台研发工程师一、Redis五种基础数据结构1. 1、StringRedis 里的字符串是动态字符串,会根据实际情况动态调整。类似于 Go 里面的切片-slice,如果长度不够则自动扩容。
2022-01-23 23:56:33
830
原创 Redis高性能原理:Redis为什么这么快?
前言:Redis 大家用的不少,但是可能都只关注业务本身,对于底层的细节则经常忽略,本文总结了 Redis的常见知识点,希望帮助大家加深对这门技一、Redis为什么这么快?1.1、数据结构SDS的妙用我们知道redis的底层是用c语言来编写的,但是,数据结构确没有直接套用C的结构,而是根据redis的定位自建了一套数据结构。C语言中的字符串结构:SDS定义下的字符串结构:可以看到,相比于C语言来说,也就多了几个字段,分别用来标识空闲空间和当前数据长度,但简直是神来之笔:
2022-01-22 02:05:10
6289
1
原创 SpringBoot自定义logback日志配置
前言:默认情况下,SpringBoot内部使用logback作为日志实现的框架,将日志输出到控制台,不会写到日志文件。如果在application.properties或application.yml配置,这样只能配置简单的场景,保存路径、日志格式等。复杂的场景(区分 info 和 error 的日志、每天产生一个日志文件等)满足不了,只能自定义配置文件logback-spring.xml。一、application.properties简单配置logback日志1.1、SpringBoot默认的日
2022-01-20 17:17:20
11570
原创 Redis缓存击穿、缓存穿透、缓存雪崩
前言:设计一个Redis缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。先来看一个常见的缓存使用方式:读请求来了,先查下缓存,缓存有值命中,就直接返回;缓存没命中,就去查数据库,然后把数据库的值更新到缓存,再返回。一、缓存穿透缓存穿透是指缓存和数据库中都没有数据,是指用户请求的数据在缓存中不存在即没有命中,同时在数据库中也不存在,导致用户每次请求这个不存在数据都要到数据库中去查询。通俗点说,读请求访问时,缓存和数据库都没有某个值,这样就会导致每次对这个值的查询请求
2022-01-17 19:10:56
984
1
原创 Redis持久化机制RDB和AOF
前言:Redis读写速度快、性能优越是因为它将所有数据存在了内存中,然而,当Redis进程退出或重启后,所有数据就会丢失。所以我们希望Redis能保存数据到硬盘中,在Redis服务重启之后,原来的数据能够恢复,这个过程就叫持久化。一、RDB持久化RDB(Redis DataBase)持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。持久化是一种常见的解决方案,那么,我们首先能想到
2022-01-17 00:26:02
352
原创 Redis五种数据类型的应用场景
Redis 是一种基于键值对的NoSQL缓存数据库,key都是由字符串构成的,而它的值主要由string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合)五种基本数据结构构成。在具体场景下选择具体的数据类型对提升Redis性能有非常大的帮助。
2022-01-17 00:15:21
2181
原创 MySQL百万级数据大分页查询优化
前言:在数据库开发过程中我们经常会使用分页,核心技术是使用limit进行数据的读取。在使用limit进行分页的测试过程中,得到以下数据:一、MySQL分页起点越大查询速度越慢直接用limit start, count分页语句, 也是我程序中用的方法:select * from product limit start, count当起始页较小时,查询没有性能问题,我们分别看下从10, 100, 1000, 10000开始分页的执行时间(每页取20条)。select * from pr
2022-01-09 22:18:10
4811
2
原创 SpringBoot使用AOP记录接口操作日志
前言:我们项目中可能有这种需求,每个人请求了哪些接口?做了什么事情?参数是什么?重要的接口我们需要记日志以便查找。我们不可能在每个接口中去一一处理,可以借助Spring提供的AOP能力+自定义注解轻松应对。...
2022-01-07 01:03:35
12678
2
原创 SpringBoot集成knife4j实现Swagger接口文档
前言:如果你是后台开发,提供restful接口给前端,建议你使用Swagger3提供restful的接口文档自动生成和在线接口调试。knife4j是对Swagger进一步封装,其优化了API文档的UI界面,是本人最推荐的方式。一、Swagger简介1.1、SwaggerSwagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。Swagger拥有接口文档自动生成和在线调试接口的两大功能。Swagger拥有众多不同语言和平台的开源实现与工具,他有..
2022-01-06 02:24:44
4234
原创 SpringBoot整合RabbitMQ:Direct类型交换机
前言:本篇博客主要介绍SpringBoot中如何根据直连型交换机去使用RabbitMQTemplate,Direct模式的Exchange根据消息携带的路由值将消息投递给对应队列。一、RabbitMQ通信模型和Exchange类型1.1、RabbitMQ通信模型在代码中使用MQ发送消息的过程是异步执行的,消息到达RabbitMQ后,会在通信模型中找到适合的队列进行入队。RabbitMQ通信模型下面来看看消息到达RabbitMQ会发生什么,Exchange会将消息通过RoutingKey将
2022-01-04 17:20:50
1762
原创 SpringBoot利用@Async注解实现异步调用
前言:异步编程是让程序并发运行的一种手段。它允许多个事情同时发生,当程序调用需要长时间运行的方法时,它不会阻塞当前的执行流程,程序可以继续运行,当方法执行完成时通知给主线程根据需要获取其执行结果或者失败异常的原因。使用异步编程可以大大提高我们程序的吞吐量,可以更好的面对更高的并发场景并更好的利用现有的系统资源,同时也会一定程度上减少用户的等待时间等。一、异步编程1.1、什么是异步调用?异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步
2022-01-04 02:08:39
5300
5
原创 SpringBoot Validation优雅的参数校验
前言:大多数项目中都需要后台对传过来的对象进行校验,所以经常需要写一些字段校验的代码,比如特殊字段非空、字段长度限制和邮箱格式验证等等。之前我们可能都是使用if…else…,写这些与业务逻辑关系不大的代码,不仅验证代码繁琐而且重复劳动,今天我们了解一下Hibernate-Validator的@validated注解。一、Hibernate-Validator简介1.1、为什么需要参数校验在日常的接口开发中,为了防止非法参数对业务造成影响,经常需要对接口的参数做校验,例如登录的时候需要校验用户名密
2022-01-02 01:40:01
3157
原创 @ControllerAdvice 和 @ExceptionHandler注解处理全局异常
前言:@ControllerAdvice ,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的解,顾名思义,这是一个增强的 Controller。一般配合@ExceptionHandler使用来处理全局异常。一、@ControllerAdvice@ControllerAdvice 是Spring 3.2提供的新注解,他是一个controller增强器,可以对controller中使用到@RequestMapping注解的方法做逻辑处理。使用这个注解 ,可以实现三个方面的功能:
2021-11-26 17:20:18
5712
1
原创 SpringMVC中get和post方法获取参数的几种方式
前言:get与post两种请求方法的显著区别就是,get请求方式参数是在url后,而post请求方式的参数是在request body中。因此两者获取参数的方式也大不一样,如果在post方法用了get的传值方式,可能出现未找到请求URI匹配的HTTP资源的异常。定义一个User类备用@Getter@Setter@AllArgsConstructor@NoArgsConstructorpublic class User implements Serializable{ privat
2021-11-26 16:57:39
4512
原创 MySQL面试夺命连环27问
1、MySQL 逻辑架构分层把 MySQL 分成三层,跟客户端对接的连接层,真正执行操作的服务层,和跟硬件打交道的存储引擎层。Mysql逻辑架构图主要分三层:(1)第一层负责连接处理,授权认证,安全等等(2)第二层负责编译并优化SQL(3)第三层是存储引擎。连接层我们的客户端要连接到 MySQL 服务器 3306 端口,必须要跟服务端建立连接,那么管理所有的连接,验证客户端的身份和权限,这些功能就在连接层完成。服务层连接层会把 SQL 语句交给服务层,这里面又包...
2021-10-25 12:02:48
16011
12
原创 Sharding-JDBC自动实现MySQL读写分离
前言:上一篇博客我用AOP+AbstractRoutingDataSource实现了MySQL读写分离,自己写代码实现判断该使用哪个数据源挺麻烦的。Sharding-JDBC 是 Apache 旗下的 ShardingSphere 中的一款轻量级产品,引入 jar 即可完成读写分离的需求,可以理解为增强版的 JDBC,现在被使用的较多。使用Sharding-JDBC配置MySQL读写分离,优点在于数据源完全有Sharding-JDBC托管,写操作自动执行master库,读操作自动执行slave库。不需要程序
2021-10-24 00:16:25
2471
3
原创 SpringBoot+MyBatis+AOP实现读写分离
前言:高并发这个阶段,肯定是需要做MySQL读写分离的。实际上大部分的互联网网站或者App,其实都是读多写少。所以针对这个情况,就是写一个主库,但是主库挂多个从库,然后从多个从库来读,那不就可以支撑更高的读并发压力了吗?一、 MySQL 读写分离1.1、如何实现 MySQL 的读写分离?其实很简单,就是基于主从复制架构。简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从去,多个从库用于读。读写分离就是对于一条SQL该选择哪一个数据库去执行,至于谁来做
2021-10-22 01:36:35
862
1
原创 MySQL主从复制配置总结
一、MySQL主从复制1.1、MySQL主从复制简介MySQL Replication (MySQL 主从复制) 是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式(一级主从大概50~100 us),这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。横向扩展解决方案在多个从库之间扩展负载以提高性能。在这种环境中,所有写入和更新在主库上进行。
2021-10-21 22:14:25
2239
1
原创 MySQL慢查询优化
前言:在应用开发的早期,数据量少,程序猿开发功能时更重视功能上的实现,随着生产数据的增长,很多SQL语句开始暴露出性能问题,对生产的影响也越来越大,有时候这些有问题的SQL慢查询就是整个系统性能的瓶颈。一、SQL慢查询简介1.1、什么是SQL慢查询?这里指的是MySQL慢查询,具体指运行时间超过long_query_time值的SQL。我们常听常见的MySQL中有二进制日志binlog、中继日志relaylog、重做回滚日志redolog、undolog等。针对慢查询,还有一种慢查询日.
2021-10-11 23:51:46
815
原创 MySQL索引优化总结
前言:相信大家都知道索引可以大大提高MySQL的检索速度,但是真正在平时工作中写SQL,真的会考虑到这条SQL如何能够用上索引提升执行效率?本篇博客详细的介绍了索引优化的20个原则,只要在工作中能够随时应用到,相信你写出的SQL能够命中索引,效率杠杠的。一、索引的分类1.1、普通索引、主键索引和唯一索引1.2、聚集索引和非聚集索引1.3、联合索引最左匹配原则1.4、索引覆盖和回表1.5、前缀索引1.6、索引合并1.7、索引下推二、索引优化规则查询的条...
2021-09-30 01:39:43
4338
原创 日常工作中如何做MySQL优化?
前提:当有人问你如何对数据库进行优化时,很多人第一反应想到的就是SQL优化,如何创建索引,如何改写SQL,他们把数据库优化与SQL优化划上了等号。当然这不能算是完全错误的回答,只不过思考的角度稍微片面了些,太“程序员思维”化了,没有站在更高层次来思考回答。那今天我们就将视角拔高,站在架构的角度来聊聊这一问题,数据库优化可以从哪些维度入手?正如上图所示,数据库优化可以从架构优化,硬件优化,DB优化,SQL优化四个维度入手。此上而下,位置越靠前优化越明显,对数据库的性能提升越高。我们常说的SQL优化反而
2021-09-29 01:30:07
511
1
原创 SpringBoot快速集成Kafak
前言:Apache Kafka是分布式发布-订阅消息系统。它最初由LinkedIn公司开发,之后成为Apache项目的一部分。Kafka是一种快速、可扩展的、设计内在就是分布式的,分区的和可复制的提交日志服务。Apache Kafka与传统消息系统相比,有以下不同: 它被设计为一个分布式系统,易于向外扩展; 它同时为发布和订阅提供高吞吐量; 它支持多订阅者,当失败时能自动平衡消费者; 它将消息持久化到磁盘,因此可用于批量消费,例如ETL,以及实时应用程序。 一、Kaf
2021-09-28 01:27:49
395
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人