自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(144)
  • 问答 (2)
  • 收藏
  • 关注

转载 Innodb中的事务隔离级别和锁的关系

前言我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在。这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。一次封锁or两段锁?因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用到哪些数据,

2021-07-01 12:06:18 199

原创 缓存与数据库的一致性:先操作缓存还是先操作数据库?

旁路缓存模式的流程写操作:先更新 DB然后直接删除 cache读操作:从 cache 中读取数据,读取到就直接返回cache中读取不到的话,就从 DB 中读取数据返回数据放到 cache 中。

2021-07-01 11:22:49 781

原创 常用限流算法分析

一、计数器(固定窗口)算法计数器算法是使用计数器在周期内累加访问次数,当达到设定的限流值时,触发限流策略。下一个周期开始时,进行清零,重新计数。此算法在单机还是分布式环境下实现都非常简单,使用redis的incr原子自增性和线程安全即可轻松实现。计数器算法对于秒级以上的时间周期来说,会存在一个非常严重的问题,那就是临界问题,如下图:假设1min内服务器的负载能力为100,因此一个周期的访问量限制在100,然而在第一个周期的最后5秒和下一个周期的开始5秒时间段内,分别涌入100的访问量,虽然没有超

2021-06-28 20:27:40 430 2

原创 MySQL日志:binlog、事务日志(redo、undo)

事务的隔离性是通过锁实现,而事务的原子性、一致性和持久性则是通过日志实现。Mysql的日志可以分为:binlog:server层实现事务日志:包括redo log、undo log,引擎层(innodb)实现redo logredo log是用于备份事务中操作得到的最新数据的地方redo log通常是物理日志,记录的是数据页的物理修改,而不是记录某一行或某几行的修改,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。在innoDB的存储引擎中,事务日志通过重做日志(

2021-06-17 14:23:01 770

转载 DDD中聚合的概念

DDD中的聚合模式是最难弄清楚的一种模式,在如何确定聚合边界这个问题上,更没有一个明确的指导原则,这导致DDD的落地比较难。不过,相信你读了这篇文章应该对聚合会有更深刻的理解。本文分三部分来讲:1、什么是聚合?2、聚合解决了什么问题?3、聚合的边界划分指导原则1. 什么是聚合?首先我们来看下聚合模式的定义:将实体和值对象划分为聚合并围绕着聚合定义边界。选择一个实体作为每个聚合的根,并仅允许外部对象持有对聚合根的引用。作为一个整体来定义聚合的属性和不变量,并把其执行责任赋予聚合根或指定的框架机

2022-05-19 22:48:37 1208

转载 go 语言 error 处理的最佳实践

今天分享 go 语言 error 处理的最佳实践,了解当前 error 的缺点、妥协以及使用时注意事项。文章内容较长,干货也多,建议收藏什么是 error大家都知道 error[1] 是源代码内嵌的接口类型。根据导出原则,只有大写的才能被其它源码包引用,但是 error 属于 predeclared identifiers 预定义的,并不是关键字,细节参考int make 居然不是关键字?// The error built-in interface type is the conventional

2022-04-17 18:33:42 3939

原创 简单分析KafKa工作原理

架构图Producer:Producer即生产者,消息的产生者,是消息的入口。kafka cluster:Broker:Broker是kafka实例,每个服务器上有一个或多个kafka的实例,我们姑且认为每个broker对应一台服务器。每个kafka集群内的broker都有一个不重复的编号,如图中的broker-0、broker-1等……Topic:消息的主题,可以理解为消息的分类,kafka的数据就保存在topic。在每个broker上都可以创建多个topic。Partition:Topic的

2022-04-04 15:37:21 2749

原创 Raft共识算法

前提条件Raft不考虑拜庭将军问题,即消息会延迟、丢失但不会错误。Raft的特性Strong leader:在 Raft 中,日志条目(log entries)只从 leader 流向其他服务器。 这简化了复制日志的管理,使得 raft 更容易理解。Leader 选举:Raft 使用随机计时器进行 leader 选举。 这只需在任何一致性算法都需要的心跳(heartbeats)上增加少量机制,同时能够简单快速地解决冲突。成员变更:Raft 使用了一种新的联合一致性方法,其中两个不同配置的大多数在

2022-04-02 15:00:46 564

转载 一文理清Cookie、Session、Token

发展史1、很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应, 尤其是我不用记住是谁刚刚发了HTTP请求, 每个请求对我来说都是全新的。这段时间很嗨皮。2、但是随着交互式Web应用的兴起,像在线购物网站,需要登录的网站等等,马上就面临一个问题,那就是要管理会话,必须记住哪些人登录系统, 哪些人往自己的购物车中放商品, 也就是说我必须把每个人区分开,这就是一个不小的挑战,因为HTTP请求

2022-03-28 16:25:54 121

原创 Mac 环境变量配置

环境变量配置cd ~ (回到主目录home)如果你是第一次配置环境变量,可以使用“touch .bash_profile” 创建一个.bash_profile的隐藏配置文件vim .bash_profile,写入相应的环境变量,如下:# golang配置export GOROOT=/usr/local/Cellar/go/1.10.2/libexecexport GOBIN=$GOPATH/binexport GOPATH=$HOME/goexport PATH=$PATH:$GOBIN

2021-11-26 18:16:26 215

转载 GET与POST传递数据的最大长度能够达到多少

各种web开发语言中,各个页面之间基本都会进行数据的传递,web开发里面比较常用的数据传递方式有get post,一直以来我都只知道get传递的数据量要比post传递的数据量要少,所以传递大数据量还是要用post,但是 get post 这两种方式最大能传递多少数据呢?一直没搞清楚。今天由于工作的需要,还必须得把这个问题搞明白一下了,下面就说说GET与POST传递数据的最大长度能够达到多少吧。get 是通过URL提交数据,因此GET可提交的数据量就跟URL所能达到的最大长度有直接关系。很多文章都说GE

2021-07-22 16:55:41 8157

转载 MySQL 对于千万级的大表要怎么优化?

很多人第一反应是各种切分;我给的顺序是:第一 优化你的sql和索引;第二 加缓存,memcached,redis;第三 以上都做了后,还是慢,就做主从复制或主主复制,读写分离,可以在应用层做,效率高,也可以用三方工具,第三方工具推荐360的atlas,其它的要么效率不高,要么没人维护;第四 如果以上都做了还是慢,不要想着去做切分,mysql自带分区表,先试试这个,对你的应用是透明的,无需更改代码,但是sql语句是需要针对分区表做优化的,sql条件中要带上分区条件的列,从而使查询定位到少量的分区上,

2021-07-10 12:16:49 204

原创 Spring IOC 如何解决循环依赖?

前言假设对象A、B 之间相互依赖,Spring IOC是如何解决A、B两个对象的实例化的?答案是三级缓存。三级缓存SpringIOC 通过三级缓存来解决循环依赖问题,三级缓存指的是三个Map:singletonObjects:一级缓存,key为BeanName,value为Bean,日常获取Bean的地方earlySingletonObjects:二级缓存,key为BeanName,value为Bean,已经实例化但还没有进行属性注入的Bean,由三级缓存放入singletonFactorie

2021-07-09 16:43:50 4017 1

原创 Spring IOC 容器启动、Bean生命周期详解

前言在Spring IOC 和 AOP 概览中,简要介绍了IOC容器和AOP,没有深入IOC容器Bean的实例化,此文承接上文深入分析Bean的实例化过程、生命周期。Spring IOC的过程Spring的IoC容器在实现控制反转和依赖注入的过程中,可以划分为两个阶段:容器启动Bean实例化容器启动的流程容器启动阶段需要扫描 XML/注解/JavaConfig 中需要被Spring管理的Bean信息将Bean信息封装成 BeanDefinition 并放入beanDefinitionM

2021-07-09 15:48:47 364

原创 Spring IOC 和 AOP 概览

IOC(控制反转)IoC(Inversion of Control,控制倒转)。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。在没有IOC时,我们通过new 等关键字等方式,自己实例化对象。而使用IOC只需要通过IOC容器去获取对象,所有的类的创建、销毁都由spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。IOC容器Spring中提供了两种IoC容器:BeanFactoryApplicationContext

2021-06-25 11:36:27 208 1

原创 Java版大顶堆的实现

堆的概念堆是一棵完全二叉树,一般使用数组来存储。通俗来讲堆其实就是利用数组来维护一个完全二叉树。按照堆的特点可以把堆分为大顶堆和小顶堆大顶堆:堆的每个结点的值都大于或等于其左右孩子结点的值小顶堆:堆的每个结点的值都小于或等于其左右孩子结点的值根据堆的概念(利用数组维护的完全二叉树),可以推导出:假设 节点A 在数组 tree 的索引为 i 则(1)A节点的左节点索引:leftIdx = (i+1)/2 -1(2)A节点的右节点索引:rightIdx = (i+1)/2(3)A的

2021-06-24 19:28:35 1786

原创 Integer和Int的比较,谈谈拆卸和装箱

示例代码public static void main(String[] args) { Integer a = new Integer(10111); int b = 10111; boolean equal1 = a == b;//自动拆箱,xxxValue() boolean equal2 = a.equals(b);//自动装箱, valueOf() System.out.println(equal1);

2021-06-24 09:39:11 361

原创 MySQL优化(四):count()

count()不同写法的区别COUNT(字段名):返回SELECT语句检索的行中值不为NULL的行数COUNT(1):表示的是直接查询符合条件的数据库表的行数(会包含值为NULL的行数)。其中1指的是表中的第一个字段,如有表 table(id, column1),则1指 id。COUNT(*):表示的是直接查询符合条件的数据库表的行数(会包含值为NULL的行数),其中* 指所有所有字段,并且是SQL92定义的标准统计行数的语法,因为是标准语法,所以MySQL数据库进行过很多优化,推荐使用。COUNT

2021-06-23 15:04:36 906 1

原创 一文理类加载相关知识:类加载器、双亲委派、SPI

思维导图类加载的时机类加载的流程类从被加载到内存中开始,直到被从内存中卸载为止,它的整个生命周期包括:验证、准备、解析、初始化、使用和卸载7 个阶段。其中验证、准备、解析 3 个部分统称为连接(Linking)1.加载(重点)类加载过程的第一步,主要完成下面 3 件事情:通过全类名获取定义此类的二进制字节流将字节流所代表的静态存储结构转换为方法区的运行时数据结构在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口加载阶段(准确地说,是加载阶段中获取类的二进

2021-06-22 15:23:13 200

原创 happen-before原则的理解

前言在程序执行时,为了提高性能,编译器和处理器会对指令进行重排序。为了明确定义多线程场景下重排序的问题(可见性、有序性、原子性),Java引入了JMM(Java Memory Model),也就是Java内存模型。JMM为JAVA程序员提供了8条规则,即happen-before原则。根据happen-before原则,就可以在不理解复杂的重排序规则情况下,解决因重排序而导致的多线程间可见性、有序性等问题。happen-before原则两个操作具有happen-before关系,并不意味着前一个操

2021-06-20 11:49:34 476

原创 一文理清Http2.0

前言HTTP2.0主要有三大特性:头部压缩、服务端推送(Server Push)、多路复用。本文从分析http1.x存在的问题入手,逐一介绍http2.0的优势。Http1.x存在的问题在HTTP1.0下,HTTP1.1非Keep-Alive模式下,每个请求都要新建一个TCP连接,完成之后立即断开连接,如果有新的请求,则要重新创建请求TCP连接。多次请求建立多次TCP会耗费大量时间,同时没有必要。为了解决这个问题, HTTP 1.1 中提供了 Keep-Alive,允许一定时间(此时间在Nginx或

2021-06-13 11:45:32 1192

转载 JVM内存结构分析:为什么需要S0和S1?

一、为什么会有年轻代我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象的区域进行回收,这样就会腾出很大的空间出来。二.年轻代中的GC新生代大小(PSYoungGen total 9216K)=eden大小(e

2021-06-11 10:31:48 3768 5

转载 finally块不被执行的情况总结

finally块的作用通常用于处理善后工作。当try块里出现异常时,会立即跳出try块,到catch块匹配对应的异常,执行catch块里的语句。此时,可能在try块里存在打开的文件没关闭,连接的网络没断开,这部分资源是GC所不能自动处理的,所以finally的作用就是将它们及时释放回收。finally块不被执行的情况,总共有3种:不进入try块、程序中止、线程中止(带finally块的是守护线程,其非守护线程都执行完毕)。1. 未执行try块对于try-catch-finally或者try-fina

2021-05-30 09:51:10 1043

原创 Mysql优化(三):优化order by

MySQL中的两种排序方式.通过有序索引顺序扫描直接返回有序数据因为索引的结构是B+树,索引中的数据是按照一定顺序进行排列的,所以在排序查询中如果能利用索引,就能避免额外的排序操作。EXPLAIN分析查询时,Extra显示为Using index。.Filesort排序即对返回的数据进行排序所有不是通过索引直接返回排序结果的操作都是Filesort排序,也就是说进行了额外的排序操作。EXPLAIN分析查询时,Extra显示为Using filesort。无法使用索引排序的情况首先要注意:M

2021-05-29 23:25:02 1186

原创 一文理清RocketMQ顺序消费、重复消费、消息丢失问题

前言在使用消息队列时不可避免的会遇到顺序消费、重复消费、消息丢失三个问题。在一次面试字节的时候,面试官问到如何保证顺序消费,当时回答不太准确,特意此文回顾如何解决顺序消费、重复消费、消息丢失三个问题。重复消费......

2021-05-22 12:15:59 8319 1

原创 一致性Hash算法原理

前言当在需要将数据分发到多个数据库/缓存,或将请求分发给多个服务节点时,不可避免的会遇到以下问题:如何将数据均匀的分散到各个节点中,并且尽量的在加减节点时能使受影响的数据最少。选择节点的方法随机放置从多个节点中,随机挑选一个,实现简单但不能做到数据均匀分布到每个节点Hash将数据的key按 index = hash(key) % N选择节点。N代表有N个节点。此方法能将数据均匀的分发给每个节点,但在添加或修改节点时,即N发生变换时,所有数据都需要重新计算,扩展性差一致性Hash一致性Has

2021-04-26 10:57:23 2510

原创 有序数组中查找第一个比target大的数

思路:二分法时间复杂度:O(logn)空间复杂度:O(1)代码:public class Solution{ public int search(int[] nums, int target){ int lf=0, rt=n.length-1; while(lf<=rt){ int mid = lf+(rt-lf)/2; if(n[mid]>t){ rt = mid-1;

2021-04-23 10:17:54 1355

原创 一文搞懂ThreadLocal及相关的内存泄露问题

首先,看一张整体的结构图,来帮助理解什么是ThreadLocalThreadLocal用于创建线程局部变量,如果创建一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题ThreadLocal的简单使用package test;public class ThreadLocalTest { static ThreadLocal<String> threadLocal=

2021-04-03 14:16:46 1568 1

原创 一文理清HashMap的实现及细节

前言最近阅读了许多HashMap实现及源码分析的文章,特意此文记录HashMap的知识点。HashMap 底层由 数组 + 链表 组成,在 jdk1.7 和 1.8 中具体略有不同。JDK1.7下的HashMap数据结构:图片来源核心成员变量图片来源初始化桶大小(1<<4,即:16),因为底层是数组,所以这是数组默认的大小。桶最大值。默认的负载因子(0.75)table 真正存放数据的数组。Map 存放数量的大小。桶大小,可在初始化时显式指定。负载因子,可在初始化

2021-03-31 16:37:33 2019 1

转载 对于高并发的理解及实践方案

首先说一下,当我作为面试官问候选人「对于高并发的理解」时,我觉得「答得不好」的情况分成以下几类:对数据化的指标没有概念:不清楚选择什么样的指标来衡量高并发系统?分不清并发量和QPS,不知道自己系统的总用户量、活跃用户量,平峰和高峰时的QPS和TPS等关键数据。设计过一些高并发方案,但是细节掌握不透彻:讲不出该方案要关注的技术点和可能带来的副作用。比如读性能有瓶颈会引入缓存,但是忽视了缓存命中率、热点key、数据一致性等问题。理解片面,把高并发设计等同于性能优化:大谈并发编程、多级缓存、异步化、水平扩

2021-03-26 10:53:06 158

原创 gateway坑点:gateway有Controller时会直接处理对应的路径并返回

前言使用gateway过程中,因为在gateway中加入了一个标注@RestController的类,导致请求直接由gateway中的@RestController的类处理并返回。花费了几小时才发现问题原因,特此记录问题以gateway作为网关转发请求得到的响应,所有字段都为null且不为设定的通用返回格式//网关的地址请求路径:localhost:8080/user/get?id=1直接调用服务接口返回值正常//服务的地址请求路径:localhost:9000/user/get?id=1

2021-03-18 12:24:43 4109

原创 Zookeeper入门总结

什么是Zookeeper官方定义:zookeeper是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。可以简单理解为 Zookeeper = 文件系统 + 监听通知机制Zookeeper的特性注:以下server指Zookeeper的单个服务节点,client指Zookeeper的客户端全局数据的一致:每个 server 保存一份相同的数据副本,cli

2021-03-14 11:20:22 1920

原创 Java中synchronized同步块的执行流程

必要知识Java 对象的数据结构在 HotSpot 虚拟机中,Java 对象在内存中存储的布局可以分为 3 块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)对象头中的 Mark Word 部分,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等,其中的最后 2bit 是锁状态标志位(无锁、偏向锁、轻量级锁、重量级锁、GC 标识)synchronized 的执行过程

2021-03-05 22:00:28 1900

原创 ubuntu系统下安装docker并部署Springboot+mysql+redis

安装Docker最简单的方法:使用国内 daocloud 一键安装命令curl -sSL https://get.daocloud.io/docker | sh验证是否安装成功:docker version若出现版本信息则说明成功安装了Docker常用命令此部分转载自:博主「一路向北0」1.重启docker服务systemctl restart docker 2.停止docker命令systemctl stop docker 3.查看镜像列表docker images4.删

2021-03-04 00:19:32 2349 1

原创 FeignClient调用服务及上传文件的注意点及问题

代码示例文件服务接口 /** * 用于上传文传 * UploadFile包含fileName、fileDesc * 不加@RequestParam等同于@RequestParam(required = false) * * @param file 文件 * @param entity 文件的描述 * @return */ @PostMapping("/add") public Response&lt

2021-02-10 12:26:56 3655

原创 MySQL优化(二):索引的类型、匹配原则、创建原则

索引的优缺点常见的索引结构有: B 树, B+树和 Hash。优点:加快数据的检索速度缺点:创建索引和维护索引需要耗费许多时间:当对表中的数据进行增删改的时候,如果数据有索引,那么索引也需要动态的修改,会降低 SQL 执行效率。占用物理存储空间 :索引需要使用物理文件存储,也会耗费一定空间。索引类型聚簇索引(主键索引)聚簇索引即索引结构和数据一起存放的索引,结构为B+树。InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,聚簇索引就是按照每张表的主键构造一颗B

2021-02-01 15:22:26 2021

原创 算法设计与分析:(二)动态规划

目录设计思想使用动态规划的必要条件适用动态规划算法解决的问题的特征:优化原则:动态规划的一般步骤设计思想动态规划算法适用于组合优化问题,通过划分子问题的边界,从子问题开始逐层向上求解,通过子问题之间的依赖关系进行推导计算,最大限度减少重复工作,提高算法效率。但需要较大的存储空间来存储子问题计算的中间结果。使用动态规划的必要条件使用动态规划的问题,必须满足优化原则适用动态规划算法解决的问题的特征:(1) 求解的问题是多阶段决策(优化)问题(2)求解的过程是多步判断,从小到大依次求解每个子问题

2021-01-15 17:02:42 1976

原创 算法设计与分析:(一)时间复杂度分析

数学基础设f和g是定义域为自然数集N上的函数存在正整数c、n,使0<=f(n)<=cg(n)成立,称f(n)的渐进上界是g(n),记作f(n)=O(g(n))存在正整数c、n,使0<=cg(n)<=f(n)成立,则称f(n)渐进下界是g(n),记作f(n)=Ω(g(n))若f(n)=O(g(n))且f(n)=Ω(g(n)),则称f(n)与g(n)同阶,记作f(n)=Θ(g(n))常见阶从大到小的顺序O(n) <O(nlogn)<O(n^2)<O(2

2021-01-15 15:44:25 3137

原创 SpringMVC 参数校验

SpringMVC 可以通过使用注解的方式对参数进行校验,省去参数校验的代码引入依赖Spring项目需引入<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.7.Final</version></dependenc

2021-01-09 21:17:40 5856 1

原创 SpringMVC控制器方法获取参数时@RequestParam注解加与不加的区别

问题在使用SpringMVC时获取参数时,加与不加@RequestParam都会自动传入参数值,那加与不加的区别是什么?测试 @GetMapping("test1") public String test1(String s){ return "参数:"+s; } @GetMapping("test2") public String test2(@RequestParam String s){ return "参数:"+s; }

2021-01-09 17:08:46 1771

空空如也

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

TA关注的人

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