自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【mysql学习篇】Order by与Group by优化以及排序算法详解

其实对比两个排序模式,单路排序会把所有需要查询的字段都放到 sort buffer 中,而双路排序只会把主键和需要排序的字段放到 sort buffer 中进行排序,然后再通过主键回到原表查询需要的字段。如果 MySQL 排序内存 sort_buffer 配置的比较小并且没有条件继续增加了,可以适当把 max_length_for_sort_data 配置小点,让优化器选择使用双路排序算法,可以在sort_buffer 中一次排序更多的行,只是需要再根据主键回到原表取数据。

2023-07-26 23:27:25 9638

原创 【mysql学习篇】连接查询详解以及性能优化

假设有两个表,一个是订单表 orders,包含订单编号 order_id、商品编号 goods_id 和用户编号 user_id;另一个是商品表 goods,包含商品编号 goods_id、商品名称 goods_name 和商品单价 price。

2023-04-04 17:13:49 7761 1

原创 【并发编程学习篇】Future&CompletableFuture的使用与原理剖析

当需要批量提交异步任务的时候建议你使用CompletionServiceCompletionService将线程池Executor和阻塞队列BlockingQueue的功能融合在了一起,能够让批量异步任务的管理更简单。CompletionService能够让异步任务的执行结果「有序化」先执行完的先进入阻塞队列,利用这个特性,你可以轻松实现后续处理的有序性,避免无谓的等待,同时还可以快速实现诸如Forking Cluster这样的需求。线程池隔离。

2023-03-17 02:25:30 5763 2

原创 【redis学习篇】Redisson实现的分布式独占锁核心流程剖析

我们可以看到,在前面加锁的时候其实已经subscribe了这个channel,所有解锁publish了这个解锁的消息,之前创建的监听任务就可以监听到这个解锁消息。接下来我们来看看,监听到消息后的处理。

2023-03-13 23:47:40 11760

原创 【redis学习篇】哨兵架构详解

当redis的主节点挂了,sentinel会在从节点中选取一个主节点 ,并且将新的redis主节点推送给client端(这里面redis的client端一般都实现了订阅功能,订阅sentinel发布的节点变动消息)哨兵集群只有一个哨兵节点,redis的主从也能正常运行以及选举master,如果master挂了,那唯一的那个哨兵节点就是哨兵leader了,可以正常选举新master。9、当6379的redis实例再次启动时,哨兵集群根据集群元数据信息就可以将6379端口的redis节点作为从节点加入集群。

2023-03-10 00:56:52 12858

原创 【redis学习篇】主从&哨兵&集群架构详解

当redis的主节点挂了,sentinel会在从节点中选取一个主节点 ,并且将新的redis主节点推送给client端(这里面redis的client端一般都实现了订阅功能,订阅sentinel发布的节点变动消息)客户端可以一次性发送多个请求而不用等待服务器的响应,待所有命令都发送完后再一次性读取服务的响应,这样可以极大的降低多条命令执行的网络传输开销,管道执行多条命令的网络开销实际上只相当于一次命令执行的网络开销。

2023-03-06 21:13:58 7773 1

原创 【redis学习篇】Redis三种持久化方式详解

每次执行这些命令时,都会将Redis内存中的快照保存到一个新的RDB文件中,并覆盖原有的RDB快照文件。RDB是满足了配置的条件才会进行持久化操作的,但是不能更改为每一秒都进行改动就写快照,因为RDB记录的是整个内存数据,这样会严重影响性能。新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,覆盖原有的AOF文件,完成新旧两个AOF文件的替换。注意:如果执行带过期时间的set命令,aof文件里记录的是并不是执行的原始命令,而是记录key过期的 时间戳。

2023-03-06 20:42:15 24102

原创 【并发编程学习篇】深入理解CyclicBarrier

字面意思回环栅栏(循环屏障),通过它可以实现让一组线程等待至某个状态(屏障点)之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。和CountDownLatch很像,CountDownLatch在操作时,只能使用一次,也就是state变为0之后,就无法继续玩了。CyclicBarrier是可以复用的,他的计数器可以归位,然后再处理。而且可以在计数过程中出现问题后,重置当前CyclicBarrier,再次重新操作!

2023-02-28 16:43:40 21831

原创 【mysql学习篇】count()优化分析

而是专门做了优化,不取值,按行累加,效率很高,所以不需要用count(列名)或count(常量)来替代 count(*)。还可以走主键索引,所以count(主键 id)>count(字段)以上4条sql只有根据某个字段count时不会去统计字段为。四个sql的执行计划一样,说明这四个sql执行效率应该差不多。count(*) 是例外,mysql 并不会把全部字段取出来。,所以理论上count(1)比count(字段)会快一点。count(1)跟count(字段)执行过程类似,,就用常量1做统计,

2023-02-28 15:10:54 21699

原创 【redis学习篇】Redis数据结构与实战场景分析

为哈希表key中field键的值加上 增量。批量获取哈希表key中多个field键值。注意:万级以上的QPS,会导致一瞬间。获取哈希表key对应的field键值。删除哈希表key中的field键值。返回哈希表key中field的数量。如何哈希表中key的键值 不存在。在一个哈希表key中存储 多个。返回哈希表key中所有的键值。存储一个哈希表key的键值。

2023-02-27 15:22:40 15130

原创 【并发编程学习篇】深入理解CountDownLatch

CountDownLatch(闭锁)是一个同步协助类,允许一个或多个线程等待,直到其他线程完成操作集。CountDownLatch使用给定的计数值(count)初始化。await方法会阻塞直到当前的计数值被countDown方法的调用达到0,count为0之后所有等待的线程都会被释放,并且随后对await方法的调用都会立即返回。这是一个一次性现象 —— count不会被重置。如果你需要一个重置count的版本,那么请考虑使用CyclicBarrier。

2023-02-27 14:22:40 22482

原创 【并发编程学习篇】深入理解Semaphore

Semaphore,俗称信号量,它是操作系统中PV操作的原语在java的实现,它也是基于AbstractQueuedSynchronizer实现的。Semaphore的功能非常强大,大小为1的信号量就类似于互斥锁,通过同时只能有一个线程获取信号量实现。大小为n(n>0)的信号量可以实现限流的功能,它可以实现只能有n个线程同时获取信号量。

2023-02-27 13:53:57 22190

原创 【并发编程学习篇】ReentrantLock设计思想剖析

ReentrantLock是一种基于AQS框架的应用实现,是JDK中的一种线程并发访问的同步手段,它的功能类似于synchronized是一种互斥锁,可以保证线程安全。可中断可以设置超时时间可以设置为公平锁支持多个条件变量与 synchronized 一样,都支持可重入。

2023-02-24 17:32:47 15828

原创 这些年,为保住阿里饭碗学习的并发编程

数据库的事务:ACIDA:原子性-事务是一个最小的执行的单位,一次事务的多次操作要么都成功,要么都失败。i++;操作是原子性?肯定不是:i++操作一共有三个指令getfield:从主内存拉取数据到CPU寄存器iadd:在寄存器内部对数据进行+1putfield:将CPU寄存器中的结果甩到主内存中如何保证i++是原子性的。锁:synchronized,lock,Atomic(CAS)使用lock锁也会有类似的概念,也就是在操作i++的三个指令前,先基于AQS成功修改state后才可以操作使用synchroni

2023-02-24 09:51:33 11557

原创 【并发编程学习篇】并发线程池底层原理详解与源码分析

/ 线程池的核心线程数如何设置 // 任务可以分为两种:CPU密集,IO密集。executor . execute(任务);executor . submit(有返回结果的任务);

2023-02-24 00:49:34 15424

原创 【并发编程学习篇】synchronized的原理

Synchronized 是由 JVM 实现的一种实现互斥同步的一种方式,如果你查看被 Synchronized 修饰过的程序块编译后的字节码,会发现,被 Synchronized 修饰过的程序块,在编译前后被编译器生成了 monitorenter 和 monitorexit 两个字节码指令。synchronized会根据线程竞争的情况,先去尝试在不加重量级锁的情况下去保证线程的安全性,所以引入了偏向锁和轻量级锁的机制。如果更新成功,则表示成功获取锁,否则直接开始执行锁膨胀(这里轻量级锁没有自旋的操作)

2023-02-22 17:26:20 16099

原创 【并发编程学习篇】深入理解Java线程

Java线程的生命周期**Java 语言中线程共有六种状态,分别是:**1. NEW(初始化状态)2. RUNNABLE(可运行状态+运行状态)3. BLOCKED(阻塞状态)4. WAITING(无时限等待)5. TIMED_WAITING(有时限等待)6. TERMINATED(终止状态)

2023-02-21 23:51:26 23873

原创 数据结构与算法学习篇给你一个文件里面包含全国人民(14亿)的年龄数据(0~200),现在要你统计每一个年龄有多少人?

下标:数组最优一个特点。这里可以通下标表示成有意义的数据,不只是数据里面的标记,年龄和下标对应。随机访问:可以直接通过下标定位到数组中的某一个数据(高效查询)给定机器为 单台+1CPU+1G内存。不得使用现成的容器,比如map等。

2023-02-21 16:40:45 8022

原创 数据结构与算法学习篇阿里内部题库判断一个数是否是2的N次方

从上面可以看出如果n是2的N次方,则存在n & (n-1) == 0。例:n=16,判断n是否是2的N次方。

2023-02-21 15:09:44 7923

原创 【JVM学习篇】垃圾收集器与底层三色标记算法详解

原始快照就是当灰色对象要删除指向白色对象的引用关系时, 就将这个要删除的引用记录下来, 在并发扫描结束之后, 再将这些记录过的引用关系中的灰色对象为根, 重新扫描一次,这样就能扫描到白色的对象,将白色对象直接标记为黑色(目的就是让这种对象在本轮gc清理中能存活下来,待下一轮gc的时候重新扫描,这个对象也有可能是浮动垃圾)增量更新就是当黑色对象插入新的指向白色对象的引用关系时, 就将这个新插入的引用记录下来, 等并发扫描结束之后, 再将这些记录过的引用关系中的黑色对象为根, 重新扫描一次。

2023-02-19 22:11:36 8287

原创 【JVM学习篇】对象创建与内存分配机制深度剖析

jdk1.6 update14开始,在64bit操作系统中,JVM支持指针压缩jvm配置参数:UseCompressedOops,compressed–压缩、oop(ordinary object pointer)–对象指针启用指针压缩:-XX:+UseCompressedOops(默认开启),禁止指针压缩:-XX:-UseCompressedOops为什么要进行指针压缩?

2023-02-18 19:30:17 26714

原创 【JVM学习篇】JVM内存模型深度剖析与优化

结论:通过上面这些内容介绍,大家应该对JVM优化有些概念了,就是尽可能让对象都在新生代里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁的进行垃圾回收。因为一个执行过程中,可能cpu时间片被其他线程抢占了,当前线程挂起了,恢复的时候需要依赖程序计数器才能知道执行到什么位置了。每执行完一行代码,字节码执行引擎都会动态的修改程序计数器的值(执行那一行代码在内存中的位置)JVM参数大小设置并没有固定标准,需要根据实际项目情况分析,给大家举个例子。

2023-02-17 22:24:10 26115

原创 【JVM学习篇】剖析JVM类加载机制

自定义类加载器只需要继承 java.lang.ClassLoader 类,该类有两个核心方法,一个是,实现了双亲委派机制,还有一个方法是findClass,默认实现是空方法,所以我们自定义类加载器主要是重写findClass方法。try {//defineClass将一个字节数组转为Class对象,这个字节数组是class文件读取后最终的字节数组。

2023-02-17 14:23:07 26540

原创 【mysql学习篇】分页查询&连接查询索引优化剖析

并且 join_buffer 里的数据是无序的,因此对表 t1 中的每一行,都要做 100 次判断,所以内存中的判断次数是 100 * 10000= 100 万次。整个过程会读取 t2 表的所有数据(扫描100行),然后遍历这每行数据中字段 a 的值,根据 t2 表中 a 的值索引扫描 t1 表 中的对应行(扫描100次 t1 表的索引,1次扫描可以认为最终只扫描 t1 表一行完整数据,也就是总共 t1 表也扫描了100 行)。显然改写后的 SQL 走了索引,而且扫描的行数大大减少,执行效率更高。

2023-02-16 11:51:57 27288

原创 Spring学习篇底层核心原理解析

接口,如果实现了,就表示当前对象必须实现该接口中的afterPropertiesSet()方法,那Spring就会调用当前对象中的afterPropertiesSet()方法( 初始化。AOP就是进行动态代理,在创建一个Bean的过程中,Spring在最后一步会去判断当前正在创建的这个Bean是不是需要进行AOP,如果需要则会进行动态代理。需要重视的是,如果Spring选择了一个有参的构造方法,Spring在调用这个有参构造方法时,需要传入参数,那这个参数是怎么来的呢?

2023-02-14 23:22:06 27271 1

原创 【mysql学习篇】索引优化详解(排序算法&trace工具)

MySQL支持两种方式的排序filesort和index,Using index是指MySQL扫描索引本身完成排序。index效率高,filesort效率低。order by满足两种情况会使用Using index。order by语句使用索引最左前列。使用where子句与order by子句条件列组合满足索引最左前列。尽量在索引列上完成排序,遵循索引建立(索引创建的顺序)时的最左前缀法则。如果order by的条件不在索引列上,就会产生Using filesort。

2023-02-14 02:20:19 28221

原创 【mysql学习篇】mysql的explain执行计划详解

索引优化explain详解&实战

2023-02-13 12:41:12 27231

原创 【并发编程学习篇】多线程并行的场景的可见性的问题分析

一个缓存行默认是64byte,缓存的数据比这个大的话就会升级为总线锁了,总线锁是锁定CPU的总线,从而导致同一时刻只能有一个线程与内存通信,这就避免了多线程并发造成的可见性问题,这会导致锁定期间,其他处理器也不能操作其他内存地址的数据,CPU的执行效率大幅度下降,相当于单核执行。缓存行的共享状态的时候,如果处理器对共享变量执行写操作的时候会对其所在缓存行加锁(同一个处理器的其他线程无法操作这个缓存行),同时会发一个总线写的信号,然后其他也拥有这个缓存行数据的处理器通过 总线窥探机制。

2023-02-13 10:43:41 27245

原创 【mysql学习篇】InnoDB存储引擎事务的实现和BufferPool缓存机制详解

也就是说,一个没有提交事务的redo log记录,也可能会刷盘,因为在事务执行过程数据记录是会写入redo log buffer中,而这些记录会被后台线程刷盘(写到磁盘里的redo log文件)假如一个事务将age=1修改成了age=2,在事务还没有提交的时候,后台线程已经将age=2从 redo log buffer 刷入了磁盘,这个时候会把之前存入undo log的回滚记录。mysql重启时,会把redo log日志文记录的修改内容,恢复Buffer Pool数据,实现磁盘idb文件的最终一致性。

2023-02-12 23:58:10 27754

原创 【mysql学习篇】undo日志版本链与read view机制详解

MVCC机制详解&undo日志版本链与read view机制详解。

2023-02-12 19:19:17 27942

原创 【mysql学习篇】为什么mysql用B+Tree?

各种数据结构对比,二叉树、红黑树、B Tree、B + Tree

2023-02-11 00:23:48 28174

原创 mysql中字符串与日期类型如何比较

Mysql在比较两种不同数据类型时,第一步是将他们转化为同一种类型,然后在比较。

2023-01-18 16:50:25 4747

原创 Linux vim命令内容大小写转化详解

Linux vim命令内容大小写转换

2022-11-30 15:15:24 950

原创 【并发编程学习篇】阻塞队列的使用与原理分析

Queue接口//添加一个元素,添加成功返回true, 如果队列满了,就会抛出异常 boolean add(E e);//添加一个元素,添加成功返回true, 如果队列满了,返回false boolean offer(E e);//返回并删除队首元素,队列为空则抛出异常 E remove();//返回并删除队首元素,队列为空则返回null E poll();//返回队首元素,但不移除,队列为空则抛出异常 E element();//获取队首元素,但不移除,队列为空则返回null E peek()

2022-11-24 11:14:36 28081

原创 $、|、^、>>、>>>位运算详解

异或运算过程中,两个位置如果同为1的情况下等于0;其中一位等于1的情况下等于1。首先要了解二进制,位运算会将十进制的数值转位二进制的数值,然后进行运算。到这里我想细心的同学已经发现了其中的规则,就是将二进制的每一位进行比较,两个二进制位数进行按位或运算,只要其中一位为1,则运算结果就为1。

2022-11-23 18:06:51 17527

原创 【并发编程学习篇】ReentrantReadWriteLock详解

现实中有这样一种场景对共享资源有读和写的操作,且写操作没有读操作那么频繁(读多写少)在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源(读读可以并发)但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写操作了(读写,写读,写写互斥)在读多于写的情况下,读写锁能够提供比排它锁更好的并发性和吞吐量。

2022-11-23 17:13:55 28257

原创 【Java】List集合对象排序方式 - Java8stream流排序

1. stream流根据年龄正序排序resultList.stream().sorted(Comparator.comparing(User::getAge)) .collect(Collectors.toList());2. stream流根据年龄倒序排序在正序的基础上增加reversedresultList = resultList.stream().sorted(Comparator.comparing(User::getAge) .reversed()) .collect(

2022-05-26 16:51:53 9344

原创 【并发编程学习篇】导致JVM内存泄露的ThreadLocal详解

ThreadLocal对于每一位Java读者而言我想可能都不陌生,因为面试基本都会被问到。ThreadLocal包含了四个方法:void set(Object value) 设置当前线程的线程局部变量的值。public Object get() 该方法返回当前线程所对应的线程局部变量。 public void remove() 将当前线程局部变量的值删除,其目的是为了减少内存使用,加快内存回收。 protected Object initialValue() 返回该线程局部变量的初始值,.

2021-07-23 15:25:47 10542 2

原创 Java代码中 “==” 和 “equal” 的区别

                  先走稳了,跑起来更快== 既可以比较基本类型,也可以比较引用类型。对于基本类型的话比较的是数值,如果是引用类型的话比较的是内存地址equal 属于java.lang.Object类里面的方法,如果该方法没有被重写过,那么默认和 **==**一样我们可以看到String类中是重写了equal方法,而且String类日常开发中用的比较...

2021-05-07 10:30:11 169

原创 Java如何使用定时任务?

文章目录一、创建定时任务类,cron表达式1.快速使用1)开启定时任务2)示例代码3)上例代码用到的日期工具类二、异步任务解决定时任务阻塞1.方法一2.方法二三、分布式下定时任务的问题总结一、创建定时任务类,cron表达式      cron表达式在线生成工具1.快速使用定时任务自动配置类 TaskSchedulingAutoConfiguration1)开启定时任务@EnableScheduling@Configuratio

2021-03-24 10:01:12 439

空空如也

空空如也

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

TA关注的人

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