自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 缓存穿透+缓存击穿+缓存雪崩

我们与数据打交道的都不是小问题呀,所以本篇介绍Redis的缓存一致性问题。缓存穿透概念:缓存穿透是指用户想查询一个数据,发现Redis中没有,也就是缓存没有命中,就像持久性数据库发起查询,发现数据库也没有这个数据,于是查询失败了,当用户请求很多的情况下,缓存没有命中,数据库也没有数据,会给数据库造成很大的压力,这就是缓存穿透解决方案:第一种解决方案:使用布隆过滤器使用布隆过滤器之后,将存储的所有数据放入布隆过滤器,每次进行数据查询时,首先查询布隆过滤器是否存在查询的数据,如果

2021-12-05 16:52:11 932

原创 Redis事务

Redis不仅支持众多的数据结构,还支持事务,在这里会介绍Redis事务的使用,及其事务相关的命令介绍使用。1、Redis事务可以一次执行多个命令2、Redis事务就是一次性,顺序性,排他性的执行一个队列中的一系列的命令3、Redis不保证原子性4、Redis中,单条命令是原子执行的,但是事务不保证原子性,且没有回滚的概念。事务中任意命令执行失败,其余的 命令仍会执行。5、Redis事务是没有隔离级别的概念6、批量操作在发送exec命令前被放入队列,并不会实际执行,也就不存在事务内的

2021-12-05 15:47:51 108

原创 Redis数据持久化

redis的数据持久化就是为了保障数据安全性问题。将内存数据存储到磁盘当中,即持久化问题。Redis提供了两种方式去保障数据的持久化问题。RDB:内存快照内存快照:就是指内存中数据在某一时刻的状态记录。RDB是Redis中默认的持久化方案。RDB持久化会将内存中的数据写入到磁盘中,在指定的目录下生产一个dump.rdb文件。Redis重启时会加载dump.rdb文件恢复数据。Redis中提供了两个命令生成RDB文件。分别save和bgsave.save:在主进程中执行,会导致阻塞bg

2021-12-05 15:34:28 118

原创 Redis基本类型和特殊类型命令详解

目录基本类型String类型hash类型List类型Set集合SortSet有序集合特殊类型geospatial 地理空间hyperloglog基本类型String类型String类型是Redis中的基本类型,一个key对应一个value、String类型的值可以是字符串,数字或者是二进制的数据,最大不超过512M。set添加数据 格式:set key value //成功则返回okget获取值,通过key获取value 格式:get key

2021-11-29 23:07:00 200

原创 HashMap源码分析

HashMap是Map接口下的一个实现类,分析其源码主要是从一下几个步骤进行继承关系、数据结构类型、构造函数、属性、常用方法继承关系public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable //haspMap继承了AbstractMap,该抽象接口实现Map接口,克隆接口,序列化接口数据结构哈希表(数组+链表

2021-11-28 22:28:55 406

原创 TCP的拥塞控制

TCP的拥塞控制拥塞:在网络中对某一个资源的需求量超过了该资源所能提供的最大部分解决拥塞的四种算法1、相关参数说明1.1发送方会维护一个叫拥塞窗口cwnd的状态变量,其值取决于网络的拥塞成都程度,并且动态变化。1.2拥塞窗口的维护原则:只要网络没有出现拥塞,则拥塞窗口的值就可以在大些,反之就减小一些1.3判断网络拥塞的依据:没有收到应当到达的确认数据报文段序号(发生了超时重传)1.4发送方把拥塞窗口作为发送数据的窗口,即swnd==cwnd1.5维护一个慢开始的门限变量 s.

2021-11-24 17:19:22 403

原创 TCP流量控制详解

在介绍TCP的流量控制之前先说一下保活计时器。保活计时器:保证客户端与服务器之间能够正常的进行传输工作。也就是说在一方出现了问题,能够让另一方尽快知道。TCP的流量控制是通过滑动窗口机制进行实现的,其目的主要是让发送方的发送速率不要太快,能够让接收方正确接收实现机制:使用滑动窗口机制控制流量案例:主机A向主机B发送1000字节的数据主机A向主机B传输数据,刚开始的接受窗口大小为400,一次最大发送的数据为100字节。流程请看图,注意图中流程的描述。主机A接收到主机B发来的窗.

2021-11-24 17:16:55 359

原创 TCP三次握手和四次挥手详解

1、建立连接时的三次握手,如下图所示1.1第一次握手客户端发送一个请求连接报文段,该报文段携带一个0数据的同步位SYN和数据序号为X。进入了SYN_SENT状态等待服务器确定。1.2第二次握手服务器同意连接,并向客户端发送一个请求连接确认报文段,该报文段包括同步为SYN=1、确认位ACK=1、数据初始序号seq=y以及对客户端发送的请求连接的数据序号进行确认ack=x+1。该报文段也不带数据。1.3第三次握手客户端接收到服务器发送的连接请求后,会再一次发送一个普通的TCP确.

2021-11-24 17:06:43 4729

原创 TCP报文段介绍

11

2021-11-24 16:56:53 1060

原创 快速失败(fail-fast)和安全失败(fail-safe)

快速失败:在java.util包下的集合类都是快速失败的,具体说就是在我们采用迭代器遍历集合元素时,这时又在对集合加入数据,这是就会抛出ConcurrentModificationException异常。代码演示Map<String,Integer> map = new HashMap<>(); map.put("张三",18); map.put("李四",20); map.put("王五",19); Set.

2021-11-23 20:35:10 806

原创 Junit的使用

Junit是用于编写和运行可重复的自动化测试的开源框架,适用于测试整个对象,对象的一部分,交互中的一个方法或者是一些方法,对象之间的交互。可以为我们在开发中实现边编写边测试,及其的方便,这也符合开发的流程。Junint使用步骤添加Junit依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</artif...

2021-11-16 23:03:33 225

原创 JAVA IO流

目录1、流体系及实现类2、流的划分3、File类介绍4、字节流4、字符流5、转换流6、缓冲流7、对象流8、RandomAccessFile类流介绍:Java中所有的数据都是使用流读写的,流是一组有顺序、有方向,有起点和终点的字节集合,通过使用流我们可以完成设备之间的数据传输。1、流体系及实现类流的体系流的实现类2、流的划分按照方向划分:输入流:从各种输入设备(磁盘、网卡、键盘...)将数据读取到当前程序输出流:从当前程序将数据写入输

2021-11-16 15:00:07 424

原创 JAVA GC收集器

垃圾回收器收集器发展历程:Serial收集器->Parallel收集器->CMS收集器(Concurrent Mark Sweep)->G1收集器(Garbage First)在进行垃圾回收时,会暂停所有的工作线程,直到垃圾回收完成,垃圾回收器的不断迭代是为了优化减少停顿时间使用垃圾回收器,通过设置垃圾回收器参数-XX:+UseSerialGC,虚拟机运行在Client模式下的默认值,Serial+Serial Old。-XX:+UseParNewGC,ParNew

2021-11-12 17:11:09 373

原创 JAVA GC原理

目录1、对象被标记为垃圾的方法2、垃圾回收算法GC(Varbage Collection:垃圾回收):将堆内存中不在被使用的对象进行回收,GC中用于回收的方法称之为收集器。GC是需要消耗一些资源和时间,对Java堆对象的生命周期特征进行分析,按照新生代、老年代的方式对对象进行回收,以尽可能虽短GC对应用造成的暂停。 对于新生代的对象的收集称之为minor GC/Young GC 对老年代的对象的收集称之为Full GC 程序中主动调用System.gc(),强制执行GC

2021-11-10 17:45:53 184

原创 JAVA内存模型

目录1、Java内存模型图2、程序计数器3、虚拟机栈4、本地方法栈5、6堆空间6、方法区7、方法区在不同 JDK 版本的变化在Java中对象的创建与销毁都是取决于它的存储位置的,所以在这里详谈一下Java的内存模型,及其包含的内容。1、Java内存模型图绿色区域是线程共享的部分红色部分是线程私有的部分2、程序计数器程序计数器是Java内存中分配的一小块内存,用来存放执行某些线程指令,由字节码解释器的工作时通过改变计数器的值来选择下一条要执行的字节码

2021-11-10 16:49:40 915

原创 JDK可视化命令

jconsole查看Java应用程序运行时情况,监视垃圾收集器的内存变化趋势,以及监视程序内的线程。在控制台输入jconsole即可启动JConsole客户端JConsole客户端包括概览、内存、线程、类、VM概要、MBean这大块。概览:主要运行数据的概览,包括堆内存,线程,类,CPU使用情况四项信息的变化趋势图内存:可以监视堆内存以及其中各个区域(Eden区,Survivor区,老年代)的变化趋势,还可以监视非堆(元空间)的内存变化趋势,相当于命令行中的jstat..

2021-11-06 20:04:09 91 1

原创 JAVA命令

作为一个合格的开发人员,不仅要能写好代码,还有一项很重要的技能就是排查问题。这里提到的排查问题不仅仅是在coding的过程中debug等,还包括的就是线上问题的排查。由于在生产环境中,一般没办法debug,所以我们需要借助一些常用命令来查看运行时的具体情况,这些运行时信息包括但不限于运行日志、异常堆栈、堆使用情况、GC情况、JVM参数情况、线程情况等。那么我们来介绍常用的Java命令,这些命令都是被存放在JDK安装目录的bin目录中,下面来介绍一下相关命令以及具体使用方式。所以Java命令是十分重要的,在这

2021-11-06 19:32:49 673

原创 JVM参数

我们学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分析原因并解决之,JVM监控与调优主要的着眼点在于如何配置、如何监控、如何优化3点上。所以在这一篇中介绍JVM的参数配置。在Java虚拟机的参数中,有3种表示方法 标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容; 非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容; 非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来

2021-11-06 19:07:16 56

原创 随机生成10000个数据,数据范围1-1000,找出每个数据出现的次数

首先对这个问题进行分析,题目说的是在范围为1-1000中随机生成10000和数据,找出每个数据出现的次数,也就是一个数对应它出现的次数,所以我们自然就会想到key-value这种存储数据的方式,所以我们就可以使用集合中map接口的实现类进行解决该问题。随机生成10000个数 Random random = new Random(); //生成随机数 for (int i = 0; i < 10000; i++) {//注意编码实现是的数据范围1-1001因为

2021-10-31 22:32:14 3223

原创 JAVA集合框架

目录集合框架知识点集合框架结构图List接口实现类Set接口实现类Queue接口实现类Map接口的实现类Collection接口的方法介绍各个方法的使用介绍List接口ArrayList实现类LinkedList实现类集合框架知识点1、集合框架图认识2、接口学习:Collection接口、map接口、List接口、Set接口、Queue接口3、接口实现类:使用对象的方法、特点、底层数据结构4、源码分析:JDK源代码进行学习、自定义实现集合、..

2021-10-31 21:57:05 117

原创 浅谈JVM

目录1、类加载机制2、双亲委派模型3、破坏双亲委派模型4、native关键字5、Java内存6、GC回收7、GC的回收算法1、类加载机制1.1第一阶段:加载就是把一些.java的文件通过javac编译后生成的.Class文件以二进制流保存到JVM内存中去,JVM中会在方法区中为该类创建一个对应的Class对象,这个Class对象就是以后访问该类的一个入口1.2第二阶段:验证就是的到的这个Class字节码文件是否符合Java的要求。一样的验证有魔术验证、版本

2021-10-01 10:32:47 50

原创 事务+引擎+索引

MySQL事务:完成增删改查的一套操作到提交成功的一个过程事务的执行过程如下: 系统会为每个事务开辟一个私有工作区 事务读操作将从磁盘中拷贝数据项到工作区中,在执行写操作前所有的更新都作用于工作区中的拷贝. 事务的写操作将把数据输出到内存的缓冲区中,等到合适的时间再由缓冲区管理器将数据写入到磁盘。 四大特性原子性:操作不可再分,要么全部执行成功,要么全部执行失败隔离性:在并发事务发生的情况下,为了保证数据的准确性,把每个事务隔离开也就是说优先获取操作权限的事务可

2021-10-01 10:02:42 91

原创 @网络协议

网络模型:OSI模型分层应用层:为具体的应用进行服务表示层:把信息进行转码,就是把数据信息转换成能够理解的内容会话层:负责在两个终端设备之间建立通话和维护通话传输层:功能:编定序号、控制数据流量、查错与错误处理,确保数据可靠、有序、无错地从A点传输到B 点网络层:网络层通过综合考虑发送优先权、拥塞程度、服务质量以及可选路由的花费来决定从一个网络中的节点A 到另一个网络中节点B 的最佳路径数据链路层:把从网络层接收到的数据进行处理成可以给物理层传输的帧。主要功能是进行数据的..

2021-10-01 09:48:33 661

原创 锁的状态转变

锁的四种状态:无锁状态,偏向锁状态,轻量级锁状态,重量级锁状偏向锁在并发量较小的情况下,对象的锁会从无锁转换成偏向锁,当获取到对象锁的线程,会在对象的头部存放该线程的ID。偏行锁的标志位为1,此时锁的标志位也是为1。抢锁是通过CAS操作完成的,抢锁的线程若在对象的头部信息更新为了该线程的地址,则表示是抢锁成功。轻量级锁多个线程争夺对象的锁时,JVM会把对象的锁转换成无锁状态,并且每个线程会在自己的栈帧中开辟一个空间叫做Lock Reword。然后把对象的MarkWord复制到每个线程的Loc

2021-09-08 14:36:03 210

原创 Java线程池

线程池:创建线程池的目的是为了能够重复使用已经创建好的线程,因为线程的创建和销毁都需要消耗资源,这造成了大量资源的浪费。当线程池中的线程被拿去使用后又会被保存在线程池中供下一次其他程序的使用。线程池参数corePoolSize:核心线程数,即就是可用的线程数maximumPoolSize:线程池能容纳的最大线程个数keepAliveTime:活跃时间,大于核心线程数的线程在规定的时间内没有被使用则会被销毁Unit:时间单位类型workQueue:存放没有获取线程的对象Thre

2021-09-08 11:42:34 144

原创 生产者与消费者

生产者消费者模式:是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不 直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者理。生产者生产一个产品消费者就消费一个,当没有产品供消费者消费之后生产者才进行生产产品//商品类class Product{ private String brand; private String name; //用来控制生产者与消费者之间的轮流执行,false代表没有商品true代表有商品 .

2021-09-08 11:35:19 443

原创 CAS操作

该操作保证了数据的安全性、可靠性涉及参数:V:内存中变量的值A:原内存位置中变量的值B:更新的值实现过程:数据变更,首先会把主内存V的值与A的值进行比较,如果这两个值相等,则表示之前没有线程对其修改,可以执行更新操作,把待更新的值E存到内存中覆盖V的值,完成更新操作。如果这两个值不相等,则表示有并发的线程对其进行了修改,此次更新数据失败。重新获取内存中值再次进行以上的过程,直到修改成功。存在问题1、ABA问题 2、循环次数过多,内存开销大 3、只能保证一个变量的原子操作.

2021-09-08 11:22:20 55

原创 synchronized关键字

synchronized关键字是实现线程安全及同步的保证了并发的三点特性:原子性、可见性、有序性使用位置:1.作用在普通方法上,加锁锁的是当前对象2、作用在静态方法上,加锁锁的是类对象3、作用在代码块上监视器(Monitor)每一个Java对像都有一个自已的监视器(Monitor)、当这个监视器被获取之后,就获取了该对象的访问权限,并处于被锁状态。一个方法或则代码块加了synchronized关键字后会由两个对象进行获取锁和锁的释放MonitorEntry对象指令:该指令存.

2021-09-06 21:17:10 58

原创 volatile关键字

volatile:用来修饰变量的一个关键字。保证了两大并发特性:可见性和有序性。volatile修饰变量的可见性申明一点:JVM中的所有变量都是存放在主内存中的,而创建的每个线程都有自己的一个工作内存,工作内存中存放的变量都是从主内存中拷贝过来的副本,该线程每次对变量进行修改或者获取时,都是在自己的工作内存中进行操纵,而不能在主内存中进行相关的操作。同时其他的线程也不能访问该线程对变量进行操作后的值,而是通过主内存进行获取。普通的变量:变量被线程1修改之后,此时修改过后的变量存储在该线程的工

2021-09-06 21:14:01 30

原创 栈实现四则运算

栈的特点:先进后出中缀表达式转后缀表达式申请一个栈对象:用于存放符号(运算符和括号)创建一个StringBuffer对象:用于保存数字实现过程:输入的计算表达式为一个字符串,获取字符串中每一个下标的字符,若获取到的字符为数字则存放在StringBuffer对象中,若为运算符或括号则进行入栈。当入栈的符号为右括号时,则停止入栈,把左括号之前的运算进行出栈操作并保存在StringBuffer对象中,然后把左括号进行出栈操作。计算后缀表达式申请一个栈对象:用于存放数字实现过程:把后缀.

2021-09-06 19:57:24 411

原创 线性地址法

使用线性地址法模拟hashMap的put方法数据结构类型:采用数组存储数据类型:键值对形式数据类型设计//Entry类 提供键和值 static class Entry<K,V>{ private K key; private V value; public Entry() { } public Entry(K key, V value) { this.key=key

2021-09-05 23:08:03 48

原创 链地址法实现HashMap的put方法

1.HashMap的存储结构数组+链表+红黑树

2021-09-05 11:21:26 257

原创 static关键字

在java中static可以⽤来修饰成员变量、修饰成员⽅法、构造静态代码块以及实现静态内部类。1.static修饰成员变量1.1通常将⽤ static 修饰的成员变量称为 类成员或者静态成员1.2 static 修饰的成员变量与普通成员变量的区别static修饰的成员变量public class test01 { private static int age; private String name; @Override public String to

2021-08-30 20:21:40 85

空空如也

空空如也

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

TA关注的人

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