自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Java】CompletableFuture学习记录

业务场景:查询商品详情页的逻辑比较复杂,有些数据还需要远程调用,必然需要花费更多的时间。假如商品详情页的每个查询,需要如下标注的时间才能完成。那么,用户需要 5.5s 后才能看到商品详情页的内容。很显然是不能接受的。如果有多个线程同时完成这 6 步操作,也许只需要 1.5s 即可完成响应。Future 是 Java 5 添加的类,用来描述一个异步计算的结果。你可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel方法停止任务的执行。

2023-10-07 08:46:53 159

原创 【Java】泛型

Java泛型的总结学习

2023-09-20 16:55:37 204

转载 【设计模式】七大原则

<!-- 引入redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> &lt...

2021-07-10 19:30:19 174

原创 数据库三大范式

常见数据库设计范式包括:第一范式,第二范式,第三范式及BC范式,当然还有第四及第五范式不过这里我们会把重点放到前三个范式上,这也是目前我们大多数数据库设计所要遵循的范式。数据操作异常及数据冗余数据冗余是指相同的数据在多个地方存在,或者说表中的某个列可以由其它列计算得到,这样就说表中存在着数据冗余。第一范式(1NF)定义:数据库表中的所有字段都是单一属性,不可再分的。这个单一属性是由基本的数据类型所构成的,如整数、浮点数、字符串等。换句话说第一范式要求数据库中的表都是二维表。第二范式(2NF

2021-07-03 16:33:47 198 1

原创 JVM内存结构 VS Java内存模型 VS Java对象模型

整体方向JVM 内存结构,和 Java 虚拟机的运行时区域有关。Java 内存模型,和 Java 的并发编程有关。Java 对象模型,和 Java 对象在虚拟机中的表现形式有关。JVM 内存结构Java 对象模型Java 对象自身的存储模型JVM 会给这个类创建一个 instanceKlass,保存在方法区,用来在JVM层表示该 Java 类。当我们在 Java 代码中,使用 new 创建一个对象的时候,JVM 会创建一个 instanceOopDesc 对象,这个对象中包含了对象头以及

2021-07-01 17:34:05 128

原创 【秒杀扩展】mysql 性能优化

通用性能优化口诀缓存异步批处理mysq| 应用优化写操作:批量insert,批量updateSq|编译N次和1次的时间与空间复杂度网络消耗的时间复杂度磁盘寻址的复杂度读操作:索引主键查询千万条记录1-10ms唯一索引千万条记录10-100ms非唯一索引千万条记录100- 1000ms无索引百万条记录1000ms+单机配置优化max_connection = 1000mysql 执行引擎先不是操作数据而是记录日志undo/redo 日志顺序写操作.

2021-07-01 17:33:35 103

原创 【秒杀系统】查询性能优化技术之页面静态化

DNS用CNAME解析到源站整个的一个商品详情页,先加载静态资源后通过 ajax 请求获取商品详情页内容渲染的方式,任何一步没做到位,都会拖累整个系统 tps/qps 的一个响应现在的静态请求直接是打到我们的 Nginx 的 resources 的目录,现在将 resources 的地址重定向到阿里云的 CDN 内容分发网络,在获取静态资源内容先通过 CDN,CDN 没有在回源到阿里云源站(源站可以理解为本地静态资源文件),一边返回静态资源文件一边缓存起来,以便用户下一次访问时可以不做回源的操作

2021-07-01 17:33:10 252

原创 【秒杀扩展】登录态管理

分布式会话持久性管理当一个用户通过前端访问时, Nginx 通过反向代理负载均衡的轮询策略转发打到 tomacat 中的 java 上,再这样的分布式会话中,原本 cookie + session 的方案在 tomcat 的内存级别维护 session 的列表显然就失效了,tomcat 之间的内存并不是互通的,这时就需要引入分布式会话管理存储会话有效期不与服务端发生交互的呆滞时间,Tomcat默认为30m会话续命:当用户在呆滞时间内又带着 cookieId 的请求过来,tomcat 会寻找到对应

2021-07-01 17:32:29 131

原创 【秒杀系统】防刷限流技术

验证码生成与验证技术包装秒杀令牌前置,需要验证码来错峰数学公式验证码生成器//生成验证码 @RequestMapping(value = "/generateverifycode",method = {RequestMethod.GET,RequestMethod.POST}) @ResponseBody public void generateverifycode(HttpServletResponse response) throws BusinessException,

2021-07-01 17:32:01 133

原创 【秒杀系统】流量削峰

为什么会存在流量削峰?主要是包含两个方面的能力,在之前经历了查询优化技术、交易优化技术使用了缓存校验 + 异步扣减库存的方式使得秒杀下单的性能有了明显提升。但是,再这样的一些技术当中,仍然不得不面临一些问题,也就是浪涌洪峰流量的涌入问题,秒杀瞬间的流量很大,我么需要将涌入的巨大流量平滑的过渡掉。因此,流量削峰技术应运而生目标掌握秒杀令牌的原理和使用方式掌握秒杀大闸的原理和使用方式掌握队列泄洪的原理和使用方式目前秒杀系统的缺陷秒杀下单接口会被脚本不停的刷新:秒杀的下单接口就是一个公网的

2021-07-01 17:31:33 212

原创 【秒杀系统】交易性能优化之缓存库存

交易性能瓶颈交易验证完全依赖数据库 @Override @Transactional public OrderModel createOrder(Integer userId, Integer itemId, Integer promoId, Integer amount) throws BusinessException { //1.校验下单状态,下单的商品是否存在,用户是否合法,购买数量是否正确 ItemModel itemModel = i

2021-07-01 17:31:08 1914

原创 【秒杀系统】查询性能优化技术之多级缓存

多级缓存redis缓存默认springboot自带redisTemplet不带序列化热点内存本地缓存nginx proxy cache缓存nginx lua缓存

2021-07-01 17:30:36 151

原创 【秒杀系统】分布式扩展

nginx反向代理负载均衡单机容量问题,水平扩展表象:单机cpu使用率增高,memory占用增加,网络带宽使用增加cpu us :用户空间的cpu使用情况(用户层代码)cpu sy :内核空间的cpu使用情况(系统调用)load average : 1,5,15分钟load平均值,跟着核数系数, 0代表通常 1代表打满1+代表等待阻塞memory:free空闲内存, used使用内存nginx反向代理makemake install动静分离负载

2021-07-01 17:30:03 135

原创 【秒杀系统】云端部署、性能压测

项目云端部署JDK 安装默认安装在 /usr/java 中刷新环境变量MySQL 安装备份、上传、恢复用maven打成jar包上传到服务器命令行输入:mvn clean packagepom 文件添加后刷新maven上传到服务器执行 java -jar 命令,访问不出来,去阿里云开放端口外挂配置文件编写 deploy 脚本jmeter性能压测线程组Http请求查看结果树聚合报告发现并发容量问题top -h先压200再5

2021-07-01 17:29:38 141

原创 并发流程的控制(CountDownLatch、Semaphore、Condition、CycliBarrier)

CountDownLatchCountDownLatch(int count):仅有一个构造函数,参数 count 为需要倒数的数值。await():调用 await() 方法的线程会被挂起,它会等待直到 count值为 0 才继续执行。countDown():将 count 值减1,直到为 0 时,等待的线程会被唤起。用法一一个线程等待多个线程都执行完毕再继续自己的工作。/** * 描述:工厂中,质检,5个工人检查,所有人都认为通过,才通过 */public class CountD.

2021-06-29 21:10:20 113

原创 CAS 原理

应用场景乐观锁并发容器原子类Unsafe 类Unsafe 是 CAS 的核心类。Java 无法直接访问底层操作系统,而是通过本地 (native) 方法来访问。不过尽管如此,JVM 还是开了一个后门,JDK 中有一个类 Unsafe,它提供了硬件级别的原子操作valueOffset 表示的是变量值在内存中的偏移地址,因为 Unsafe 就是根据内存偏移地址获取数据的原值的,这样我们就能通过 unsafe 来实现 CAS 了文字描述我认为 V 的值应该是 A,如果是的话那我就把它改成 B,如

2021-06-29 10:18:28 102

原创 CopyOnWriteArrayList 重点解析

简单介绍CopyOnWriteArrayList 用来代替 Vector 和 SynchronizedList,就和 ConcurrentHashMap 代替 SynchronizedMap 的原因一样Vector 和 SynchronizedList 的锁的粒度太大,并发效率相对比较低,并且迭代时无法编辑Copy-On-Write 并发容器还包括 CopyOnWriteArraySet,用来替代同步 Set适用场景读操作可以尽可能地快,而写即使慢一些也没有太大关系读写规则回顾读写锁:读读共享

2021-06-29 07:20:44 128 1

原创 ConcurrentHashMap 1.7 和 1.8 分析

为什么HashMap是线程不安全的?同时put碰撞导致数据丢失同时put扩容导致数据丢失死循环造成的CPU100%

2021-06-29 06:13:54 391 1

原创 ThreadLocal 解析

使用场景典型场景一每个线程需要一个独享的对象 (通常是工具类,典型需要使用的类有 SimpleDateFormat 和 Random)1000 个打印线程的任务,都用线程池来运行避免众多对象创建和销毁的开销,把 SimpleDateFormat 提出来作为公共变量,但这就会产生线程安全问题,解决方案可以加锁,但是太影响性能了,更好的解决方案使用 ThreadLocal,每个 Thread 内有自己的实例副本不共享,利用 ThreadLocal,给每个线程分配自己的 dateFormat 对象,保证

2021-06-28 16:38:20 120

原创 【Java】线程池ThreadPool学习与使用

线程池的自我介绍如果不使用线程池,每个任务都新开一个线程处理◆ 一个线程◆ for 循环创建线程◆ 当任务数量上升到 1000这样开销太大,我们希望有固定数量的线程,来执行这 1000 个线程,这样就避免了反复创建并销毁线程所带来的开销问题。线程池的好处加快响应速度合理利用CPU和内存统一管理线程池适合应用的场合服务器接受到大量请求时,使用线程池技术是非常合适的,它可以大大减少线程的创建和销毁次数,提高服务器的工作效率实际上,在开发中,如果需要创建5个以上的线程,那么就可以使用线程池来

2021-06-28 09:34:47 154 1

原创 AQS 介绍及核心原理

简介AQS是一个用于构建锁、同步器、协作工具类的工具类(框架)。有了AQS以后,更多的协作工具类都可以很方便得被写出来。一 句话总结:有了AQS ,构建线程协作类就容易多了。因为上面的那些协作类,它们有很多工作都是类似的,所以如果能提取出一个工具类,那么就可以直接用,对于ReentrantLock和Semaphore而言就可以屏蔽很多细节,只关注它们自己的“业务逻辑”就可以了和 AQS 的关系Semaphore、ReentrantLock、CountDownLatch 内部有一个 Sync 类,Sy

2021-06-27 18:13:41 362 2

原创 Nacos 集群配置

预计需要,1个Nginx+ 3个nacos注册中心+ 1个mysq|默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。nacos默认自带数据库derby ,derby 切换到 mysqlnacos-server-1.1.4\nacos\conf目录下找到sql脚本nacos -server- 1.1.4\nacos\conf目录

2021-06-21 10:26:12 223 1

原创 Spring Cloud Gateway 网关学习

Spring Cloud Gateway介绍Spring Cloud Gateway 具有如下特性:基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0 进行构建动态路由:能够匹配任何请求属性可以对路由指定 Predicate(断言)和 Filter (过滤器)集成 Hystrix 的断路器功能集成 Spring Cloud 服务发现功能请求限流和路径重写路由:路由是构建网关的基本模块,它由ID, 目标URI, 一系列的断言和过

2021-06-20 17:39:41 116

原创 OpenFeign 服务接口调用

概述使用步骤父工程下新建 cloud-consumer-feign-order80 模块,引入依赖 <dependencies> <!--openfeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-

2021-06-20 07:55:17 77

原创 Ribbon 客户端负载均衡

Ribbon概述负载均衡分为 集中式 和 进程式集中式:即在服务的消费方和提供方之间使用独立的LB设施以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方;进程式:将L B逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。Ribbon就属于进程内LB,它只是一个类库, 集成于消费方进程,消费方通过它来获取到服务提供方的地址。Ribbon 负载均衡演示Ribbon 核心组件IRuleRi

2021-06-20 07:06:20 76

原创 Eureka 注册中心搭建和集群配置

微服务基本组件约定 > 配置 > 编码搭建父工程,pom 依赖管理dependencyManagement理只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom如果子项目中指定了版本号那么会使用子项目中指定的jar版本热部署Devtools开发时使用,生产环境关闭 &l

2021-06-19 18:28:14 187

原创 RabbitMQ 延迟队列

概述延时队列,队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。TTL 是 RabbitMQ 中一个消息或者队列的属性,表明一条消息或者该队列中的所有消息的最大存活时间,单位是毫秒。换句话说,如果一条消息设置了 TTL 属性或者进入了设置 TTL 属性的队列,那么这条消息如果在 TTL 设置的时间内没有被消费,则会成为"死信"。如果同时配置了队列的 TTL 和消息的TTL,那么较

2021-06-18 09:52:28 260 1

原创 RabbitMQ 死信队列

概念先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer 将消息投递到 broker 或者直接到 queue 里了,consumer 从 queue 取出消息进行消费,但某些时候由于特定的原因导致 queue 中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信自然就有了死信队列。应用场景:为了保证订单业务的消息数据不丢失,需要使用到 RabbitMQ 的死信队列机制,当消息消费发生异常时,将消息投入死信队列中.还有比如说

2021-06-17 16:24:09 101 1

原创 RabbitMQ 三种交换机类型

Exchanges 概念RabbitMQ 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。实际上,通常生产者甚至都不知道这些消息传递传递到了哪些队列中。相反,生产者只能将消息发送到交换机(exchange),交换机工作的内容非常简单,一方面它接收来自生产者的消息,另一方面将它们推入队列。交换机必须确切知道如何处理收到的消息。是应该把这些消息放到特定队列还是说把他们到许多队列中还是说应该丢弃它们。这就的由交换机的类型来决定。直接(direct), 主题(topic) ,标题(head

2021-06-17 15:29:35 128 1

原创 RabbitMQ 入门介绍

MQ 的相关概念什么是 MQMQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ 是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不用依赖其他服务。为什么要用 MQ1.流量消峰举个例子,如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时绰绰有余,正常时段我们下单一秒后就能返回结

2021-06-17 10:13:35 2440

原创 linux目录结构

2021-06-07 22:44:31 45

原创 虚拟机安装 Centos7

centos 下载地址:http://mirrors.163.com/centos/新建虚拟机完成后设置光驱,直接开启虚拟机即可选中第一个点击软件选择配置一下桌面和自带工具方便学习配置分区点击完成,接收更改,然后禁用KDUMP配置网络和主机名这里网络打开自动关闭解决:https://blog.csdn.net/henu1710252658/article/details/105062197关闭最后一个安全应用,直接开始安装设置密码,创建其他用户安装

2021-06-07 21:18:39 73

原创 了解 Dockerfile

介绍Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。构建步骤:编写一个dockerfle文件docker build构建成为一个镜像docker run运行镜像docker push发布镜像构建过程每个保留关键字(指令)都是必须是大写字母执行从上到下顺序执行#表示注释每一个指令都会创建提交一个新的镜像层,并提交!相关指令FROM:该指令用于指定要构建的镜像的基础镜像。它通常是 Dockerfile 中的第一条指令。RU

2021-06-05 21:49:18 63

原创 Docker 常用命令

帮助文档地址:https://docs.docker.com/reference/常用基本命令帮助命令docker vers ion # 显示docker的版本docker info # 显示docker的系统信息docker命令--help # 帮助命令镜像命令docker images # 查看所有本地的主机上的镜像-a, --all # 列出所有镜像-q, --quiet # 只显示镜像的iddocker search # 搜索镜像d

2021-06-04 19:28:10 114

原创 Docker 的安装与基本原理

安装安装之前先卸载 docker 相关 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ dock

2021-06-04 14:47:50 90 1

原创 说说TCP三次握手和四次挥手

传输控制协议TCP简介➢ 面向连接的、可靠的、基于字节流的传输层通信协议➢ 将应用层的数据流分割成报文段并发送给目标节点的TCP层➢ 数据包都有序号,对方收到则发送ACK确认,未收到则重传➢ 使用校验和来检验数据在传输过程中是否有误TCP 头部三次握手三次握手流程图在TCP/IP协议中,TCP 协议提供可靠的连接服务,采用三次握手建立一个连接。第一次握手:建立连接时,客户端发送SYN包[syn=j)到服务器,并进入SYN, _SEND状态,等待服务器确认;第二次握手:服务器收到SYN

2021-06-04 07:38:03 64

原创 枚举类理解与使用

一、枚举类的使用1.枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类2.当需要定义一组常量时,强烈建议使用枚举类3.如果枚举类中只有一个对象,则可以作为单例模式的实现方式。二、如何定义枚举类方式一:jdk5.0之前,自定义枚举类public class TestEnum { public static void main(String[] args) { Person xg = Person.XG; System.out.println(x

2021-05-28 21:38:37 57

原创 消息队列 RabbitMQ 安装及简介

AMQP 定义是具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。AMQP 协议模型Server:又称Broker,接受客户端的连接,实现AMQP实体服务Connection:连接,应用程序与Broker的网络连接Channel:网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表一个会话任务。...

2021-05-26 17:02:20 95

原创 Linux 上软件的安装

JDK 安装清理系统默认自带jdk进行安装如果安装 centos6.8 时默认安装了例如 openjdk 等,请先执行查看已经自带的 jdk 然后卸载rpm -qa | grep jdk卸载命令(XXX为上一个命令查到的结果)sudo yum remove XXX先下载RPM包sudo wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie"

2021-05-26 06:39:41 49

原创 强大的 Stream 流

Stream API简介:Stream API ( java.util.stream) 把真正的函数式编程风格引入到 Java 中。Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简言之,Stream API 提供了一种高效且易于使用的处理数据的方式。Stream 和 Colle

2021-05-20 18:11:55 85

空空如也

空空如也

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

TA关注的人

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