自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zhangyuanshuai的博客

记录进步的点滴

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

原创 SpringBoot整合ElasticSearch

环境ElasticSearch 。如果使用 docker-compose 部署 ElasticSearch 集群,可以参考我的这篇文章 docker-compose部署ElasticSearch集群依赖pom.xml 依赖文件如下:springboot 版本是 2.4.0.RELEASE 。<dependencies> <dependency> <groupId>org.springframework.boot</groupId&g

2021-09-11 13:16:05 912 2

原创 2021年6月面试题Java后台(字节、招银、花旗、携程)

招银网络科技(深圳)技术面和HR一起面。自我介绍、项目。技术问题:介绍下生产者消费者模型。通过怎样的设计可以提高消费速度。生产者消费者模型中怎么避免重复消费、遗漏消费。线程run方法和start方法的区别。说下冒泡排序思路,有没有更快的排序算法,说下实现思路。问题相对较少。项目占了不少时间,全程大概一个小时。花旗金融(上海)一面:自我介绍(英文)。项目细节(英文)。问项目问题(中文)。技术问题(中文):常用的集合类有哪些。HashMap中put方法的流程大致说下。H

2021-07-01 22:13:58 3536

原创 docker-compose部署ElasticSearch集群

Elasticsearch Compose 配置文件创建一个 docker-compose.yml 内容如下:version: '2.2'services: es01: image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1 container_name: es01 environment: - node.name=es01 - cluster.name=es-docker-cluste

2021-06-22 18:19:38 824 3

原创 解决Redis序列化Java8 LocalDate、LocalDateTime等时间类报错

前言在使用 Redis 缓存时,Java 8 中的日期类序列化会报错。有以下两种解决方法:Redis 配置类中添加对应序列化/反序列化器@Slf4j@EnableCaching@Configurationpublic class RedisConfig extends CachingConfigurerSupport { //过期时间 1 小时 private Duration timeToLive = Duration.ofHours(1L); /** *

2021-06-22 18:18:18 2294

原创 SpringBoot 整合 RabbitMQ

环境RabbitMQ如果使用 docker-compose 部署,可以参考我的这篇文章:docker-compose部署RabbitMQ(含管理页面)项目结构及依赖为了方便测试,创建一个项目结构如下:主要依赖是 springboot 整合 amqp 的 starter。如下:(Junit 用于 provider 中测试发送消息)<!-- rabbitmq --><dependency> <groupId>org.springframework.bo

2021-06-08 20:53:12 187 1

原创 docker-compose部署RabbitMQ(含管理页面)

RabbitMQ Compose 配置文件创建一个 docker-compose.yml 内容如下:version: '3.1'services: rabbitmq: restart: always image: rabbitmq:management container_name: rabbitmq hostname: rabbit ports: - 5672:5672 - 15672:15672 environment:

2021-06-08 20:51:09 6093 1

原创 SpringBoot 整合 Kafka

环境ZooKeeper、Kafka。如果使用 docker-compose 部署 Kafka 集群,可以参考我的这篇文章 docker-compose安装Kafka集群依赖pom.xml 依赖文件如下:springboot 版本是 2.3.0.RELEASE 。<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <

2021-06-03 20:55:10 25167 7

原创 Java实现LRU算法(哈希表加双向链表)

LRULRU 全称 Least Recently Used,意为最近最少使用,是最常见的页面置换算法,也常用于实现缓存淘汰策略。实现哈希表 + 双向链表。链表头节点代表最近使用过的数据。对于 get 操作,首先判断 key 是否存在:如果 key 不存在,则返回 -1;如果 key 存在,则 key 对应的节点是最近被使用的节点。通过哈希表定位到该节点在双向链表中的位置,并将其移动到双向链表的头部,最后返回该节点的值。对于 put 操作,首先判断 key 是否存在:如果 ke

2021-05-26 19:46:46 346

原创 SpringCloud整合Sentinel控制台不显示多层接口簇点链路

示例项目示例项目 GitHub:https://github.com/leo1604270786/hello-sentinel细节可以查看我的这篇文章 SpringCloud 整合 Sentinel 并连接 Nacos 改造后的控制台pom.xml :<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.or

2021-05-18 21:12:39 3891

原创 MySQL日志文件总结

MySQL日志文件MySQL 服务器会产生很多日志,这些日志有些有助于分析问题,有些用于主从复制、崩溃恢复。有些日志仅特定存储引擎才有。MySQL 服务器产生的日志有一下几种:错误日志(error log)该日志记录了 MySQL 服务器的启动和关闭,以及发生错误时的相关异常信息。如果没做特殊配置,该日志默认是在控制台输出的,可以通过修改配置文件的形式启用。如:修改 MySQL 配置文件[mysqld]server-id=1log_error=mysql_errlog.err通过 log

2021-05-17 22:53:32 1189 3

原创 MySQL 索引总结

索引索引是存储引擎用于快速定位记录位置的一种数据结构。在 MySQL 中也叫做键(key)。索引的优缺点索引不单单是用于快速定位指定记录的位置。对于 BTree 索引,是按照顺序存储数据的,所以可以用于ORDER BY 和 GROUP BY 操作。并且索引中存储了值,某些查询可以只使用索引就可以完成,无需查询数据行(索引覆盖)。总结一下索引的优点:索引提高数据检索的效率,降低数据库IO压力。通过索引进行排序效率高。索引的缺点:索引会占据磁盘空间。索引会提高表的查询效率,但会降低表的

2021-05-13 23:31:30 358

原创 实用工具Arthas的简单使用

Arthas 是什么Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。Arthas 官方文档安装shell 版执行以下命令:curl -L https://arthas.aliyun.com/install.sh | shjar 版(推荐)curl -O https://arthas.aliyun.com/arthas-boot.jar启动执行以下命令启动 Arthas:java -jar arthas-boot.jar启动后会让我们选择连接哪个应用程

2021-05-12 19:38:59 180

原创 SpringCloud 整合 Sentinel 并连接 Nacos 改造后的控制台

环境依赖Nacos。如使用docker安装可参考:docker-compose部署Nacos改造好的 sentinel-dashboard。具体改造可参考改造sentinel-dashboard,使用Nacos持久化规则(详细)创建项目创建项目 hello-sentinel。pom.xml 文件如下:<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"

2021-04-14 19:40:26 885

原创 docker-compose部署Nacos

docker-compose 部署 NacosNacos 在 Github 上有专门的项目,用于构建 Nacos Docker 镜像。克隆该项目,项目地址:https://github.com/nacos-group/nacos-dockergit clone https://github.com/nacos-group/nacos-docker切换到对应版本分支:可以访问上诉 Github 地址查看包含那些版本。git checkout 1.4.1进入 nacos-docker 目录c

2021-04-14 19:36:30 846

原创 改造sentinel-dashboard,使用Nacos持久化规则(详细)

前言要想改造 sentinel-dashboard,需要修改 dashboard 的源码。(本文基于sentinel 1.8.0)先通过 Github 拉取 Sentinel 源码,GitHub 地址:https://github.com/alibaba/Sentinel导入 IDEA,下载依赖,进入 sentinel-dashboard 模块,所有的修改都在该模块下。修改 POM想要将 dashboard 的规则持久化到 Nacos,需要添加一个依赖,源码中已经添加,不过只在测试环境下打包进去了

2021-04-14 19:30:37 1831 2

原创 docker-compose部署Redis-Cluster集群

创建目录和文件创建目录和文件、结构如下:├── docker-compose.yml├── redis-6371│ ├── conf│ │ └── redis.conf│ └── data├── redis-6372│ ├── conf│ │ └── redis.conf│ └── data├── redis-6373│ ├── conf│ │ └── redis.conf│ └── data├── redis-6374│

2021-02-09 10:18:16 771 1

原创 Redis 集群方案

Redis集群方案Redis 集群方案分为三种:主从、Sentinel(哨兵)、Cluster。主从主从模式下,Redis 分为主库(master)和从库(slaver)。主库负责读写,从库只负责读。当主库发生写事件后会将数据同步至从库。主库挂了不会重新选举主库,需等主库重启之后才能继续提供写服务,此间从库仍可提供读服务。初始化阶段:从库启动后,向主库发送 Sync 命令,主库收到 Sync 命令后,生成 RDB 快照,并缓存生成快照期间的写命令,快照生成完后,发送至从库。从库收到后根据快照和缓存的

2021-02-09 10:16:43 232

原创 Kafka概览

KafkaKafka 是一种高吞吐量、分布式、基于发布/订阅的消息系统,最初由 LinkedIn 公司开发,使用Scala 语言编写,目前是 Apache 的开源项目。Kafka 中的概念及其含义:broker: Kafka 服务器,负责消息存储和转发topic:消息类别, Kafka 按照 topic 来分类消息partition: topic 的分区,一个 topic 可以包含多个 partition, topic 消息保存在各个partition 上offset:消息在日志中的位置,可以

2021-01-25 19:52:42 130

原创 MyBatis缓存

MyBatis缓存Mybatis 中有一级缓存和二级缓存,默认情况下一级缓存是开启的,而且是不能关闭的。一级缓存是指 SqlSession 级别的缓存,当在同一个 SqlSession 中进行相同的 SQL 语句查询时,第二次以后的查询不会从数据库查询,而是直接从缓存中获取,一级缓存最多缓存 1024 条 SQL。二级缓存是指可以跨 SqlSession 的缓存。 是 mapper 级别的缓存,对于 mapper 级别的缓存不同的sqlsession 是可以共享的。MyBatis缓存示意图:一级

2021-01-15 23:12:11 122

原创 MyBatis配置详解

Mapper的XML配置文件apper 的 XML 配置文件包含一些设置和属性,用于增强 MyBatis 的动作。文档的深层次结果如下:configuration|--- properties|--- settings|--- typeAliases|--- typeHandlers|--- objectFactory|--- plugins|--- environments|--- |--- environment|--- |--- |--- transactionManager|

2021-01-15 23:11:08 861

原创 MyBatis动态语句(SQL)

动态语句MyBatis动态语句是MyBatis最强大的特性之一,通过动态语句,我们可以更方便地编写SQL语句。MyBatis中的动态语句主要包括:if、choose(when、otherwise)、trim(where、set)、foreach。if含义就像编程语言中的if一样,用于进行条件判断。例如:<select id="selectAll" parameterType="User" resultType="User"> select * from user wher

2021-01-15 23:09:58 1021

原创 MyBatis映射文件

Mapper映射文件MyBatis Mapper映射文件主要包含以下标签:select、insert、updae、delete、resultMap、parameterMap、sql、include、selectKey。select查询标签,对应一条查询语句。示例:<select id="selectUserById" paramterType="Integer" resultType="User"> select * from user where id = #{id}&lt

2021-01-15 23:08:54 518

原创 MyBatis入门

MyBatisMyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。 MyBatis 摒除了大部分的 JDBC代码、手工设置参数和结果集获取。 MyBatis 只使用简单的 XML 和注解来配置和映射基本数据类型、Map 接口和 POJO 到数据库记录。每一个 MyBatis 应该都是以一个 SqlSessionFactory 实例为中心。一个 SqlSessionFactory 实例可以使用SqlSessionFactoryBuilder 来创造。 从配置类中创造的定制 SqlSe

2021-01-15 23:06:36 72

原创 事务详解

单机事务事务的特性ACIDA(Atomicity),原子性。指事务中的语句要么全都执行,要么全都不执行。C(Consistency),一致性。指事务执行前后数据库中数据的一致性不发生改变。I(Isolation),隔离性。指事物之间相互隔离,操作独立,不会互相影响。D(Durability),持久性。值事务对数据库的更改是持久的,不会无缘无故的回滚。事务的隔离级别由低到高Read-Uncommited,读未提交。Read-Commited,读已提交。Read-Repea

2021-01-15 23:02:11 532

原创 docker-compose部署MySQL主从

创建目录及配置文件创建目录结构如下,之后用于挂载数据卷:├── master│ ├── conf│ └── data├── slaver0│ ├── conf│ └── data└── slaver1 ├── conf └── data进入./master/conf目录,创建文件vi my.cnf,内容如下:[mysqld]# 集群服务器id,不可重复server-id = 1# 同步(binlog)文件名称log-bin = mysql-bin

2021-01-15 23:00:23 681

原创 CAP定理与BASE理论

CAP定理CAP 原则又称 CAP 定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、 Partition tolerance(分区容错性),三者不可得兼。一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)。可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)。分区容错性(P):系统中任意信息的丢失或失败不会影响系统的继续运作。

2021-01-08 20:39:25 284

原创 docker-compose安装Kafka集群

前提由于 Kafka 借助 ZooKeeper 进行数据同步,所以安装 Kafka 集群时,需先安装 ZooKeeper 集群。为了降低耦合,分别安装 ZooKeeper 集群和 Kafka 集群,然后通过配置在同一个 Docker 网络中保证 Kafka 能和 ZooKeeper 正常通信。首先通过docker network create zookeeper_network命令创建一个名为zookeeper_network的 Docker 网络。ZooKeeper Compose 配置文件创建

2021-01-08 20:37:48 3149 4

原创 布隆过滤器

布隆过滤器布隆过滤器(Bloom Filter)是一种来检索元素是否在给定大集合中的数据结构,这种数据结构是高效且性能很好的,但缺点是具有一定的错误识别率和删除难度。并且,理论情况下,添加到集合中的元素越多,误报的可能性就越大。它由位数组和一系列哈希函数构成。初始时位数组的值全为0。布隆过滤器原理加入元素当一个元素加入布隆过滤器中的时候,会进行如下操作:使用布隆过滤器中的哈希函数对元素值进行计算,得到哈希值(有几个哈希函数得到几个哈希值)。根据得到的哈希值,在位数组中把对应下标的值置为 1。

2021-01-08 20:36:39 114

原创 常见缓存读写策略

缓存读写策略我们都知道缓存大多数情况下是用来减轻数据库压力的。缓存读写策略就是在进行数据读/写时以何种策略读写缓存和数据库,即:读请求时先读缓存还是数据库,缓存中数据不存在怎么办,写请求时先更新数据库还是缓存,同步更新还是异步更新等一系列问题的方案。Cache Aside PatternCache Aside Pattern 译为旁路缓存模式。该模式以数据库为主,缓存为辅。主要策略如下:读请求在读请求时,先查询缓存:1. 缓存中存在,直接返回;2. 缓存中不存在,查询数据库,然后将结果写入缓存。

2021-01-08 20:35:32 755

原创 SpringCloud Gateway 路由网关

SpringCloud GatewaySpringCloud Gateway 是一个基于 Spring 生态系统的 API 网关。基于 Spring Boot 2.x, Spring WebFlux 和 Reactor 构建。因此,使用 Spring Cloud Gateway 时,许多熟悉的同步库(例如,Spring Data 和 Spring Security )和模式可能不适用。Spring Cloud Gateway 需要Spring Boot 和 Spring Webflux 提供的 Nett

2020-12-31 19:59:05 242

原创 SpringCloud 概览

SpringCloudSpingCloud 为开发人员提供了工具,以快速构建分布式系统中的一些常见模式(如:配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、Leader选举、分布式session、集群状态)。他们将适用于任何分布式环境中,包括开发人员自己的笔记本电脑,金属裸数据中心,Cloud Foundry等托管平台。SpringCloud官网SpringCloud 特性分布式/版本化配置服务注册与发现路由服务间调用负载均衡断路器全局锁Leader选举和

2020-12-31 19:57:54 86

原创 Netty概览

目录NettyNetty 特性Netty 核心组件ChannelChannelFutureChannelHandlerEventLoopEventLoopGroupBootstrap/ServerBootstrapNetty 线程模型Reactor 单线程模型Reactor 多线程模型主从 Reactor 多线程模型Netty 高性能IO多路复用和NIO零拷贝无锁设计、线程绑定高性能序列化NettyNetty 是一个高性能、异步事件驱动的 NIO 框架,基于 JAVA NIO 提供的 API 实现。它提

2020-12-23 18:38:57 106

原创 JVM类加载机制

JVM类加载机制JVM 类加载机制分为五个部分:加载,验证,准备,解析,初始化。1. 加载加载是类加载过程中的一个阶段, 这个阶段会在内存中生成一个代表这个类的 java.lang.Class 对象, 作为元空间这个类的各种数据的入口。注意这里不一定非得要从一个 Class 文件获取,这里既可以从 ZIP 包中读取(比如从 jar 包和 war 包中读取),也可以在运行时计算生成(动态代理),也可以由其它文件生成(比如将 JSP 文件转换成对应的 Class 类)。2. 验证这一阶段的主要目的是

2020-12-20 17:10:52 79

原创 G1垃圾收集器

G1垃圾收集器Garbage first 垃圾收集器是目前垃圾收集器理论发展的最前沿成果,相比与 CMS 收集器, G1 收集器两个最突出的改进是:基于标记-整理算法,不产生内存碎片。可以非常精确控制停顿时间,在不牺牲吞吐量前提下,实现低停顿垃圾回收。G1 收集器避免全区域垃圾收集,它把堆内存划分为大小固定的几个独立区域(Region),并且跟踪这些区域的垃圾收集进度,同时在后台维护一个优先级列表,每次根据所允许的收集时间, 优先回收垃圾最多的区域。区域划分和优先级区域回收机制,确保 G1 收集

2020-12-20 17:07:46 242

原创 JVM垃圾回收

Java堆(heap)构成Java堆是线程共享的内存区域,几乎所有的对象和数组都保存在这里。也是垃圾收集器进行垃圾收集的最重要的内存区域。由于现代JVM的GC算法采用分代收集算法,所以从GC的角度,堆可以被划分为新生代(Eden区、SurvivorFrom区、SurvivorTo区),老年代(Old)。新生代占堆内存的1/3。老年代占2/3。新生代中:Eden占8/10,SurvivorFrom和SurvivorTo各占1/10。新生代Eden区SurvivorFrom区Surv

2020-12-20 17:05:24 85

原创 Java类文件中的字节码指令

目录字节码指令使用javap工具注意:本章内容紧接上篇文章 通过HelloWorld读懂Java类(.class)文件结构字节码指令通过读取HelloWorld.class文件的内容,我们得知方法信息部分包含字节码指令。如:<init>方法部分的字节码指令为2A B7 00 01 B1其中:2A代表aload_0,即加载slot 0的局部变量,即this,作为下面invokespecial的参数B7代表invokespecial,即预备调用构造方法00 01代表常量池中的第一项

2020-12-20 16:59:25 294 1

原创 通过HelloWorld读懂Java类(.class)文件结构

目录Hello World类文件结构魔数版本常量池访问标识和继承信息成员变量方法信息附加属性Hello World一个最简单的Hello World程序源代码如下:package top.zysite;public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); }}通过javac -parameters -d . He

2020-12-20 16:57:21 454 2

原创 Java代码连接ZooKeeper(Curator)

目录Curator简介创建项目创建junit测试类Curator简介Apache Curator 是 ZooKeeper 的Java客户端库。包含了高标准的API工具库,让我们可以更加简单、可靠的使用ZooKeeper。创建项目先启动ZooKeeper。如果还没安装:docker-compose安装ZooKeeper集群。通过IDEA创建一个Maven项目。并引入如下依赖:<!-- curator begin --><dependency> <groupI

2020-12-11 17:12:04 454

原创 CyclicBarrier、CountDownLatch、Semaphore对比

目录CountDownLantchCyclicBarrierSemaphore对比CountDownLantch称作线程计数器。当某个线程需要等待其他 n 个线程执行完毕后才能执行,就可以使用CountDownLantch。public static void main(String[] args) throws InterruptedException { int num = 2; final CountDownLatch latch = new CountDownLatch(nu

2020-10-17 22:51:50 113

原创 ZooKeeper常用命令

ZooKeeper 常用命令注:我是通过 docker-compose 安装的ZooKeeper集群。安装方式:docker-compose安装ZooKeeper集群服务端交互式进入容器,查看 bin 目录下文件:root@zoo1:/apache-zookeeper-3.6.2-bin/bin# ls -altotal 72drwxr-xr-x 2 zookeeper zookeeper 4096 Sep 4 12:43 .drwxr-xr-x 6 zookeeper zookeepe

2020-10-17 22:48:54 113

空空如也

空空如也

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

TA关注的人

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