自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(86)
  • 资源 (2)
  • 收藏
  • 关注

原创 CopyOnWriteArrayList简介

是 的线程安全版本就是在进行写操作的时候会 copy 原数组,然后写完将指针指向新的数组,是一种读写分离的思想,可以并发的读,不能并发的写优点:缺点:2.2 原理从源码可以看出 在读操作的时候并没有并发控制,所以读数据的性能不受影响在读操作的时候使用了来进行并发控制,3.疑问💡 线程A在读数组时,线程B同时在修改数组,并且在A读取数组的时候已经修改完成,此时会影响到线程A读取数组吗?结果:不影响因为JAVA的参数传递机制,线程A在操作中是通过全局 指针的副本去访问存放在堆内存中的

2023-04-19 11:43:48 422 1

原创 ElasticSearch--聚合查询

ElasticSearch--过滤查询

2022-06-23 16:18:30 1065

原创 ElasticSearch--整合SpringBoot

ElasticSearch--整合SpringBoot

2022-06-23 16:17:40 563

原创 ElasticSearch--过滤查询

ElasticSearch--过滤查询

2022-06-23 16:15:27 2207

原创 ElasticSearch 分词器

ElasticSearch 分词器

2022-06-20 21:42:10 5117

原创 ElasticSearch 高级查询及索引原理

ES高级查询及索引原理

2022-06-20 21:40:40 1531

原创 ElasticSearch 简介及基本操作

ElasticSearch 简介及基本操作

2022-06-19 17:07:56 209

原创 JVM-类文件结构详解

类文件结构详解引言计算机是不能直接运行java代码的,要先由jvm运行编译后成字节码。字节码文件再交由运行于不同平台上的JVM虚拟机去读取执行,从而实现一次编写,到处运行的目的。❓ 为什么计算机不能直接运行java代码呢java是高级语言,我们才能理解其逻辑,计算机是无法识别的,所以java代码要先编译成字节码文件,jvm将字节码转换为计算机能识别的指令才能运行简介class文件本质上是一个以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在class文件中。jvm根

2022-05-04 16:23:04 592

原创 Redis主从复制

Redis主从复制简介主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。为了要避免单点故障后,数据库依旧能正常使用,即保证高可用,便需要多结点方式提供集群服务。而Redis 提供了主从库模式,以保证数据副本的一致,主从库之间采用的是读写分离的方式。作用主从复制的作用主要包括:数据备份:主从复制实现了数据的热备份,是持久化之外的一种数据备份方式。故障恢复:当

2022-05-03 14:35:24 564

原创 Redis事务

Redis事务Redis 事务的本质是一组命令的集合。一个事务中所有命令会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中事务相关命令MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事务相关的命令。MULTI :开启事务,redis会将后续的命令逐个放入队列中,然后使用EXEC命令来原子化执行这个命令系列。EXEC:执行事务中的所有操作命令。DISCARD:取消事务,放弃执行事务块中的所有命令。WATCH:监视一个或多个k

2022-05-03 14:29:45 2045

原创 Redis持久化之RDB与AOF详解

⭐️RDB和AOF机制简介RDB和AOF是redis数据持久化的两种机制;当然实际场景下还会使用这两种的混合模式为了防止数据丢失以及服务重启时能够恢复数据❓为什么需要持久化Redis是个基于内存的数据库。服务器一旦宕机,内存中的数据将全部丢失当然也可以从后端数据库恢复这些数据,但是后端数据库性能一般比不上redis,大数据量的恢复会对数据库带来巨大压力,所以应该避免从后端数据库中恢复数据❓Redis持久化有哪些方式呢?为什么我们需要重点学RDB和AOF?RDBAOF

2022-05-03 14:27:06 489

原创 Redis三种特殊数据类型

三种特殊基本类型Geospatial(地理位置)使用经纬度定位地理坐标并用一个有序集合zset保存,所以zset命令也可以使用命令描述geoadd key longitud(经度) latitude(纬度) member [..]将具体经纬度的坐标存入一个有序集合geopos key member [member..]获取集合中的一个/多个成员坐标geodist key member1 member2 [unit]返回两个给定位置之间的距离。默认以米作为单位。

2022-05-03 14:19:34 686

原创 Redis五种基本数据类型

五种基本数据类型redis无论什么数据类型,在数据库中都是以key-value形式保存,并且所有的key(键)都是字符串,所以讨论基础数据结构都是讨论的value值的数据类型主要包括常见的5种数据类型,分别是:String、List、Set、Zset、Hash。结构类型结构存储的值结构的读写能力String字符串可以是字符串、整数或浮点数对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作;List列表一个链表,链表上的每个节点都包含一个字符串

2022-05-03 14:18:49 42330 2

原创 Redis底层设计

Redis底层设计底层设计Redis的每种对象其实都由对象结构(redisObject) 与 对应编码的数据结构组合而成,而每种对象类型对应若干编码方式,不同的编码方式所对应的底层数据结构是不同的对象设计机制: 对象结构(redisObject)编码类型和底层数据结构: 对应编码的数据结构对象机制😜个人理解:redisObject就类似java集合中List接口是个集合规范,具体用什么实现要看实现类是谁(ArrayList,LinkedList等),同样都有增加、删除操作,但是具体的

2022-05-03 14:16:09 1238

原创 中间件Redis简介

Redis概述什么是redisRedis是一种支持key-value等多种数据结构的高速缓存数据库,用C语言编写可以用于缓存、事件发布和订阅,高速队列等场景提供字符串,哈希,列表,队列,集合直接存存取,基于内存,可以持久化为什么要使用redis读写速度非常快读的速度是每秒11万次,写的速度每秒8万次支持多种数据类型支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作原子性redis的所有操作都是原子

2022-05-03 14:12:17 5469

原创 MySQL-MVCC机制

是什么?MVCC就是多版本并发控制,实现了【读-写冲突不加锁】,【非阻塞并发读】MVCC只针对读已提交和可重复读,如果是读未提交,每次都是当前读**基本思想是:**在每次【更新操作】时,旧版本的数据保存在【undo log日志中】并用【回滚指针】形成一条【版本链】,读数据的时候通过【readview视图】,拿到【版本链】中的旧数据,解决了读-写加锁效率低的问题对数据库的并发控制:既然有了MVCC不加锁解决读-写冲突,那么可以用MVCC再搭配乐观锁或者悲观锁去解决写-写冲突,完成对数据库的并发控制

2022-03-06 09:58:28 357

原创 MySQL-三大日志详解

三大日志日志分为二类逻辑日志:可以简单理解为记录的就是sql语句。物理日志:因为mysql数据最终是保存在数据页中的,物理日志记录的就是数据页变更。undo logundo log 记录数据被修改前的样子作用防止丢失数据,用于事务失败后的回滚Innodb 存储引擎的最大特点就是支持事务,如果本次更新失败,那么该事务中的所有的操作都必须回滚到执行前的样子,也就是说当事务失败的时候,也不会对原始数据有影响记录时机在mysql将要更新的数据加载到缓冲区Buffer pool 时,同时

2022-03-02 15:58:54 3811 1

原创 MySQL-锁详解

锁锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。小栗子打个比方,我们到淘宝上买一件商品,商品只有一件库存,这个时候如果还有另一个人买,那么如何解决是你买到还是另一个人买到的问题?这里肯定要用到事务,我们先从库存表中取出物品数量,然后插入订单,付款后插入付款

2022-03-02 15:57:18 466

原创 MySQL索引详解

索引简介MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。索引是一种用于快速查询和检索数据的数据结构一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上我们平常所说的索引,如果没有特别指明,都是指B树(多路搜索树,并不一定是二叉的)结构组织的索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。当然,除了B+树这种类型的索引之外,还有哈稀索引(hash index)等。索引

2022-02-26 09:48:13 1350

原创 MySQL七大JOIN

7大Join简介A的独有+AB的公有B的独有+AB的公有AB的公有A的独有B的独有A的独有+B的独有+AB的公有A的独有+B的独有练习建表部门表DROP TABLE IF EXISTS `dept`;CREATE TABLE `dept` ( `dept_id` int(11) NOT NULL AUTO_INCREMENT, `dept_name` varchar(30) DEFAULT NULL, `dept_number` int(11) DEFA

2022-02-26 09:42:20 1364 2

原创 Mysql存储引擎

Mysql存储引擎1 如何用命令查看 #看你的mysql现在已提供什么存储引擎: mysql> show engines; #看你的mysql当前默认的存储引擎: mysql> show variables like '%storage_engine%';分类InnoDB存储引擎InnoDB是MySQL的默认事务型引擎,它被设计用来处理大量的短期(short-lived)事务。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。行级锁

2022-02-26 09:39:26 222

原创 MySQL的逻辑架构详解

Mysql逻辑架构大致分为4层架构:连接层,服务层,引擎层,存储层连接层mysql提供给外界客户端连接的接口,不同客户端可以用自己的API连接mysql建立连接认证授权维持和管理连接等MySQL 驱动我们的系统是怎么和mysql进行连接和通信的呢?不可能是平白无故的就能接收和发送请求的吧,此时我们需要了解 MySQL 驱动概念的就是这个 MySQL 驱动在底层帮我们做了对数据库的连接,只有建立了连接了,才可以发送SQL语句执行CRUD多个连接怎么办?一次

2022-02-17 12:58:22 2155

原创 MySQL-事务详解

事务事务是由一系列对数据的访问与更新操作组成的程序执行逻辑单元,以便服务器保证数据完整性事务是数据库系统区别于其他一切文件系统的重要特性之一事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位,一个事务可以是一条或多条SQL语句组成,如果其中有任意一条语句不能完成或者产生错误,那么这个单元里所有的sql语句都要放弃执行,所以只有事务中所有的语句都成功地执行了,才可以说这个事务被成功地执行一般情况下,一个事务对应着一个完整的业务,一段程序也可能包含多个事务

2022-02-01 16:24:53 3081 3

原创 JUC并发编程-线程池简介

线程池简介线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量超过数量的线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行。优点主要特点为:线程复用、控制最大并发数、管理线程降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,

2022-01-29 21:03:15 442

原创 JUC并发编程-生产者消费者实例

生产者消费者实例1.ReentrantLock实现public class Demo { public static void main(String[] args) { Data data=new Data(); //两个生产者线程 for (int i = 0; i < 2; i++) { new Thread(()->{ try {

2022-01-29 21:01:38 2303

原创 JUC并发编程-同步器框架

同步器框架CountDownLatch详解简介CountDownLatch底层也是由AQS,用来同步一个或多个任务的常用并发工具类,强制它们等待由其他任务执行的一组操作完成。CountDownLatch 是共享锁的一种实现,它默认构造 AQS 的 state 值为 count。当线程使用 countDown() 方法时,其实使用了tryReleaseShared方法以 CAS 的操作来减少 state,直至 state 为 0 。当调用 await() 方法的时候,如果 state 不为 0,那

2022-01-29 21:01:08 2167

原创 JUC并发编程-锁分类

锁分类公平和非公平锁并发包中ReentrantLock的创建可以指定构造函数的boolean类型来决定是公平锁还是非公平锁,默认是非公平锁公平锁公平锁,在并发环境下,每个线程在获取锁的时候会去查看此锁维护的等待队列,如果为空,或者当前线程为等待队列的第一个,就占有锁,否则加入到等待队列里,然后按照FIFO(先进先出)的规则等待非公平锁不公平,上来就直接尝试占有锁,就想插队,如果插不上,就再采用类似公平锁的方式,例如synchronized可重入锁(又名递归锁)指同一个线程在获得锁之

2022-01-29 11:25:51 1204

原创 JUC并发编程-不安全的集合类

不安全的集合类Listpublic class NoSafeList { public static void main(String[] args) { List<String> list=new ArrayList<>(); for (int i = 0; i < 15; i++) { new Thread(()->{ list.add(UUID.randomUU

2022-01-29 11:07:35 2353

原创 JUC并发编程-CAS

CAS什么是CAS简介Compare And Set(或Compare And Swap),CAS是解决多线程并行情况下使用锁造成性能损耗的一种机制,采用这种无锁的原子操作可以实现线程安全,避免加锁的笨重性。操作CAS操作包含三个操作数:**内存位置(V)、预期原值(A)、新值(B)。**如果内存位置的值与预期原值相等,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。(简单解释:CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下在旧值有没有

2022-01-27 22:54:46 267

原创 JUC并发编程-Lock锁

Lock详解简介java.util.concurrent.locks包下常用的类与接口(lock是jdk 1.5后新增的)Lock和ReadWriteLock是两大锁的根接口:Lock代表实现类是ReentrantLock(可重入锁)ReadWriteLock(读写锁)的代表实现类是ReentrantReadWriteLock同步实现原理lock只能被一个线程获取,当一个线程执行lock.lock()后其他线程再尝试获取会进入lock对象中的等待队列,从而达到同步效果,ReenT

2022-01-27 22:53:42 1445 1

原创 JUC并发编程-Synchronized详解

Synchronized详解简介在应用Sychronized关键字时需要把握如下注意点:一把锁只能同时被一个线程获取,没有获得锁的线程只能等待;对象锁:每个实例都对应有自己的一把锁(this)叫做,不同实例之间互不影响;类锁:锁的对象是*.class以及synchronized修饰的是static方法的时候,所有对象公用同一把锁synchronized修饰的方法,无论方法正常执行完毕还是抛出异常,都会释放锁锁对象对象锁包括方法锁(默认锁对象为this,当前实例对象)和同步代

2022-01-26 19:14:31 513

原创 JUC并发编程-volatile详解

volatile详解三大特性1.保证可见性可见性问题主要指一个线程修改了共享变量值,而另一个线程却看不到。引起可见性问题的主要原因是每个线程拥有自己的一个高速缓存区——线程工作内存。volatile关键字能有效的解决这个问题package TestVolatile;public class TestVolatile { public static void main(String[] args) throws InterruptedException { Data da

2022-01-26 19:11:55 407

原创 JUC并发编程-JMM内存模型

Java 内存模型Java 内存模型本身是一种抽象的概念并不真实存在,试图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。背景处理器上的寄存器的读写的速度比内存快几个数量级,为了解决这种速度矛盾,在它们之间加入了高速缓存。加入高速缓存带来了一个新的问题:缓存一致性。如果多个缓存共享同一块主内存区域,那么多个缓存的数据可能会不一致,需要一些协议来解决这个问题。主内存与工作内存主内存Java内存模型规定所有的变量都存储在主内存中,是共

2022-01-25 10:36:27 291

原创 JUC并发编程-线程通信

三种使用线程方法有三种使用线程的方法:实现 Runnable 接口;实现 Callable 接口;继承 Thread 类。实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需要通过 Thread 来调用。可以理解为任务是通过线程驱动从而执行的。实现 Runnable 接口需要实现接口中的 run() 方法。public class MyRunnable implements Runnable { @Ove

2022-01-25 10:22:54 109

原创 JUC并发编程-理论基础

理论基础为什么需要多线程先从总体上来说:从计算机底层来说: 线程可以比作是轻量级的进程,是程序执行的最小单位,线程间的切换和调度的成本远远小于进程。另外,多核 CPU 时代意味着多个线程可以同时运行,这减少了线程上下文切换的开销。从当代互联网发展趋势来说: 现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。再深入到计算机底层来探讨:众所周知,CPU、内存、I/O 设备的速度是有极大差异的,

2022-01-25 10:18:22 251

原创 Vector源码解析

Vector源码解析继承接口继承了 AbstractList 类,这个类也实现了 List 方法实现了 Serializable ,能进行序列化操作实现了 Cloneable 接口,能够使用 clone() 方法实现了RandomAccess,说明 Vector 也支持随机访问,在 Vector 中,可以通过元素的索引快速获取元素对象,这就是快速随机访问。成员变量 // 存储数据的数组,此数组的容量一般大于实际长度,后续未填充数据用 null 替代 protected Object[]

2021-11-08 21:36:36 309

原创 HashTable源码解析

HashTable属性成员 //hash表数组 private transient Entry<?,?>[] table; //元素个数 private transient int count; //扩容阈值 private int threshold; //负载因子 private float loadFactor; //改动次数 private transient int modCount = 0;

2021-11-08 18:19:18 336

原创 ConcurrentHashMap -1.7 源码解析

简介ConcurrentHashMap是Java1.5中引用的使用了分段锁机制的一个线程安全的支持高并发的HashMap集合类简而言之,ConcurrentHashMap在对象中保存了一个Segment数组,即将整个Hash表划分为多个分段;而每个Segment元素,即每个分段则类似于一个Hashtable;这样,在执行put操作时首先根据hash算法定位到元素属于哪个Segment,然后对该Segment加锁即可。因此,ConcurrentHashMap在多线程并发编程中可是实现多线程put操作。

2021-11-08 15:52:27 574

原创 ConcurrentHashMap -1.8 源码解析

ConcurrentHashMap -1.8 源码解析加锁机制在JDK1.7之前,ConcurrentHashMap是通过分段锁机制来实现的,所以其最大并发度受Segment的个数限制。因此,在JDK1.8中,ConcurrentHashMap的实现原理摒弃了这种设计,而是选择了与HashMap类似的数组+链表+红黑树的方式实现,而加锁则采用CAS和synchronized实现。存储结构Java8 的 ConcurrentHashMap 相对于 Java7 来说变化比较大,从1.7的 Segment

2021-11-08 15:48:18 3573 2

原创 HashSet源码解析1.8

HashSet源码解析简介HashSet 是线程不安全的的,继承的 set 接口,所以里面的元素是不能重复的,无序的,允许包含值为null的元素,但最多只能有一个null元素。很多内部实现是基于 HashMap 的,可以看成是一个 HashMap 的简单封装继承接口HashSet 继承了 AbstractSet 类,这个类也实现了 Set 方法HashSet 实现了 Serializable ,能进行序列化操作HashSet 实现了Set 接口,能够实现其中的 Set 集合中的一些操作Has

2021-11-08 15:44:15 243

SpringBoot.zip

springboot学习笔记

2021-10-19

Spring@注解.md

spring

2021-10-16

空空如也

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

TA关注的人

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