自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Go学习笔记_环境搭建

Go学习笔记_环境搭建Go背景知识go的特点(官网):Build fast, reliable, and efficient software at scale- Go is an open source programming language supported by Google- Easy to learn and get started with- Built-in concurrency and a robust standard library- Growing ecosys

2022-03-09 17:54:58 1233

原创 Go语言基础_数据类型、基本语法篇

Go语言基础Go的数据类型基本数据类型布尔型bool字符型string整型int int8 int16 int32 int64unit unit8 unit16 uint32 unit64 uintptr字节型byterunefloat32 float64complex64 complex128与其他语言的差异Go不支持隐式类型转换别名和原有类型也不能进行隐式类型转换示例错误の示例1错误の示例2类型的预定义值在math包下,有int、float、unit,直

2022-03-09 17:52:46 473

原创 面试复盘整理

面试复盘总结:​ 面试了将近一个月,大厂基本上都面过了,大厂技术栈基本上都是springcloud+mysql+redis+kafka,一面基本上都是自我介绍,问问kafka问问redis问问mysql问问并发。问题基本上都很简单,虽然说都是八股文背一背就行了,不过最好还是有自己的理解,不然稍微厉害的面试官会考察你的思路根据你的理解出场景题,如果只是背诵问两个问题就能发现你根本不理解。简历上写的技术一定要重点准备。​ 面试碰到不会的场景题目没关系,跟面试官表达出自己的思考过程,面试官一般也会提点下。

2022-01-28 12:32:25 3201

原创 面试记录之synchronized的惨败经历

面试记录之synchronized的惨败经历热乎的啊。刚面试完面试题描述3个线程,线程1打印A,线程2打印B,线程3打印C,循环n次思路一:锁+条件变量实现一:synchronized+变量i来判断+wait+notifyPrintError实例:public class PrintError { private static volatile int i = 0; private static Object mutex = new Object(); //me

2022-01-17 18:53:41 364

原创 DDD的分层架构设计

DDD的分层架构设计几种微服务架构模型对比分析整洁架构​ 整洁架构又名“洋葱架构”。为什么叫它洋葱架构?因为整洁架构的层就像洋葱片一样,它体现了分层的设计思想。​ 在整洁架构里,同心圆代表应用软件的不同部分,从里到外依次是领域模型、领域服务、应用服务和最外围的容易变化的内容,比如用户界面和基础设施。 整洁架构最主要的原则是依赖原则,它定义了各层的依赖关系,越往里依赖越低,代码级别越高,越是核心能力。外圆代码依赖只能指向内圆,内圆不需要知道外圆的任何情况。​ 在洋葱架构中,各层的职能是这样划分

2022-01-07 18:20:04 4827

原创 DDD整理(概念篇)

DDD为什么需要DDD微服务架构的演进​ 不赘述,可以查看我之前的分布式架构演进博客。微服务架构划分的痛点​ 那进入微服务架构时代以后,微服务确实也解决了原来采用集中式架构的单体应用的很多问题,比如扩展性、弹性伸缩能力、小规模团队的敏捷开发等等。这是微服务带来的好处,但是道理我都懂,怎么做呢?怎么拆分微服务?微服务的粒度应该多大呀?微服务到底应该如何拆分和设计呢?微服务的边界应该在哪里?​ 可以说微服务拆分困境产生的根本原因就是不知道业务或者微服务的边界到底在什么地方。DDD​ DDD 是

2022-01-07 17:27:25 2392

原创 延时队列的几种实现方式(只有原理,并没有源码)

延时队列需求描述场景一在淘宝下了订单,过半个小时未支付就取消订单场景二还是淘宝(别问,问就是淘宝资深剁手党),发货后超过15天未确认就自动收货需求分析​ 本质上都是超过xxx时间,就异步去做一件事。说到异步那基本上就是搞个定时任务去轮询或者消息队列+轮询。基本上有几种实现方式,挨个看一下。实现方式DelayQueue+DelayedJava的并发包java.util.concurrent下提供了延时队列DelayQueue,它内部维护了一个优先级队列PriorityQueue来维护任

2022-01-05 20:47:59 1867 1

原创 分布式事务

分布式事务事务介绍事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中,一个事务由一组SQL语句组成。事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。原子性(atomicity [ˌætəˈmɪsəti] ):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。一致性(consistency [kənˈsɪstənsi] ):事务必须是使数据库从一个一致性状态变到另一个一

2022-01-04 15:31:50 1193

原创 分布式锁的几种实现方式

分布式锁的几种实现方式要如何实现对共享资源进行互斥操作呢?锁就是其中一个非常通用的解决方案。在单节点多线程环境,你使用本地的互斥锁就可以 完成资源的互斥操作。然而单节点存在单点故障,为了保证服务高可用,你需要多节点部 署。在多节点部署的分布式架构中,你就需要使用分布式锁来解决资源互斥操作了。分布式锁分布式锁的三个 主要核心要素:安全性、互斥性。在同一时间内,不允许多个 client 同时获得锁。活性。无论 client 出现 crash 还是遭遇网络分区,你都需要确保任意故障场景下,都不 会出

2022-01-03 17:58:35 3989

原创 synchronized关键字

synchronized关键字锁相关知识​ 多线程编程中,有可能会出现多个线程同时访问同一个共享、可变资源的情况,这个资源我们称之其为临界资源;这种资源可能是:对象、变量、文件等。共享:资源可以由多个线程同时访问可变:资源可以在其生命周期内被修改引出的问题​ 由于线程执行的过程是不可控的,所以需要采用同步机制来协同对对象可变状态的访问!互斥的两种方案​ 最容易想到的在多线程编程下,对资源的保护那就是采用互斥的手段。 在操作系统种,对于进程互斥有两种实现方案:信号量与管程。事实上,它们

2021-12-25 16:06:27 435

原创 分布式架构演进

分布式架构演进架构设计的三大目标​ 高性能、高可用、可扩展。​ 架构设计要切忌过度设计,最适合自己业务的才是最好的,并不是说大家都用分布式架构,你也要用;单体架构太low就一定不用。一个架构带来好处的时候也一定会带来弊端:比如将单体服务微服务化后,可以帮助实现服务的敏捷开发和部署。但是,由于将原本一体化架构的应用,拆分成了多个通过网络通信的分布式服务,为了在分布式环境下,协调多个服务正常运行,就必然引入一定的复杂度;而原本单体服务很容易做到的事务、单点登录到了分布式架构中也会难度加倍。单体服务

2021-12-22 20:23:30 2839

原创 优雅的退出

优雅的退出程序如何退出​ 我们希望任何程序的优雅退出,都需要在退出前做好收尾工作,比如我们在关机时,一般都是会按部就班的关机,如果长时间没响应了才会直接去按关机键强制关机。所以我们希望在退出任何程序前,都要先做好相应的收尾工作,那么退出程序一般会分为这几步:切断上游流量入口,确保不再有流量进入到当前节点向应用发送kill 命令,在设定的时间内待应用正常关闭若超时后应用仍然存活,则使用kill -9命令强制关闭不同层面の优雅关闭操作系统层面,提供了 kill -9 (SIGKILL)和 k

2021-12-17 16:05:15 3036

原创 线程池の优雅使用

线程池の优雅使用为什么需要线程池复用线程​ 在之前学习线程池的时候,其实也提到过,创建线程并不是我们认为的new个Thread对象就完事儿,实际上创建线程还涉及到内存的分配,创建以及销毁内存都是相对重量级的操作(相对进程而言);其次,系统分给每个进程的内存也是有限制的,可以想象,每个进程的内存-堆的内存-方法区的内存-程序计数器的内存-进程本身的内存,剩下的就是虚拟机栈和本地方法栈,加上如果每个线程分配到的栈容量越大,那可以创建的线程也就越少,如果无脑创建线程会导致内存溢出——“OOM”。那复用就是一

2021-12-17 14:11:25 726

原创 Kafka集群

Kafka集群Kafka与Zookeeper控制器是重度依赖 ZooKeeper 的,Apache ZooKeeper 是一个提供高可靠性的分布式协调服务框架。它使用的数据模型类似于文件系统的树形结构,根目录也是以“/”开始。该结构上的每个节点被称为 znode,用来保存一些元数据协调信息。如果以 znode 持久性来划分,znode 可分为持久性 znode 和临时 znode。持久性 znode 不会因为 ZooKeeper 集群重启而消失,而临时 znode 则与创建该 znode 的 ZooK

2021-12-11 21:19:41 1552

原创 Kafka的高可靠性保证

Kafka的高可靠性实现​ 在消息队列介绍里,介绍过消息队列对高可靠性的保证可以从消息队列的三个阶段来保证高可靠性。生产阶段: ack机制存储阶段消费阶段:ack机制​ 那这里就从存储阶段,Kafka集群的副本机制来介绍。Kafka副本机制​ 所谓的副本机制(Replication),也可以称之为备份机制,通常是指分布式系统在多台网络互联的机器上保存有相同的数据拷贝。副本机制的好处:提供数据冗余。即使系统部分组件失效,系统依然能够继续运转,因而增加了整体可用性以及数据持久性

2021-12-11 21:18:04 209

原创 Kafka的事务实现

Kafka的事务​ Kafka 的事务解决的问题和 RocketMQ 是不太一样的。RocketMQ 中的事务,它解决的问题是,确保执行本地事务和发消息这两个操作,要么都成功,要么都失败。并且,RocketMQ 增加了一个事务反查的机制,来尽量提高事务执行的成功率和数据一致性。​ 而 Kafka 中的事务,它解决的问题是,确保在一个事务中发送的多条消息,要么都成功,要么都失败。注意,这里面的多条消息不一定要在同一个主题和分区中,可以是发往多个主题和分区的消息。当然,也可以在 Kafka 的事务执行过程中

2021-12-11 21:15:45 2606

原创 JVM调优与线上问题监控工具安利

JVM调优与线上问题监控工具首先命令行输入java -version,查看本机的Java版本信息以及JVM相关信息可以看到的Java8,HotSpot虚拟机,Client模式启动,混合编译模式XXX>java -versionjava version "1.8.0_251"Java(TM) SE Runtime Environment (build 1.8.0_251-b08)Java HotSpot(TM) Client VM (build 25.251-b08, mixed mode)

2021-12-11 20:20:05 879 2

原创 Kafka核心概念与源码阅读

Kafka学习笔记Kafka简介More than 80% of all Fortune 100 companies trust, and use Kafka.Apache Kafka is an open-source distributed event streaming platform used by thousands of companies for high-performance data pipelines, streaming analytics, data integrati

2021-12-09 17:31:08 1439

原创 消息队列笔记

消息队列笔记​ 本文部分图片摘自极客课程:消息队列高手课;部分概念摘自维基百科。消息队列的概念​ 任何技术的出现都是为了解决某个问题,消息队列是为了解决应用之间通信的需求,但是又不仅仅是这个需求。​ 那么消息队列是什么,有什么作用呢?​ 举个例子来说,就比如现在网购这么发达,最开始的快递行业是送货上门,你有个快递,快递小哥就会送到你家门口。但是问题来了,家里不一定有人啊。快递小哥就会直接把快递放在家门口,然后给你发个短信——xxx单号的快递放你家门口了,记得签收一下。如果没什么意外你下班回到家拿

2021-12-07 17:07:15 712

原创 并发编程——并发容器

并发编程——并发容器​ 本文总结下Java中的并发容器。​ Java中的容器主要分为四个大类:List、Map、Set、Queue。我们常用的ArrayList、HashMap并不是并发安全的,在JDK1.5之前,其实JDK有提供线程安全的容器——Collections类中的synchronized系列,synchronizedList、SynchronizedMap、SynchronizedSet,它们被称为同步容器。​ 它们的实现也非常的简单粗暴:​ 下面截取部分synchronizedList

2021-11-27 17:10:46 1093

原创 并发编程——线程协作

并发编程——线程协作​ 前面学习了线程,那么并发编程中,如何协调多个线程来开发呢?Semaphore​ 信号量跟前面将的同步互斥解决方案——信号量是一个东西,这是JDK的信号量实现。源码分析​ 先看下JDK的Semaphore类注释,看下Semaphore是做什么的:A counting semaphore. Conceptually, a semaphore maintains a set of permits. Each acquire blocks if necessary until

2021-11-22 17:07:26 473

原创 并发编程应用——线程池中的ThreadLocal变量传递

线程池中的ThreadLocal变量传递​ 本文讲述下在项目开发过程中遇到的实际问题。问题问题描述​ 之前搞得项目是SpringCloud开发的微服务项目,用户登录之后把用户信息塞到header里给我们,然后后端统一在网关拦截,读取用户ID然后塞到用户上下文中。但是我们在改造项目的时候发现个问题,莫名其妙的用户信息丢失了​ 经过排查,发现是因为SpringCloud的Hystrix隔离策略默认是线程池隔离。原因分析​ 在前面其实有讲过,信号量跟管程都是操作系统的同步互斥方案,那这里Hytrix

2021-11-21 17:54:16 1645

原创 并发编程——并发编程之锁分类

锁锁模型​ 在前面JMM内存模型中有介绍过,其实原子性问题的源头是线程切换。如果我们把线程切换禁用了呢?单核CPU场景下好办,因为同一时刻单核就意味着只有一个线程执行,紧致CPU中断,那么操作系统就不会重新调度线程,也就禁止了线程切换。但是多核场景下,同一时刻可能有两个线程同时在执行。​ 同一时刻只有一个线程在执行这个条件就是我们说的互斥,如果不管在单核CPU还是多核CPU,我们都保证对共享变量的修改是互斥的,那么也就可以保证原子性了。​ 这就需要锁,简单的锁模型如下:临界区在图中演示的需要被

2021-11-21 12:17:37 820

原创 并发编程——共享对象的正确使用

共享对象的正确使用概述​ 在JMM,Java内存模型中讲过,其实并发编程的问题主要在多线程对共享变量的修改读取上,那么互斥(加锁),其实是通过同步来避免多个线程在同一时刻访问共享变量,但是其实并不是所有的场景都需要加锁。比如并不是所有的场景都会更改共享变量的值,它们仅仅需要把主内存的数据读取出来,然后在工作内存中拷贝一份来读取(线程本地存储);也不是所有的场景都要求立马读取最新的数据(cop-on-write);甚至有些场景直接不共享变量的值—线程封闭;又或者这个变量的值永远都不会改变—不变模式。​

2021-11-20 17:37:46 557

原创 并发与多线程学习思路

​ 仅个人在并发与多线程上的学习思路,有问题请指正​ 首先总结了多线程与并发的关系,在其中对线程与进程的关系、并发并行串行三者的概念做了总结,然后重点看了Java中的线程,对它的属性、Thread类源码,生命周期、创建启动、停止中断、异常情况处理等问题做了总结,然后了解了线程池,进而在并发问题上,从为什么会有并发问题,引发到了JMM,Java内存模型,然后对并发问题的安全性处理方案做了总结,在互斥方面介绍了操作系统的两种同步互斥方案—管称与信号量。​ 接下来会对Java中的锁进一步分类:​ 锁介绍

2021-11-20 14:23:11 137

原创 并发编程的问题

并发编程的问题安全性问题​ 事实上,并不是所用的情况用多线程就一定比单线程快。多线程如果使用不当,不仅会带来严重的安全性问题,也会造成性能问题。​ 在JVM内存结构中,我们知道栈、程序计数器、局部变量这些是线程私有的,但是进程范围内的资源,同一个进程内的线程都会共享进程内的地址空间,那么它们会共享堆上分配的对象。当多个线程并发运行时,它们就可能会访问或者修改其他线程正在使用的变量造成严重的后果,比如我们在JMM笔记中提到的read-modify-write。那么在并发编程中,如果我们可以对要访问的资

2021-11-19 17:51:53 282

原创 线程篇——线程池

线程池为什么需要线程池​ 经过前面对线程的学习,我们会发现创建线程看起来很简单,new Thread()就完事儿了,但是实际上创建线程需要调用操作系统内核的API,然后操作系统需要为它分配一系列的资源。可以说创建线程是一件成本非常高的事情,线程是一个重量级对象,要避免频繁的创建与销毁。​ 那我们就需要有个地方,可以保存创建好的线程,需要的时候去里面拿就行了,用完了放回去,以便下次可以继续使用。我们希望的线程池​ 我们认为的线程池往往是这样的:​ 需要的时候我们去线程池获取线程,然后执行我们的业

2021-11-17 17:21:04 521 2

原创 Java内存模型

多线程编程的问题​ 在前面阅读了Thread类的源码,总结了线程的创建、停止、生命周期,以及多线程编程的异常处理,那么接下来就要总结多线程编程下的安全问题。​ 事实上,并不是所用的情况用多线程就一定比单线程快。多线程如果使用不当,不仅会带来严重的安全性问题,也会造成性能问题。​ 在JVM内存结构中,我们知道栈、程序计数器、局部变量这些是线程私有的,但是进程范围内的资源,同一个进程内的线程都会共享进程内的地址空间,那么它们会共享堆上分配的对象。当多个线程并发运行时,它们就可能会访问或者修改其他线程正在使

2021-11-16 18:23:22 2943

原创 线程篇——线程的异常处理

Java异常处理体系(下图截取自慕课网视频)Error跟Exception都是继承ThrowableError指的是Java运行过程中系统的内部错误或者资源耗尽,一旦发生,并不能通过代码层面来catch住Exception分为两种:RuntimeException跟其他异常​ RuntimeException是程序的问题,Error跟RuntimeException都是编译器无法预测的,都称非受检查异常​ 其余称为受检查异常,需要我们在程序中对这些可能出现的异常进行处理多线程中的异常处理​

2021-11-14 18:47:53 1939

原创 线程篇——Thread类源码

Thread类源码Thread类重要属性​ 我们跟到Thread类,看下线程有哪些属性。​ Thread类的重要属性: /* For autonumbering anonymous threads. */ private static int threadInitNumber; /* Whether or not the thread is a daemon thread. */ private boolean daemon = false; privat

2021-11-14 12:43:07 1278

原创 线程篇——线程的停止与中断

interrupt还是先看下Thread类中interrupt方法的注释:Interrupts this thread.Unless the current thread is interrupting itself, which is always permitted, the checkAccess method of this thread is invoked, which may cause a SecurityException to be thrown.If this thread i

2021-11-14 12:31:07 1858

原创 线程篇——线程的生命周期

Java线程的生命周期​ 在Thread类中,我们可以看到有个内部枚举类State:/** * A thread state. A thread can be in one of the following states: * NEW A thread that has not yet started is in this state. * RUNNABLE A thread executing in the Java virtual machine is in this state. * BL

2021-11-14 12:22:29 67

原创 线程篇——线程的创建与启动

线程的创建与启动创建线程​ 关于创建线程,我们阅读Thread类源码的注释:There are two ways to create a new thread of execution. One is to declare a class to be a subclass of Thread. This subclass should override the run method of class Thread. An instance of the subclass can then be all

2021-11-11 17:41:40 590

原创 并发基础知识

并发简述​ Java在设计之初,就是支持多线程的语言。​ 在Java学习中,我们经常能听到:高并发、多线程这样的词汇。那么,高并发是什么?线程是什么?高并发与线程有什么关系呢?线程与进程​ 在oracle的官方文档中,对进程与线程是这样描述的:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0HfiQPX9-1636536872218)(image-20211110142756751.png)]​ 翻译过来,就是进程,是通过fork命令创建出来的运行环境,包含了如

2021-11-10 17:35:10 610

原创 软引用测试&GC日志分析

软引用测试测试背景测试环境:​ jdk8​ windows垃圾收集器​ 命令行通过PrintCommandLineFlags查看程序使用的默认JVM参数并没有UseParallelGC这项: xxx>java -XX:+PrintCommandLineFlags -version-XX:InitialHeapSize=16777216 -XX:MaxHeapSize=268435456 -XX:+PrintCommandLineFlags -XX:-UseLargePagesIndiv

2021-10-30 21:35:21 414

原创 JVM之垃圾回收

垃圾回收在前面有讲到,通过JVM,让Java可以一次编写,到处运行。那么,它是怎么进行内存管理,让程序员不需要手动的分配内存、释放内存的呢?​ 垃圾回收GC,全称Garbage Collection。实际上,GC并不是Java这门语言的产物,GC的历史比Java久远的多。JVM内存结构中,哪些需要进行垃圾回收​ JVM内存结构主要分为程序计数器、虚拟机栈、本地方法栈、堆、方法区几个部分。其中,程序计数器、虚拟机栈、本地方法栈都是随线程而生,随线程而灭。并且这几个区域的内存分配和回收都具备确定性,

2021-10-29 17:56:31 211

原创 JVM内存结构

JVM内存结构Java​ 我们都知道,java是一门广受认可的编程语言,除了它严谨的结构、面向对象编程之外,还有很多不可忽视的优点,如:​ 一次编写,到处运行​ 提供了相对安全的内存管理和访问机制​ 完善的应用程序接口​ …那么,java为什么可以一次编写,到处运行呢?​ 这就是jvm的功效了。JVM,Java Virutal Machine,是java程序(java二进制字节码)的运行环境。通过jvm,屏蔽代码与底层操作系统的差异。JVM结构Java虚拟机在执行Java

2021-10-27 15:14:36 114

原创 Redisの数据库设计

Redisの数据库设计redis的结构图如下:​ 下面,分别对各个数据结构进行介绍RedisServer​ 众所周知,redis的配置文件是redis.conf,redis在启动时会加载配置文件。那么配置文件的配置项都加载在哪里呢?​ 阅读redis源码,会看到Redis将配置文件的配置数据加载到数据结构redisServer,并将所有的数据库保存在db数组中。根据配置文件中的database,决定要创建多少个数据库dbnum。struct redisServer { //其余配置...

2021-09-26 16:37:19 621

原创 Redis基础知识

redis基础知识redis以下内容摘自redis中文官网:http://www.redis.cn/Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作**数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询**, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了

2021-09-15 23:24:56 146

原创 Redis主从复制

Redis主从复制概念​ 主从复制,指的是将一台Redis服务器的数据,复制到其他的Redis服务器。前者称之为主节点,后者称之为从节点。数据的复制是单向的,只能由主节点到从节点。主节点以写为主,从节点以读为主。​ 默认情况下,每台Redis服务器都是主节点。​ 通常我们会使用一主二从。原因有两个:​ 1.两个从节点才能进行哨兵机制的选举​ 2.如果一主一从,那么它们两个都挂掉的概率还是挺高的,但是如果一主二从,三个服务器都挂掉的机率就会大大降低。主从复制的作用数据冗余​ 主从复制实现了数

2021-09-15 23:03:20 105

空空如也

空空如也

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

TA关注的人

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