自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zzd的博客

笔记、总结与感悟

  • 博客(163)
  • 收藏
  • 关注

原创 蚂蚁一面(4月15日)

这个是电话面试,全程问项目(就是一个烂秒杀。。。)1、一分钟自我介绍2、这个项目你是承担什么角色呢? 我答:自己做的小项目。。。3、简单介绍一下,你怎么解决秒杀场景的高并发问题,说说你的思路?4、展示商品详情,怎么提升qps? 我主要答的使用redis来缓存商品数据。然后面试官说对于商品详情页面,进行页面静态化更好。5、页面静态化后,一些动态数据的应该怎么获取呢?因为一个页面总有不断变化的数据,就比如评论之类的数据?(其实这题是承接上面的讨论) ...

2021-04-20 12:27:20 345

转载 HTTPS相关总结(内有SSL四次握手连接的详细过程)

https的两个作用:1、加密HTTP传输的数据,确保安全性。2、确保访问网站的真实性(CA证书)。HTTPS = HTTP+ 加密 + 认证 + 完整性保护HTTPS 并非是应用层的一种新协议。 只是 HTTP 通信接口部分用SSL(Secure Socket Layer) 和 TLS(Transport Layer Security) 协议代替而已;通常, HTTP 直接和 TCP 通信。 当使用 SSL时, 则演变成先和 SSL通信, 再由 SSL和 TCP 通信了。 简言之, 所谓HTT

2021-04-12 16:04:33 1245

原创 面试中项目的相关问题

1、用mq实现分布式事务,为何要先发送消息,才执行本地事务,而不能本地事务执行完才发送消息呢? 答:我面试的时候答不出来。。后面面试官说,那是因为如果执行完本地事务后,机器就挂了,这样的话,消息就发不出去了,从而导致后续要异步执行的操作丢失。 这就是为何用rocketmq实现分布式事务的时候,要先发送一个半消息后,再执行本地事务。2、订单id真的要加上时间吗?为何要给订单id赋予含义?如果要用时间来归档,直接加一个时间字段不就行了吗? 答:这题我答不出来...

2021-04-09 11:28:14 272

转载 Spring的transactional注解自调用失效的原理

我先说一下我自己的理解:失效的关键是Spring的AOP会生成两个对象(这是Java原本的代理方式),所以有两个this,一个是代理类的this,一个是原本类的this,调用原本类的方法的时候,用了原本类的this。而如果只有一个代理增强类的话,就只有一个this了,那么利用多态性就可以避免事务失效了。转载自:https://blog.csdn.net/seelye/article/details/40144817好了,现在总结一下现象: 1、ServiceA类为Web层的Action...

2021-04-09 10:35:56 686

原创 项目数据库表设计

全部表(8个表)item表item_stock表(因为stock库存字段要频繁的查询和修改,所以单独拿出来建一个表)item_stock表的索引order_info表order_info表的部分数据promo_info表(存储秒杀活动的数据)sequence_info表(本来是用来生成订单唯一id的,现在已经弃用,改用redis生成订单唯一id)stock_log表(库存流水数据表,主要用于分布式事务判断本地事务(下单操作)执...

2021-04-08 12:14:27 688

转载 分布式事务相关

本文是转载的:https://www.cnblogs.com/mayundalao/p/11798502.html简述分布式事务指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。解决方案在分布式系统中,要实现分布式事务,无外乎那几种解决方案。一、两阶段提交(2PC)两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是

2021-04-06 22:13:45 67

原创 WAL: Write-Ahead Logging

WAL: Write-Ahead Logging先写日志,再写磁盘。具体说,当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到redo log里面,并更新内存,这个时候更新计算完成了。同时InnoDB引擎会在在系统比较空闲的时候,将这个操作记录更新到磁盘里。WAL机制主要得益于两个方面redo log 和 binlog 都是顺序写,磁盘的顺序写比随机写速度要快;组提交机制,可以大幅度降低磁盘的 IOPS 消耗。MySQL中有以下日志文件,分别是:  1:重做日志(redo log)

2021-04-06 20:53:40 234

原创 过滤器、拦截器和AOP

过滤器是Java Web层面提供的机制,拦截器是springmvc提供的机制,AOP其实与前面这两个东西关系不大。。。过滤器过滤器拦截的是URLSpring中自定义过滤器(Filter)一般只有一个方法,返回值是void,当请求到达web容器时,会探测当前请求地址是否配置有过滤器,有则调用该过滤器的方法(可能会有多个过滤器),然后才调用真实的业务逻辑,至此过滤器任务完成。过滤器并没有定义业务逻辑执行前、后等,仅仅是请求到达就执行。特别注意:过滤器方法的入参有request,response,F

2021-04-04 13:45:41 180

原创 spring的三级缓存

既然singleFactory.getObject()返回的是代理对象,那么注入的也应该是代理对象,我们可以看到注入的确实是经过CGLIB代理的AService对象。所以如果没有AOP的话确实可以两级缓存就可以解决循环依赖的问题,如果加上AOP,两级缓存是无法解决的,不可能每次执行singleFactory.getObject()方法都给我产生一个新的代理对象,所以还要借助另外一个缓存来保存产生的代理对象。...

2021-04-01 20:42:51 460

原创 SpringBoot自动装配大概过程

大概可以把@SpringBootApplication看作是@Configuration、@EnableAutoConfiguration、@ComponentScan注解的集合。根据 SpringBoot 官网,这三个注解的作用分别是:@EnableAutoConfiguration:启用 SpringBoot 的自动配置机制@Configuration:允许在上下文中注册额外的 bean 或导入其他配置类@ComponentScan: 扫描被@Component(@Service,@Con...

2021-03-28 23:04:57 218

转载 数据库分库分表

转自阿里技术公众号,地址:https://mp.weixin.qq.com/s/X6FI9Ci7ZXGDNDCkh2VnNA先说一下我的个人感受,就是我感觉可以与redis进行类比。主从复制-读写分离可以类比于redis的主从复制-哨兵模式,然后分库分表可以类比于redis的集群模式。总得来说,我感觉对于大规模数据的优化,主从复制-读写分离算是初级的优化,然后如果数据规模进一步庞大和QPS变得更加巨大的话,就要使用分库分表了。1 什么是分库分表?其实就是字面意思,很好理解: 分库:从单个.

2021-03-22 16:36:09 222

原创 近期学习记录

对前面的线程不安全示例中的 cnt 变量使用 volatile 修饰,不能解决线程不安全问题,因为 volatile 并不能保证操作的原子性。方法区是一个 JVM 规范,永久代与元空间都是其一种实现方式。在 JDK 1.8 之后,原来永久代的数据被分到了堆和元空间中。元空间存储类的元信息,静态变量和常量池等放入堆中。覆盖索引(就是联合索引的键值包含了select子句要求查询的键值)对于InnoDB表尤其有用,因为InnoDB使用聚集索引组织数据,如果二级索引中包含查询所需的数据,就不再需要在聚集索引

2021-03-10 16:10:19 107

原创 秒杀项目开发优化过程记录

单台虚拟机(mysql和Java程序运行在同一个服务器上)对于springboot 2.1.16,Tomcat的默认配置如下: server.tomcat.accept-count:等待队列长度,默认100 server.tomcat.max-connections:最大连接数,默认8192 server.tomcat.max-threads:最大工作线程数,默认200 server.tomcat.min-spare-threads:最小工作线程数,默认10

2020-12-28 22:55:05 453 1

原创 Redis的Sentinel(哨兵)模式

首先,我先说下我对于sentinel模式的理解:我觉得就是Redis的主从复制的高可用解决方案,什么意思呢?就是当主服务器挂了,不再用人手工操作的方式切换主从服务器,sentinel服务器会自动的检测出挂了的主服务器,并且自动完成主从服务器的切换。同样的,因为书中讲到了大量的实现细节,我觉得不用记录得这么详细,所以这里只写一些重点内容。想要详细了解实现细节的话还是去看书的第16章吧。Sentinel(哨兵)是Redis的高可用性解决方案:由一个或多个sentinel实例(其实就是一个处于sentin

2020-11-22 16:29:08 170

原创 Redis的主从复制功能

(这部分我不会写得太详细,因为涉及到大量的实现细节,如果想仔细了解的话,就去看书的第15章吧!!!)在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave)。进行复制中的主从服务器双方的数据库将保存相同的数据,概念上将这种现象称作“数据库状态一致”,或者简称“一致”。Redis2.8以前的复制功能不能高效地处理断线

2020-11-22 15:07:27 94

原创 Redis的事件

Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件:文件事件(file event):Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象。服务器与客户端(或者其他服务器)的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作。 时间事件(time event):Redis服务器中的一些操作(比如serverCron函数)需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。文件事件.

2020-11-08 22:03:11 100

原创 Redis设置键的生存时间或过期时间

通过EXPIRE命令或者PEXPIRE命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间(Time To Live,TTL),在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键。与EXPIRE命令和PEXPIRE命令类似,客户端可以通过EXPIREAT(多了个AT)命令或PEXPIREAT命令,以秒或者毫秒精度给数据库中的某个键设置过期时间。过期时间是一个UNIX时间戳,当键的过期时间来临时,服务器就会自动从数据库中删除这个键。虽然有多种不同单位和不同形式的设置命令.

2020-11-01 16:40:57 629

原创 Redis的数据库概念

在初始化服务器时,程序会根据服务器状态的dbnum属性来决定应该创建多少个数据库。dbnum属性的值由服务器配置的database选项决定,默认情况下,该选项的值为16,所以Redis服务器默认会创建16个数据库。每个Redis客户端都有自己的目标数据库,每当客户端执行数据库写命令或者数据库读命令的时候,目标数据库就会成为这些命令的操作对象。默认情况下,Redis客户端的目标数据库为0号数据库,但客户端可以通过执行SELECT命令来切换目标数据库。为了避免对数据库进行误操作,在执行Redis命令,特

2020-10-31 22:23:25 467

原创 Redis的对象系统

下面的内容来自《Redis设计与实现》这本书。Redis内部自己实现的主要数据结构有简单动态字符串(SDS)、双端链表、字典、跳跃表、整数集合和压缩列表。Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到了至少一种上面所述的数据结构。通过这五种不同类型的对象,Redis可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令。使用对象的另一

2020-10-31 16:29:56 85

原创 InnoDB存储引擎的锁相关内容

锁的类型InnoDB存储引擎实现了如下两种标准的行级锁:共享锁(S Lock),允许事务读一行数据。 排他锁(X Lock),允许事务删除或更新一行数据。如果一个事务T1已经获取行r的共享锁,那么另外的事务T2可以立即获得行r的共享锁,因为读取并没有改变行r的数据,这种情况称为锁兼容(Lock Compatible)。但是若有其他的事务T3想获得行r的排他锁,则必须等待事务T1、T2释放行r上面的共享锁,这种情况称为锁不兼容。另外InnoDB还支持意向锁(Intention Lock)...

2020-10-12 23:29:56 100

原创 西方文化与现代化

但这些技术和社会模式,是否就是西方文化的本质部分,这个问题则较难回答。许多人根据实证科学,认为这个问题无法回答,取而代之的是,一个"价值"问题,必须在其价值系统中 (如哲学、宗教、政治理论)才能找到答案。(这个到底要怎么理解呢?我一直对这个问题比较好奇,想要得到答案。。。)在世界范围内,西方文化中的元素对其他文化具有很强的影响力。许多文化背景的人,包括西方与非西方的,都将"现代化"与"西化"等量齐观,当然也有许多非西方人士,反对将采纳西方理念与价值,作为所有社会的必然。一些非西方世界的成员,他们将科技进

2020-09-06 11:02:21 461

原创 Java异常的分类的名字说明

Java的异常通常分为已检查异常(checked异常)和未检查异常(unchecked异常)。我以前一直不理解为何要这样叫。但是现在有点头绪。具体就是:写代码的时候,有些IOException我们的编译器能够检测到的,所以说叫checked异常,写代码的时候空指针异常时检测不到的,所以叫unchecked异常。所以说,这个已检查和未检查是对于编译器而言的,编译器编译过程中能检查出来的异常就是已检查异常,于是就让你必须写上对应的异常处理逻辑。编译器编译过程中不能检查出来的异常就是未检查异常。...

2020-08-30 22:21:47 341

原创 Maven的继承和聚合

继承为什么需要继承机制由于非 compile 范围的依赖信息是不能在“依赖链”中传递的,所以有需要的工程只能单独配置。例如:此时如果项目需要将各个模块的junit版本统一为4.9,那么到各个工程中手动修改无疑是非常不可取的。 使用继承机制就可以将这样的依赖信息统一提取到父工程模块中进行统一管理。创建父工程创建父工程和创建一般的 Maven工程操作一致,唯一需要注意的是:打包方式处要设置为 pom。在子工程中引用父工程格式:此时如果子工程的 groupId ...

2020-08-25 22:46:02 160

原创 Maven的依赖管理功能

依赖管理是Maven 中最关键的部分,我们使用 Maven 最主要的就是使用它的依赖管理功能。什么是依赖当 A jar 包用到了 B jar 包中的某些类时,A 就对 B 产生了依赖,这是概念上的描述。在Maven工程中,只需要在pom.xml文件中使用 dependency 标签指定被依赖 jar 包的坐标,就可以以依赖的方式引入一个我们需要的 jar 包。例子:依赖的范围到上面的依赖信息中除了目标 jar 包的坐标还有一个 scope 设置,这是依赖的范围。依赖的范 围有几个..

2020-08-25 22:20:14 274

原创 Maven的生命周期与负责执行的插件

什么是 Maven 的生命周期Maven 生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven 就可以自动化的执行构建命令了。●Maven 有三套相互独立的生命周期,分别是:①Clean Lifecycle 在进行真正的构建之前进行一些清理工作。 ②Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等。 ③Site Lifecycle 生成项目报告,站点,发布站点。它们是相互独立的,你可以仅仅调用 clean 来清理工作目录,仅仅调用 site 来

2020-08-24 23:22:56 104

原创 Maven的POM和坐标的相关内容

为何POMProject Object Model:项目对象模型。将 Java 工程的相关信息封装为对象作为便于操作和管理的模型。 Maven 工程的核心配置。可以说学习 Maven 就是学习 pom.xml 文件中的配置。(牛逼!)Maven 的坐标使用如下三个向量在 Maven 的仓库中唯一的确定一个 Maven 工程:[1]groupid:公司或组织的域名倒序+当前项目名称 [2]artifactId:当前项目的模块名称 [3]version:当前模块的版本如何通...

2020-08-24 22:56:50 120

原创 Maven简介

自动化构建工具Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和 依赖管理。Maven 这个单词的本意是:专家,内行。何为构建(Build)构建并不是创建,创建一个工程并不等于构建一个项目。构建过程的几个主要环节 :①清理:删除以前的编译结果,为重新编译做好准备。 ②编译:将 Java 源程序编译为字节码文件。 ③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。 ④报告:在每一次测试后以标准的格式.

2020-08-24 22:48:35 113

原创 关于实现Restful风格API的基础

我今天才知道,原来URL相同,但是允许的请求方式不同,是可以作为不同接口的!!!这是实现Restful风格API的基础。至于到底怎么才算Restful风格API,我也不太清楚,还没仔细研究过,日后再研究。。。...

2020-08-01 20:22:17 122

原创 关于后端参数验证的思考

因为有些前端传来的参数的验证是涉及到业务逻辑的,所以应该不太可能让框架来完成全部参数的准确性验证,也就是参数验证不存在通用的解决方案(存疑),必须要对应的接口实现来对参数进行验证。或者说,对参数的验证过程本身就是业务逻辑的一部分。 我之前写后端逻辑的确疏忽了参数验证这个过程。可能有时候有一些验证,但是并不是刻意为之的,而是随意发挥的。总之,以后写后端代码,一定要时刻记着前端传来的参数并不可信,一定要验证过后才能使用。...

2020-07-31 13:28:17 249

原创 SpringBoot的日志相关内容(主要是关于日志框架的内容比较好)

日志框架现在Java的日志框架使用的是门面(Facade)设计模式来进行设计的。(我才知道。。。)思路:写了一个统一的接口层;日志门面(日志的一个抽象层);logging-abstract.jar;给项目中导入具体的日志实现就行了。之前的日志框架都是实现的抽象层;市面上的日志框架:JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j....现在JCL和jboss logging都不常用。左边选一个门面(抽象层)、右边来选一个实现:日志.

2020-07-31 11:53:48 234

原创 SpringBoot的自动配置原理

自动配置精髓:1)、SpringBoot启动会加载大量的自动配置类2)、我们看我们需要的功能有没有SpringBoot默认写好的自动配置类;3)、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)4)、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这些属性的值;xxxxAutoConfigurartion:自动配置类,给容器中添加组件。xxxxProperties:封装配置文件中相关属

2020-07-29 11:19:41 227

原创 SpringBoot的配置文件优先级

如果properties和yml同时存在,properties先加载,yml后加载,properties中已经加载的属性在yml中会被忽略,但properties中没有配置的属性,yml中独有的属性会被加载。因此,application.properties的优先级比application.yml高。配置文件加载位置springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件–file:./c

2020-07-29 11:02:38 595

原创 SpringBoot的自动配置

配置文件SpringBoot使用一个全局的配置文件,配置文件名是固定的;•application.properties•application.yml配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好; 配置文件值注入@Value获取值和@ConfigurationProperties获取值比较配置文件yml还是properties他们都能获取到值;(properties的优先级更高)如果说,我们只是在某个业务...

2020-07-29 10:55:19 85

转载 Maven的dependencies与dependencyManagement的区别

1、DepencyManagement应用场景当我们的项目模块很多的时候,我们使用Maven管理项目非常方便,帮助我们管理构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等。由于我们的模块很多,所以我们又抽象了一层,抽出一个itoo-base-parent来管理子项目的公共的依赖。为了项目的正确运行,必须让所有的子项目使用依赖项的统一版本,必须确保应用的各个项目的依赖项和版本一致,才能保证测试的和发布的是相同的结果...

2020-07-23 20:47:17 115

转载 ASCII win下 CR LF 转化成 linux LF

#文本查看现在文档的控制符状况od -c xx.txt将windows下的控制符CRLF 转化成linux的LF# 去掉CRsed -e 's/.$//' xx.txt > newxx.dat

2020-07-23 14:43:03 243

原创 Spring注解驱动的SpringMVC整合

1、Servlet容器(Tomcat)启动会扫描,当前应用里面每一个jar包的ServletContainerInitializer的实现2、提供ServletContainerInitializer的实现类;必须绑定在,META-INF/services/javax.servlet.ServletContainerInitializer文件的内容就是ServletContainerInitializer实现类的全类名;总结:容器在启动应用的时候,会扫描当前应用每一个jar包里面 META-...

2020-07-22 19:58:14 168

转载 Servlet3.0的异步处理

Servlet3.0对异步处理的支持:有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程。在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度。Servlet3.0要Tomcat7.0之后的版本才能支持。以前的servlet的流程:首先,Servlet接收到请求之后,可能需要对请求携带的数据进行一些

2020-07-22 10:37:48 152

原创 Spring注解驱动的声明式事务

/** * 声明式事务: * * 环境搭建: * 1、导入相关依赖 * 数据源、数据库驱动、Spring-jdbc模块 * 2、配置数据源、JdbcTemplate(Spring提供的简化数据库操作的工具)操作数据 * 3、给方法上标注 @Transactional 表示当前方法是一个事务方法; * 4、 @EnableTransactionManagement 开启基于注解的事务管理功能; * @EnableXXX * 5、配置事务管理器来控制...

2020-07-20 11:09:22 189

原创 Spring注解驱动的AOP

AOP:【动态代理】* 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式;* * 1、导入aop模块;Spring AOP:(spring-aspects)* 2、定义一个业务逻辑类(MathCalculator);在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx)* 3、定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知MathCalculator.div运行到哪里然后执行;* 通知方法:* ...

2020-07-20 10:52:58 116

原创 MyBatis的Mapper接口方法不能重载

因为MyBatis动态代理寻找策略是:全限定名+方法名,不涉及参数,所以MyBatis不支持方法重载。

2020-07-18 14:14:54 223

空空如也

空空如也

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

TA关注的人

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