自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis-分片集群

主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:海量数据存储问题高并发写的问题使用分片集群可以解决上述问题,如图:分片集群特征:集群中有多个master,每个master保存不同数据每个master都可以有多个slave节点master之间通过ping监测彼此健康状态客户端请求可以访问集群任意节点,最终都会被转发到正确节点。

2024-09-19 20:06:12 629

原创 Redis-哨兵集群

哨兵的结构如图::Sentinel 会不断检查您的master和slave是否按预期工作:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主:Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端。

2024-09-08 15:45:50 886

原创 Redis-主从集群

因为slave原本也是一个master,有自己的replid和offset,(宕机重启后)当第一次变成slave,与master建立连接时,发送的replid和offset是自己的replid和offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新。如果master继续写入新数据,其offset就会覆盖旧的数据,直到将slave现在的offset也覆盖,注意此时master已经覆盖了从节点尚未同步过去的数据,这就出现了主从之间数据的不一致。

2024-09-07 19:36:01 1212

原创 JUC-无锁之CAS

原有实现并不是线程安全的方法对应的字节码多线程执行原因:Integer虽然是不可变类,,但是以上操作涉及到了,等价于以下代码:前一个方法(valueOf)的结果决定后一个方法(构造方法),这种组合在多线程环境下线程不安全。

2024-09-04 20:51:55 1025

原创 JUC-指令有序性

JVM 会在不影响正确性的前提下,可以调整语句的执行顺序,思考下面一段代码可以看到,至于是先执行 i 还是 先执行 j ,对最终的结果不会产生影响。所以,上面代码真正执行时,既可以是也可以是这种特性称之为『指令重排』,多线程下『指令重排』会影响正确性。为什么要有重排指令这项优化呢?从 CPU 执行指令的原理来理解一下吧。

2024-09-01 13:13:53 731

原创 JUC-JAVA内存模型

Balking (犹豫)模式用在一个线程发现另一个线程或本线程已经做了某一件相同的事,那么本线程就无需再做 了,直接结束返回。

2024-08-31 13:56:25 760

原创 JUC-多把锁&线程活跃性

一间大屋子有两个功能:睡觉、学习,互不相干。现在小南要学习,小女要睡觉,但如果只用一间屋子(一个对象锁)的话,那么并发度很低解决方法是准备多个房间(多个对象锁)锁的粒度太大,多线程就会变成串行执行了。12:13:54.471 [小南] c.BigRoom - study 1 小时12:13:55.476 [小女] c.BigRoom - sleeping 2 小时根据业务的不同,进行锁的粒度缩小,可以保证多线程下能并发执行,而不是一直串行执行。

2024-08-28 21:19:33 348

原创 JUC-同步模式之保护性暂停

即 Guarded Suspension,用在一个线程等待另一个线程的执行结果要点有。

2024-08-25 15:41:04 321

原创 JVM-垃圾回收篇

Java8 时,堆被分为了两份:新生代和老年代(1:2),在 Java7 时,还存在一个永久代新生代使用:复制算法老年代使用:标记 - 清除 或者 标记 - 整理 算法Minor GC 和 Full GC。

2024-08-24 15:12:47 900

原创 JUC- wait / notify原理

Owner 线程发现条件不满足,调用 wait 方法,BLOCKED 和 WAITING 的线程都处于,不占用 CPU 时间片BLOCKED 线程会在WAITING 线程会在 Owner 线程调用 notify 或 notifyAll 时唤醒,但唤醒后并不意味者立刻获得锁,仍需obj.wait()让进入 object 监视器的线程到 waitSet 等待wait()方法会释放对象的锁,进入 WaitSet 等待区,从而让其他线程就机会获取对象的锁。, 到 n 毫秒后结束等待,或是被 notify。

2024-08-24 13:44:24 772

原创 JUC-Synchronized原理进阶

轻量级锁的使用场景:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化。轻量级锁对使用者是透明的,即语法仍然是 synchronized假设有两个方法同步块,利用同一个对象加锁创建锁记录(Lock Record)对象,每个线程都的栈帧都会包含一个锁记录的结构,内部可以存储锁定对象的 Mark Word。

2024-08-23 21:16:38 1065

原创 JVM-Java的四种引用

无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象是否可达,判定对象是否可被回收都与引用有关,Java 提供了四种强度不同的引用类型。

2024-08-21 21:45:33 559

原创 JUC- Synchronized原理

每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头的 Mark Word 中就被设置指向 Monitor 对象的指针。在 Thread-2 上锁的过程中,如果 Thread-3,Thread-4,Thread-5 也来执行 synchronized(obj),就会进入 EntryList BLOCKED。其中 Mark Word 结构为,以Normal状态为例,会存储对象的hashcode和永久代年龄,是否是偏向锁,加锁状态。

2024-08-20 20:09:38 671

原创 JVM-内存结构

内存结构是 JVM 中非常重要的一部分,是非常重要的系统资源,是硬盘和 CPU 的桥梁,承载着操作系统和应用程序的实时运行,又叫运行时数据区JVM 内存结构规定了 Java 在运行过程中内存申请、分配、管理的策略,保证了 JVM 的高效稳定运行Java1.8 以前的内存结构图:线程运行诊断:常见 OOM 错误:Java 虚拟机栈:Java Virtual Machine Stacks,每个线程运行时所需要的内存设置栈内存大小: 在 JDK 1.4 中默认为 256K,而在 JDK 1.5+ 默认为 1M局部

2024-08-15 21:18:00 1041

原创 JUC-变量的线程安全

如果它们没有共享,则线程安全,。如果它们被共享了,根据它们的状态是否能够改变,又分两种情况如果只有读操作,则线程安全如果有读写操作,则这段代码是临界区,需要考虑线程安全局部变量是线程安全的但局部变量引用的对象则未必如果该对象没有逃离方法的作用访问,它是线程安全的如果该对象逃离方法的作用范围,需要考虑线程安全int i = 10;i++;每个线程调用 test1() 方法时局部变量 i,会在每个线程的栈帧内存中被创建多份,因此不存在共享,,如图。

2024-08-14 20:44:04 584

原创 Java并发编程-基础篇

程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程,进程是程序的一次执行。进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)

2024-06-25 23:19:15 942 1

原创 Java8新特性-Stream流

按照下面的要求完成集合的创建和遍历创建一个集合,存储多个字符串元素把集合中所有以"张"开头的元素存储到一个新的集合把"张"开头的集合中的长度为3的元素存储到一个新的集合遍历上一步得到的集合。

2024-06-17 10:27:44 1049

原创 Xxl-job实现定时任务视频转码

使用IDEA打开解压后的目录xxl-job-admin:调度中心xxl-job-core:公共依赖xxl-job-executor-samples:执行器Sample示例(选择合适的版本执行器,可直接使用)执行器的版本xxl-job-executor-sample-springboot:Springboot版本,;xxl-job-executor-sample-frameless:无框架版本;

2024-05-15 10:47:46 962

原创 分布式任务调度-Xxl-job

分布式任务调度概念及中间件xxl-job的简单介绍

2024-05-14 19:28:42 699

原创 JVM-虚拟机栈

Java虚拟机栈(采用栈的数据结构来管理方法调用中的基本数据,先进后出(First In Last Out),每一个方法的调用使用一个栈帧(Stack Frame)来保存。接下来以这段代码为例main方法执行时,会创建main方法的栈帧:接下来执行study方法,会创建study方法的栈帧进入eat方法,创建eat方法的栈帧eat方法执行完之后,会弹出它的栈帧:然后调用sleep方法,创建sleep方法栈帧最后study方法结束之后弹出栈帧,main方法结束之后弹出main的栈帧。

2024-02-09 23:38:09 1913 10

原创 JVM-运行时数据区&程序计数器

程序计数器(Program Counter Register)也叫PC寄存器,每个线程会通过程序计数器记录当前要执行的的字节码指令的地址。

2024-02-07 22:22:36 1078 9

原创 JVM-双亲委派机制

双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会自底向上查找是否加载过,再由顶向下进行加载。

2024-02-05 09:09:44 3632 14

原创 JVM-类加载器

类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术,类加载器只参与加载过程中的字节码获取并加载到内存这一部分。类加载器会通过二进制流的方式获取到字节码文件的内容,接下来将获取到的数据交给Java虚拟机,虚拟机会在方法区和堆上生成对应的对象保存字节码信息。

2024-02-04 20:50:00 1393 8

原创 JVM-类的生命周期

类的生命周期描述了一个类加载、使用、卸载的整个过程。加载连接,其中又分为验证、准备、解析三个子阶段初始化使用卸载。

2024-01-30 20:06:13 1323 17

原创 JVM-字节码文件的组成

而指向的8号索引才最终指向27号真正的字符串,在后续的jvm的字符串常量池中会将8号这个string类型的索引入到StringTable中,故需要通过8号索引再找到27号索引,而不能在字段中直接指向27号索引这个字符串本身。比如在代码中,编写了两个相同的字符串“我爱北京天安门”,字节码文件甚至将来在内存中使用时其实只需要保存一份,此时就可以将这个字符串以及字符串里边包含的字面量,放入常量池中以达到节省空间的作用。6、istore_2从操作数栈中将1弹出,并放入局部变量表的2号位置,2号位置是j在使用。

2024-01-28 16:40:49 1537 39

原创 JVM-初始JVM

JVM全称是JavaVirtualMachine,中文译名Java虚拟机。JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。

2024-01-25 16:02:26 1613 36

原创 Redis分布式缓存-Redis持久化

RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。RDB持久化在四种情况下会执行:执行下面的命令,可以立即执行一次RDB:由Redis主进程来执行RDB,会阻塞所有命令,跟mysql的全局锁类似,会直接阻塞所有命令,只有在数据迁移才会用到。这个命令执行后会开启独立进程完成RDB,主进程可以

2023-12-20 16:02:59 3080 19

原创 Mysql进阶-InnoDB引擎事务原理及MVCC

回滚日志,在insert、update、delete的时候产生的便于数据回滚的日志。当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。而update、delete的时候,产生的undo log日志不仅在回滚时需要,在快照读时也需要,不会立即被删除。MVCC的实现原理就是通过 InnoDB表的隐藏字段、UndoLog 版本链、ReadView来实现的。而MVCC + 锁,则实现了事务的隔离性。而一致性则是由redolog 与 undolog保证。

2023-12-14 17:02:18 2117 53

原创 Mysql进阶- InnoDB引擎架构

MySQL5.5 版本开始,默认使用InnoDB存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发 中使用非常广泛。下面是InnoDB架构图,左侧为内存结构,右侧为磁盘结构。

2023-12-12 16:03:19 2314 58

原创 Mysql进阶-事务&锁

事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。就比如: 张三给李四转账1000块钱,张三银行账户的钱减少1000,而李四银行账户的钱要增加 1000。这一组操作就必须在一个事务的范围内,要么都成功,要么都失败。为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行 数据是否加锁,使用意向锁来减少表锁的检查。

2023-12-05 16:27:31 1325 66

原创 Mysql进阶-视图篇

视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

2023-11-07 17:26:43 3551 70

原创 Mysql进阶-SQL优化篇

在分组操作中,我们需要通过以下两点进行优化,以提升性能:A. 在分组操作时,可以通过索引来提高效率。B. 分组操作时,索引的使用也是满足最左前缀法则的。

2023-11-05 16:02:34 726 55

原创 Mysql进阶-索引篇(下)

当字段类型为字符串(varchar,text,longtext等)时,有时候需要索引很长的字符串,这会让 索引变得很大,查询时,浪费大量的磁盘IO, 影响查询效率。此时可以只将字符串的一部分前缀,建 立索引,这样可以大大节约索引空间,从而提高索引效率。

2023-10-30 16:03:53 490 62

原创 Mysql进阶-索引篇(上)

mysql索引的基本介绍和索引的分类和基础语法

2023-10-27 16:24:41 1798 70

原创 Mysql进阶-存储引擎篇

存储引擎这个词相信大家是比较陌生,但引擎这个词,大家都是听过的,引擎就是发动机,是一个机器的核心组件。比如,对于舰载机、直升机、火箭来说,他们都有各自的引擎,是他们最为核心的组件。而我们在选择 引擎的时候,需要在合适的场景,选择合适的存储引擎,就像在直升机上,我们不能选择舰载机的引擎 一样。而对于存储引擎,也是一样,他是mysql数据库的核心,我们也需要在合适的场景选择合适的存储引擎。即根据业务表的需求来选择合适的存储引擎,注意存储引擎是基于表的。所以存储引擎也可被称为表类型。

2023-10-24 17:39:52 2425 75

原创 redis实战-实现用户签到&UV统计

用redis的bitmap实现用户签到

2023-10-06 16:23:15 2663 100

原创 redis实战-redis实现好友关注&消息推送

redis实现使用set集合实现共同关注,同时feed流实现笔记推送给粉丝

2023-09-27 17:18:40 2846 98

原创 redis实战-实现笔记点赞和点赞排行榜

redis实现一人一赞,点赞排行榜

2023-09-23 16:39:18 1441 111

原创 redis实战-redis实现异步秒杀优化

当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤1、查询优惠卷2、判断秒杀库存是否足够3、查询订单4、校验是否是一人一单5、扣减库存6、创建订单在这六步操作中,又有很多操作是要去操作数据库的,而且还是一个线程串行执行, 这样就会导致我们的程序执行的很慢。

2023-09-12 16:19:18 4090 196

原创 redis实战-redis实现分布式锁&redisson快速入门

redis做分布式锁的实战文章

2023-09-06 16:06:37 2818 209

空空如也

空空如也

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

TA关注的人

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