自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(114)

原创 redis的持久化 —— RDB和AOF

一、AOF1.1 redis如何通过AOF进行写日志redis AOF采用的是写后操作,也就是数据先写入内存中,再写入到AOF日志文件中。采用这样的好处是,可以避免当次操作,因为写日志而降低性能,采用写后操作,可以在写入日志时,不需要校验命令的正确性,保证写入到日志的命令都是正确的。坏处是:虽然没有降低当次请求的操作,但是写入日志还是在主线程中进行的,所以会影响到下次命令的性能。1.2AOF日志记录什么在AOF日志中记录的就是操作的命令信息,例如一个操作 set hello wor.

2020-10-24 20:27:05

原创 为什么redis这么快

一、使用内存进行存储我们都知道redis是使用内存来进行数据的存储,这也是为什么redis的访问速度要远远快于mysql的主要原因,因为是使用内存存储数据,可以避免频繁的进行写盘操作,大大降低响应时间:内存器 随机访问延迟 Memory 100ns SSD 150us HDD 10ms 二、单线程结构多线程一定比单线程快嘛?虽然我们知道当我们使用多线程的时候,可以加快我们的系统访问,但是在使用多线程的过程中,对于共享变量的访问,会将多线程操作变成单线程

2020-10-19 22:22:29 19

原创 float精度丢失问题详解

今天运行一个程序,发现一个很有意思的情况,可以看到代码如下所示public static void main(String[] args) { float a = 1; for (int i = 0; i<20000000; i++) { a++; } System.out.println(a);}public static void main(String[] args) { floa

2020-08-29 12:26:43 47

原创 如何写出好代码

要想写出好代码,我们首先要知道,什么样的代码是好代码,代码的批判标准有哪些?1、可维护性(maintainability):易维护代码:在不破坏原有代码设计、不引入新的 bug 的情况下,能够快速地修改或者添加代码;代码不易维护:修改或者添加代码需要冒着极大的引入新 bug 的风险,并且需要花费很长的时间才能完成。2、可读性(readability):软件设计大师 Martin Fowler 曾经说过:“Any fool can write code that a computer can unde

2020-08-10 21:43:29 54

原创 spring源码解读(三) —— 编写自定义标签

在spring中,我们经常使用spring中给我提供的便签来完成很多功能,有的时候当spring提供的标签无法满足我们的开发时,这是,我们就可以使用自定义标签来扩展我们的程序,下面我们就来看看如何使用自定义标签功能。1.首先定义一个实体,用来接收自定义的配置标签public class User { private String userName; private String email; // 省略get/set方法}2.定义一个xsd文件描述组件内容名

2020-07-19 18:00:10 43

原创 spring源码解读(二) —— 如何解析bean元素

bean元素是我们在xml配置文件中,使用到最多的一个元素,当我们在xml中配置了一个bean元素之后,spring帮助我们做了什么事呢?让我们跟进spring的源码来一探究竟。实现配置一个简单的xml文件:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001

2020-07-04 11:08:53 72

原创 spring源码解读(一) —— xml头文件的作用
原力计划

Spring的核心功能之一就是IOC,也就是一个容器管理功能,那么我们怎么将我们定义的bean注入的Spring容器中,spring中,提供了xml文档,我们将我们的bean定义在xml中,spring中就可以管理我们的对应,xml定义如下:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://

2020-06-27 20:12:42 144

原创 与架构师一步之差 —— 注解和反射
原力计划

一、注解简介:注解(Annotation)是java5引入的一种代理辅助工具,它的核心作用是对类、方法】变量、参数和包进行标注,通过反射来访问这些标注信息,以此在运行时改变所注解对象的行为。java中的注解由内置注解和元注解组成。元注解:元注解只要包括四个,用来修饰注解的作用。@Retention定义注解的生命周期:【source -> class -> runtime】主要是作用在runtime时。 @Documented文档注解,会被javadoc工具文档化 @Inherit

2020-06-14 19:47:35 90

原创 一文读懂什么是JMS规范

一、JMS是什么java消息服务(java message service即JMS)应用程序接口是一个java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。java消息服务是一个与具体平台无关的API。对应的API接口就在javax.jms包下面:二、JMS的对象模型ConnectionFactory 连接工厂 Connection 连接 Session 会话 Destination 目.

2020-05-24 11:15:51 57

原创 如何设计消息中间件

什么是消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流;并基于数据通信来进行分布式系统的集成;通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信;应用场景:跨系统数据传递,高并发流量削峰、数据异步处理等。常用的消息中间件:ActiveMQ、RabbitMQ、kafka、RocketMQ消息中间件核心设计本质:一种具备接受请求、保存数据、发送数据等功能的网络应用。和一般网络应用的区别是它主要负责数据的接收和传递,所以性能一般高于普通程序。5大核心组成:

2020-05-17 17:10:33 111

原创 了解虚拟机——类加载过程

类加载的整个过程如下图所示:包括加载,验证,准备,解析,初始化,使用,卸载整个流程。一、加载目的:通过一个类的全限定名来获取定义此类的二进制字节流,并将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构,并在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。其中获取Class文件可以有如下途径: 1.从zip压缩包中读取; 2.从网络中获取; 3.运行时计算生成; 4.由其他文件生成; ...

2020-05-11 22:47:54 69

原创 详解虚拟机识别的Class类文件结构信息

一、魔数每个class的头4个字节叫做魔数,用来表示这个文件是不是能被虚拟机所识别的文件。这个值就是cafebabe(咖啡宝贝)。二、版本号class文件中,第5和第6个字节表示的是java的此版本好,第7和第8个字节是主版本号,上图中0034表示的是10进制的52,也就是java8的版本。依次类推,JDK7表示51,JDK6表示50。三、常量池常量池可以作为class文件...

2020-05-07 22:34:31 445

原创 详解java程序一个new的过程

在java的世界里,只要当我们去创建一个对象时,都是通过关键字去new的,那么当我们写完这个new之后,我们的程序是怎么帮我们生成这个对象的呢?带着这个问题,我们一起来讨论一下:首先当虚拟机接受到new的字节码指令的时候,先要去常量池中,看能否找到这个类的符号引用信息;当我们没有找到的这个信息的时候,就会去执行这个类的加载信息过程;加载完成后,java虚拟机就会给我们创建的对象去分配内存。...

2020-04-23 22:39:26 109

原创 使用idea对多线程进行调试

首先展示我们的调试代码示例:public class UnsafeArrayList { static ArrayList al = new ArrayList(); static class AddTask implements Runnable { @Override public void run() { t...

2020-04-20 21:31:27 92

原创 一文读懂netty对javabytebuf的增强
原力计划

一、JDKByteBuffer的缺点1.无法动态扩容:长度是固定,不能动态扩展和收缩,当数据大于ByteBuffer容量时,会发生索引越界异常。2.API使用复杂:读写的时候需要手工调用flip()和rewind()等方法,使用时需要非常谨慎的使用这些api,否则很容易出现错误。二、ByteBuf做的增强方面1.API操作便捷性2.动态扩容3.多种ByteBuf实现4....

2020-04-12 21:54:06 92

原创 一文看懂TCP/UDP协议

一、传输控制协议TCP简介:传输控制协议(TCP)是Internet一个重要的传输层协议。TCP提供面向连接、可靠、有序、字节流传输服务。应用程序在使用TCP之前,必须先建立TCP连接。tcp报文格式:其中报文格式中的标志位说明:URG:紧急指针 ACK:确认序号 PSH:有DATA数据传输 RST:连接重置 SYN:建立连接 FIN:关闭连接二、TCP握手挥手机制...

2020-04-06 10:43:30 131

原创 多线程核心之——线程通信
原力计划

在javaJDK中提供了三种线程通信的方式,下面主要就是对这三种线程通信进行一个详细的讲解和对比。本文全部的实例已一个生产者-消费者模型来讲解,如图所示:一、suspend和resume(现已被启用的方法) 缺点:1.当线程被suspend的时候,如果获得锁资源,不会被释放,容易造成死锁。 2.suspend一定要比resume先执行,如果res...

2020-03-29 09:32:03 51

原创 etcd集群连接不上问题

3台机器部署etcd机器,一直报错,直接上图:一直提示我证书失效,但我命名是刚刚生成的证书进行分发。最后发现,原来是3台服务器的时间没有对应上,导致一直拒绝连接。解决方法:每台服务器上进行时间的更新:ntpdate cn.pool.ntp.org然后再重新生成证书,进行分发!就可以了...

2020-03-18 17:47:23 720

原创 使用zookeeper实现分布式锁

在zookeeper中,根据zookeeper的特性,我们有两种方式来实现分布式锁。实现方式一:在zookeeper节点下面,让需要获得锁的程序,都去创建名为Lock的临时节点,因为多实例创建的节点名称相同,只会有一个实例创建节点成功,那么这个实例就可以获得锁,就可以去执行本身代码逻辑,其他没有创建成功的实例,就去注册一个watch去监听Lock节点,当抢到锁的实例执行完本身程序后,就会去...

2020-03-01 17:10:29 540 1

原创 idea编写类和方法的自定义注解

类的自定义注解模板:File —> Settings —> Editor —> File and Code Templates ——> Files ——> Class;然后自定义自己的注解模板/** * @Description:${TODO} * @Author hdd * @Date ${DATE} ${TIME} */publ...

2020-02-27 15:45:25 135

原创 初识Docker

Docker基本概念Docker使用Google公司推出的Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及AUFS类的Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。Docker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建...

2019-12-21 14:06:23 436 1

原创 redis缓存失效问题

redis数据失效导致的雪崩因为缓存失效,从而导致大量的请求没有命中缓存,导致请求全部打到数据库。1.大量请求,导致数据库处理不过来,整个系统依赖数据库的功能全部崩溃。2.单系统挂掉,其它依赖于该系统的应用也会出现不稳定甚至崩溃。redis数据失效的场景1.因为打到内存阀值,采用数据淘汰策略(LRU/LFU)导致数据失效。2.数据设置了过期时间,达到过期时间后,数据...

2019-11-11 19:27:08 873

原创 redis中如何保证缓存数据的一致性

方式一:先更新数据库,再更新缓存场景当有两个线程A、B,同时对一条数据进行操作,一开始数据库和redis的数据都为tony,当线程A去修改数据库,将tong改为allen,然后线程A在修改缓存中的数据,可能因为网络原因出现延迟,这个时候线程B,将数据修改成了Mike、然后将数据库中的tony,也改成了Mike,然后线程A恢复正常,将redis中的缓存改成了allen,此时就出现了缓存数据和数据...

2019-11-04 22:31:25 1614

原创 RabbitMQ入门详解

一、简介RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。二、RabbitMQ核心概念Producer(生产者):就是投递消息的一方。生产者负责生产消息,然后发布到RabbitMQ中。其中消息一般分为两个部分:消息体和附加消息。消息体(payload):在实际应用...

2019-10-08 16:05:59 67

原创 kafka基本概念

一、简介kafka是一个分布式流处理平台,是由Scala编写具有高水平扩展和高吞吐量的分布式消息系统。kafka对消息保存时根据topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)称为broker。二、kafka两种消息模型1.点对点模型(一对一,消费者主动拉取数据,消息收到后消息清除)...

2019-09-30 10:29:46 52

原创 activemq安装及简单使用

准备工作:首先去官网下载activemq的安装包,官网地址:http://activemq.apache.org/activemq-5158-release.html然后将安装包上传到服务器上。1.解压安装包:tar -zxvf apache-activemq-5.15.8-bin.tar.gz -C2.修改文件名称,并进入activemq的bin目录下:mv /va...

2019-08-24 16:30:19 106

原创 深入理解synchronized关键字

同步关键字的用法当使用synchronized关键字修饰普通方法时,加锁对象就是Object,对静态方法,静态代码块加synchronized关键字,加锁对象就是Class对象。jvm对synchronized锁优化锁优化:当一个对象在单个线程中使用,并且多次调用synchronized进行加解锁操作时,JIT编译就会对方法进行优化,消除加锁操作。比如如下代码:StringBuf...

2019-08-06 00:30:31 59

原创 理解jvm —— 垃圾回收机制

一、java的垃圾回收策略java采用的是自动垃圾收集策略,并不需要我们在程序代码中进行手动的垃圾回收,自动垃圾收集是查看堆内存,识别正在使用那些对象以及那些对象未被删除和删除未使用对象的过程。使用中的对象或引用的对象意味着程序的某些部分仍然维护指向该对象的指针,程序的任务部分都不再引用未使用的对象或未引用的对象,因此可以回收未引用对象使用的内存。二、如何确定内存需要被回收1.标记。这...

2019-07-07 16:57:26 150

原创 理解jvm —— 类加载机制

一、类的生命周期1.加载 —— 读取二进制内容。2.验证 —— 验证class文件格式规范、语义分析、引用验证、字节码验证。3.准备 —— 分配内存、设置类static修饰的变量初始值。4.解析 —— 类、接口、字段、类方法等解析。5.初始化 —— 为静态变量赋值;执行静态代码块。6.使用 —— 创建实例对象。7.卸载 —— 在jvm方法区中进行卸载。二、类加载器...

2019-07-05 00:36:56 95

原创 使用CORS解决跨域问题

一、产生跨域的原因:浏览器会向服务器发送一个Option方法的预检请求,如果服务器拒绝响应,浏览器就无法访问。因此我们可以针对Option请求来处理跨域问题。二、解决办法:在spingboot中针对option请求添加一个准入机制:@SpringBootApplicationpublic class BackendApp { public static void m...

2019-06-25 22:09:20 919

原创 巧妙利用注解+aop实现关联查询

需求:在不实用关联查询时,如果更优雅的实现两个表的查询并组合在一起返回。1.首先定义两个注解:@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface NeedSetFiledValue {}@Target(ElementType.FIELD)@Retention(Ret...

2019-06-16 14:01:53 318

原创 【MySql专栏】—— 关联查询join的流程以及优化

一、应不应该使用关联查询?对于关联查询来说,并不是所有情况下都能使用的,有的公司会直接禁用关联查询,因为使用关联查询后,那么后序在项目升级时,对数据库进行分库分表后,关联查询就没办法在使用,所有代码都需要重构,不利于后期的维护和重构。本篇文章的前提条件是可以使用关联查询,那么在我们使用关联查询的时候需要注意什么?为了后序的验证,这里创建两个表CREATE TABLE `t1` ( ...

2019-06-13 00:16:49 548 1

原创 【MySql专栏】—— 排序order by的过程

在开发过程中,我们经常需要根据某个字段进行排序,在拿到我们需要的结果即,那么当我们在使用order by这个语句的使用,mysql内部都做了那些操作的,这就是这篇文章想要说明的问题,首先我们来创建一个订单表,里面有三个字段主键id,订单id和一个创建时间,创建表的语句如下:CREATE TABLE `order` ( `id` int(11) unsigned NOT NULL AUTO...

2019-06-03 23:19:21 109

原创 基础数据结构——图、DFS、BFS

一、图定义:是一种比线性表和树更为复杂的数据结构,在图形结构中结点之间的关系可以是任意的,任意两个数据元素都可能存在相关性,因此图论在计算机中应用相当广泛,例如:知识图谱、推荐算法等。图的基本元素: 1.结点:在图中的数据元素称为结点。 2.弧(边):在图中各结点之前的关系用弧(边)表示。 3.有向图:如果图中的边是带方向的,这称为有向图。 4.无向图:如果图的边是...

2019-05-22 01:00:53 62

原创 基础数据结构——二叉搜索树、红黑树

一、二叉搜索树1.定义:二叉搜索树,又称二叉排序树,若它的左子树不为空,则左子树的结点都小于根结点;若它的右子树不为空,则右子树的结点值都大于根结点,并且子树同样遵循这个原则。(为什么叫二叉排序树呢?因为对这个树进行中序遍历是有序的。)2.好处:使用二叉搜索树,进行数据查找时,时间复杂度为logn,有利于数据的查找。3.缺点:有时在特殊情况下,会退化成一个链表的结构,失去其查找的优越性...

2019-05-14 23:01:18 160

原创 基础数据结构——树、二叉树

一、树定义:树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样特点:1.有一个根结点,称为root结点。2.每一个元素都被称为node。3。除了root结点外,其余的结点都会被分成n个互不相交的集合,并且每个子集又都是一个树。基本术语:1.结点:树形结构里面的元素2.子树:当结点大于1的时候,其余的结点分为互不相...

2019-05-12 10:40:53 43

原创 java高并发之——synchronized和重入锁(ReentrantLock)

一、重入锁的定义:为什么会叫重入锁,顾名思义,表示这个锁可以返回被添加,就是一个线程可以多次获得一把锁,只要在最后的时候做相同次数的锁释放即可。Lock lock = new ReentrantLock();lock.lock();lock.lock();try { //业务代码} finally { lock.unlock(); lock.unlock();...

2019-04-24 23:43:02 289

原创 常见的排序算法

1.冒泡排序定义:比较相邻的元素。如果第一个比第二个大,就交换他们两个;走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。例如:对一个数组进行从小到达的排序,代码实现如下:ublic class ChooseSort { public static void main(String[] args) { int[] array ...

2019-04-18 23:23:47 34

原创 java高并发之 —— 解决编发编程中的原子性、可见性和有序性

一、如果保证程序的原子性——锁在程序开发中,我们如何才能保证一个程序的原子性是非常的重要的,保证程序原子性性,可以有效的避免在多线程过程中,出现的诡异bug。那在java程序中如果保证程序的原子性呢?也就是保证当前方法在同一时刻只能有一个线程对其进行操作,多线程在执行的时候,进行同步操作。java自带的隐式加锁方法就是使用synchronized关键字。synchronized关键字可以用...

2019-04-12 00:39:53 93

原创 java高并发之 —— 编发编程的Bug源头

我们知道并发编程比串行程序复杂的多,因为在并发程序下数据访问要保持一致性和安全性,这里就要提出一个临界区的概念!什么是临界区呢?临界区就是用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待,也就是多在同一个时刻,只能有一个线程对其进行操作,并且还要保证线程对其操作后,其他线程在操作时,要保证安全。这...

2019-04-01 23:26:44 176

空空如也

空空如也

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