- 博客(62)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 缓存双写一致性
缓存双写一致性1. 缓存基本使用方式2. 先更新数据库,再更新缓存2.1 线程安全问题2.2 从业务场景角度考虑3. 先删除缓存,再更新数据库3.1 线程安全问题3.2 延时双删策略4. 先更新数据库,再删除缓存5. 最终方案前言:在开头有必要说明,如果对数据一致性要求比较高就不要存缓存,因为只要涉及到双写就一定存在一致性问题。1. 缓存基本使用方式 如果可以容忍数据不一致话,我们可以给缓存设置一个过期时间,所有写操作以数据库为基准,缓存过期后就会去数据库中取新值,保证了数据的最终一致性 过
2022-04-12 15:49:20
1534
1
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Redis 详解
Redis 详解1. 什么是 Redis2. Redis 基本使用3. Redis 数据结构2.1 String2.2 List2.3 Hash(字典)2.4 Set(集合)2.5 zset(有序集合)4. Redis 持久化5. Redis 集群6. Redis 经典运用6.1 分布式锁1. 什么是 Redis Redis 是一个基于内存的高性能 key-value 数据库。是完全开源免费的,用C语言编写的,遵守BSD协议。 Redis 特定:Redis 是基于内存操作的,吞吐量非常高,可以
2021-04-12 00:46:31
11334
1
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 HashMap 底层原理探究
HashMap 底层原理探究1. Hash 表的实现2. HashMap 的实现2.1 数据结构2.2 存取机制2.2.1 初始化tableSizeFor 方法解析2.2.2 put 元素为什么要重写 hashCode()为什么要执行 h ^ (h >>> 16) ?为什么 length 长度要是 2的幂次方putVal 方法详解2.2.3 resize 方法详解(e.hash & oldCap) 算法2.2.4 get 元素前言: hashMap 是一个 key——valu
2021-04-08 22:51:48
319
1
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 通俗易懂讲解网络IO模型
网络IO1. 网卡接收数据2. 如果知道接收了数据?3. BIO模型3.1 创建 Socket3.2 recv 阻塞3.3 唤醒进程4. NIO 模型5. 多路复用 select前言:作为服务端开发,为了提高整体服务效率,网络编程是我们必不可少的知识。本文将会从网卡接收数据流程讲起,串起cpu中断、操作系统、线程调度等知识,进一步分析select到epoll的演变过程。1. 网卡接收数据 下边是一个典型的计算机结构图,计算机由 CPU、存储器(内存)与网络接口等部件组成。为了解网络IO,那么得先从
2021-04-02 07:54:03
725
1
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Spring IOC
Spring IOC1.什么是IOC2.AbstractApplicationContext.finishBeanFactoryInitializationDefaultListableBeanFactory.preInstantiateSingletonsAbstractBeanFactory.getBeanAbstractBeanFactory.doGetBeanDefaultSingletonBeanRegistry.getSingletonAbstractAutowireCapableBeanFac
2021-03-28 23:29:21
146
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Java线程池原理
Java线程池原理1、为什么要使用线程池 当前主流商业Java虚拟机的线程模型都是基于操作系统原生线程模型来实现,即采用1:1的线程模型。 如果不理解可以看这篇文章:https://blog.csdn.net/weixin_44981707/article/details/114682305 现在的服务器基本都是多个核心,多个核心可以达到并行运算。对于我们常见的web服务,有cpu密集型计算,也有IO密集型计算,线程数设置过多,会导致线程上下切换过于频繁,消耗性能,设置过少,不能充分利用cpu
2021-03-22 07:53:14
615
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 深入分析AQS实现原理
深入分析AQS实现原理一、什么是AQS1、AQS的两种功能2、AQS的内部实现3、锁竞争、锁释放对队列的变化3.1 锁竞争3.2 锁释放二、AQS源码分析2.1 加锁ReentrantLock.lockNonfairSync.lockAQS.compareAndSetStateAQS.acquireNonfairSync.tryAcquireSync.nonfairTryAcquireAQS.addWaiterAQS.enqAQS.acquireQueuedAQS.shouldParkAfterFailed
2021-03-22 00:51:58
1101
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 MySQL锁读这篇就够
MySQL语句加锁分析1. 锁的基本模式1.1 共享锁S和排他锁XS-共享锁:又叫读锁,其它事务可以继续加共享锁,但是不能继续加排他锁X-排他锁:又叫写锁,一旦加了写锁之后,其它事务不能加锁了 兼容性:是指事务A获得一个某行某种锁之后,事务B同样的在这个行上尝试获取某种锁,如果能立即获取,则称锁兼容,反之叫冲突。锁模式的兼容性汇总在以下矩阵中:XSX冲突冲突S冲突兼容1.2 意向锁(表锁)意向锁是表级锁,指事务稍后对表中的行需要加哪种类型的锁
2020-11-21 07:26:31
2781
4
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 mysql优化详解
1.mysql索引调优1.1 讲解 在进行优化讲解之前,先请大家记住不要听信你看到的关于优化的“绝对真理”,而应该是在实际的业务场景下通过测试来验证你关于执行计划以及响应时间的假设。1.2 优化方向 从上图中可以看出,我们把数据库优化分为四个纬度:硬件,系统配置,数据库表结构,SQL及索引**硬件: ** CPU、内存、存储、网络设备等系统配置: 服务器系统、数据库服务参数等数据库表结构: 高可用、分库分表、读写分离、存储引擎、表设计等Sql及索引: sql语句、索引使用等从
2020-09-10 05:27:30
666
原创 CMS 垃圾回收器
CMS 垃圾回收器1. cms 回收过程分析1.1 初始标记(initial-mark)1.2 并发标记(concurrent-mark)1.3.1 Card Table1.3.2 mod-union table1.3 并发预清理 (concurrent-preclean)1.4 可中断预清理(concurrent-abortable-preclean)1.5 重新标记(remark)1.6 并发清除(concurrent-sweep)1.7 并发重置(concurrent reset)2. cms 日志解
2022-05-29 00:22:31
4976
3
原创 文件 IO
文件 IO1. 读文件2. 写文件3.文件在磁盘上的存放4. 顺序 IO 和 随机 IO5. 缓存 IO 和 直接 IO6. 零拷贝(Zero-copy)和 mmap6.1 mmap()6.2 sendfile()应用读写文件基本流程1. 读文件 用户程序通过内核程序提供的读取文件 api 发起对某个文件读取。此时程序从用户态切换到内核态,用户程序处于阻塞状态,由于读取的内容还不在内核缓冲区中,导致触发 OS 缺页中断异常。然后由 OS 负责发起对磁盘文件的数据读取,这个读取动作交由 DMA 去完
2022-04-26 20:09:31
716
原创 CFS-完全公平调度器
CFS-完全公平调度器1. 概念2. 进程分配时间计算2.1 进程优先级怎么计算?2.2 调度延迟3. CFS 调度器如何选择进程?调度器 调度器是一个操作系统的核心部分。可以比作是 CPU 时间的管理员。调度器主要负责选择某些就绪的进程来执行。不同的调度器根据不同的方法挑选出最适合运行的进程。目前 Linux 支持的调度器就有 RT scheduler、Deadline scheduler、CFS scheduler 及 Idle scheduler等。1. 概念 CFS 即Completel
2022-04-20 12:59:45
1467
原创 分布式事务
分布式事务1. 什么是分布式事务1.1 概念2. 为什么会有分布式事务?2.1 多 service 节点2.2 多数据源3. 分布式事务的理论基础3.1 CAP 定理3.2 BASE 定理4. 分布式事务解决方案4.1 XA 方案4.1.1 2pc4.2 TCC4.3 saga 方案4.4 本地消息表、RocketMQ事务消息方案、最大努力通知方案4.4.1 RocketMQ 事务消息方案4.4.2 常规 MQ 解决方案4.5 Seata4.5.1 第一阶段4.5.2 第二阶段1. 什么是分布式事务1.
2022-04-17 23:51:19
2348
原创 RocketMQ 详解
RocketMQ 详解1. 基础概念2.RocketMQ 消费模式2.1 广播模式2.2 集群模式3. 基础架构3.1 Broker 的存储结构3.2 存储文件简介3.3 Consumer 端的负载均衡机制3.4 消息刷盘机制3.5 Mmap + pageCache3.5.1 传统IO 和 Mmap3.5.2 pageCache3.5.3 预映射机制 + 文件预热机制3.6 push/pull/pop3.7 Topic 分片3.8 查漏补缺3.8.1 消息的全局顺序和局部顺序3.8.2 零拷贝(Zero-c
2022-04-13 02:33:16
33807
原创 SpringBoot 启动流程
SpringBoot 启动流程1. 启动入口2. 创建 SpringApplication3. 运行 Spring 应用程序3.1 创建应用上下文3.2 刷新应用上下文3.2.1 解析配置文件、生成所有的 beanDefinitions3.2.1.1 什么是BeanDefinition?3.2.1.2 invokeBeanFactoryPostProcessors 解读a. BeanFactoryPostProcessor扩展3.2.1.2.1 ConfigurationClassPostProcessor
2022-04-08 20:04:37
2459
原创 EXPLAIN 执行语句分析
EXPLAIN 执行语句分析1.explain 用法explain + sql语句2.描述符含义描述符含义id执行顺序。(id 越大越先执行、id 相同由上至下)select_type查询的类型table显示这一行的数据是关于哪张表的partitions使用的哪个分区,需要结合表分区才可以看到typetype显示的是访问类型,是较为重要的一个指标possible_keys查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际
2022-03-31 17:27:08
1373
原创 最佳开发体验
最佳开发体验一、idea插件1.1 MybatisX 不仅可以做到从dao接口到mapper配置文件跳转,还可以根据输入的接口自动生成对应sql类型的xml标签1.2 arthas idea 支持的功能都是平时处理最常用的一些功能,一些快捷的链接,在处理紧急问题时候不需要到处查找,都是一些基本的功能,自动复制到剪切板中去,方便快捷。1.3 POJO to json选中类-右键-POJO to json 将简单Java类型转成JSON。适应场景:进行微服务invoke调试时,某些服
2021-09-25 21:26:37
116
原创 Linux 操作指南
1.日志操作在整个日志文件dinner-2.log,取出所有含有"xxxx"的行,并在当前目录生成符合要求的行的文件yyyy.txtcat dinner-2.log | grep 'xxxx' >> yyyy.txt在日志文件中,查询包含字符串的行内容grep “要查找的字符串” 文件名查看实时日志tail -f xxx.log......
2021-09-11 12:43:32
125
原创 Intellij IDEA 注释模板设置
Intellij IDEA 注释模板设置1. idea 类注释2. 方法注释模板3. 字段注释模板1. idea 类注释 打开 idea:file->setting->Editor->Filr and Code Templates->Includes->File Header 类注释模板:/** * @className: ${NAME} * @description: ${TODO} * @author ${USER} * @date ${DA
2021-06-26 23:10:02
1845
5
原创 前端编译与优化
前端编译与优化1. 概述2. Javac 编译器2.1 Javac的源码与调试2.1.1 下载导入 javac 源码2.1.2 找到 javac 主函数入口2.2 解析与填充符号表2.2.1 词法、语法分析2.2.2 填充符号表2.2.3 注解处理器2.2.4 语义分析与字节码生成1.标注检查2. 数据及控制流分析3. 解语法糖4. 字节码生成3. Java语法糖的味道3.1 泛型1. Java 与 C# 的泛型2. 泛型的历史背景3. 类型擦除4. 值类型与未来的泛型3.2 自动装箱、拆箱与遍历循环3.3
2021-05-30 19:53:25
414
原创 类加载机制
类加载机制1. 类加载时机2. 类加载的过程2.1 加载2.2 验证2.2.1 文件格式验证2.2.2 元数据验证2.2.3 字节码验证2.2.4 符号引用验证(解析阶段进行验证)2.3 准备 (类静态变量初始化为零值)2.4 解析2.4.1 类或接口解析2.4.2 字段解析2.4.3 方法解析 (Methodref)2.4.4 接口方法解析(InterfaceMethodref)2.5 初始化 (类变量)3. 类加载器3.1 类与类加载器3.2 双亲委派模式3.3 自定义类加载器4. 一些思考4.1 为什
2021-05-22 23:22:03
460
8
原创 类文件结构
类文件结构1. 无关性的基石2. Class类文件结构2.1 魔数与Class文件的版本2.2 常量池2.3 访问标志2.4 类索引、父类索引与接口索引集合2.5 字段表集合2.6 方法表集合2.7 属性表集合2.7.1 Code 属性2.7.2 Exceptions 属性2.7.3 LineNumberTable 属性2.7.4 LocalVariableTable 及 LocalVariableTypeTable 属性2.7.5 SourceFile及SourceDebugExtension属性2.7.
2021-05-17 22:12:17
453
3
原创 git 提交代码到 github
git 提交代码到 github首先新建一个文件夹,取名:project。用来存放我们的项目进入 project 文件夹后点击鼠标右键,选择打开 Git Bash.执行如下命令,将我们创建的 project 文件夹初始化为 Git 仓库git init在 project 文件下创建我们的项目,我这用 idea 创建的 maven 项目执行如下命令,将新增的项目文件添加到暂存区(Stage)git add 项目名执行如下命令,将暂存区的所有修改提交到本地仓库git commit
2021-05-16 19:41:16
120
原创 JDK11 环境变量配置
JDK11 环境变量配置路径:“计算机”–》“属性”–》“高级系统设置”–》“高级”–》“环境变量”–》“系统变量” 为了让计算机上的所有用户都能使用 jdk,这里编辑的是系统环境变量。点击新建,变量名输入"JAVA_HOME",变量值就是 JDK 的安装路径,到安装目录把地址复制一下,粘贴过来就好了。然后点击确定。 接下来在系统环境变量中找到 Path(注意 Windows 中环境变量名不区分大小写),选中,点击编辑,在弹出的新窗口中点击新建,输入 %JAVA_HOME%\bin,点击确定。
2021-05-16 14:53:17
5314
原创 虚拟机性能监控、故障处理工具
虚拟机性能监控、故障处理工具1. 基础故障处理工具1.1 jps:虚拟机进程状况工具1.2 jstat:虚拟机统计信息监视工具1.3 jinfo:Java配置信息工具1.4 jmap:Java内存映像工具1.5 jhat:虚拟机堆转储快照分析工具1.6 jstack:Java堆栈跟踪工具2. 可视化故障处理工具2.1 JHSDB:基于服务性代理的调试工具2.2 JConsole:Java监视与管理控制台2.2.1 启动JConsole2.2.2 内存监控2.2.3 线程监控2.3 VisualVM:多合-故
2021-05-03 17:46:13
692
3
原创 linux 下排查 Cpu 异常
linux 下排查 Cpu 异常1. 准备2. linux 下运行3. 问题排查1. 准备 编写如下 java 类,开启 8 个线程,空转 Cpupublic class CpuTest { public static void main(String[] args) { for (int i = 0; i < 8; i++) { new Thread(){ @Override p
2021-04-18 17:08:25
938
1
原创 ElasticSearch 详解
ElasticSearch 详解1. ES 简介2. ES 集群2.1 节点 node2.2 分片和复制 shards&replicas3. 数据插入查询3.1 数据插入的过程3.2 数据查询流程1. ES 简介 Elasticsearch 是一个基于 Lucene 实现的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elast
2021-04-11 13:18:54
2502
原创 Feign 详解
Feign详解1. feign 简介1.1 什么是 feign1.2 feign 能干什么2. feign 简单使用2.1 快速搭建 Eureka Server2.2 创建 feign 提供方2.3 创建 feign 调用者3. feign 进阶使用3.1 服务提供方集群3.2 feign 调用者添加负载均衡注解4. feign 的一些优化4.1 修改配置前言: 在微服务架构中,一个请求需要调用多个服务才能完成。为了缩短请求耗时,提升服务的吞吐量,服务之间的互相调用变得格外重要。 微服务调用方式
2021-04-08 01:17:57
1805
原创 sentinel 简单使用
sentinel1. springboot 整合 Sentinel1.1 sentinel-dashboard 安装1.2 客户端配置1.3 编写测试用例1.4 @SentinelResource各项属性简介1.5 持久化限流配置2. sentinel 源码学习前言:在学习该框架之前,我们先来了解一些问题。问题一:百万级并发请求,服务器真的会宕机吗? 答:对于服务端来说,当请求量达到了 tomcat 设置的最大连接数,请求任务会加入任务队列中等待被执行,但如果任务队列也满了,则会直接拒绝其它请求。
2021-04-06 22:12:02
1872
原创 Spring AOP 简单使用
Spring AOP1. 添加依赖2. 配置切面2.1 AOP 一些术语2.2 配置切面类2.3 常用AOP通知(增强)类型2.4 利用自定义注解使用AOP2.4.1 自定义注解2.4.2 切面配置2.4.3 自定义注解的使用1. 添加依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</art
2021-03-31 19:51:10
70
原创 SpringBoot 自动装配
简介:对于经常使用SpringBoot的程序员来说,SpringBoot大大简化了开发的工作量,节省了大量的配置工作,在SpringBoot启动的时候就自动将相关的配置给封装好了,也就是自动装配功能自动装配做了什么? 通常搭建一个基于spring的web应用,我们需要做以下工作:1、pom文件中引入相关jar包,包括spring、springmvc、redis、mybaits、log4j、mysql-connector-java 等等相关jar …2、配置web.xml,Listener配置、
2021-03-19 21:25:07
330
原创 快速创建一个SpringBoot项目
快速创建一个SpringBoot项目1、idea创建maven项目 整体架构如下图所示2、引入相关依赖3、编写类 编写controller、service、dao、entity、mapper的xml文件夹如下 编写启动类ApplicationContext、以及application.yml配置文件 它们的注解、配置具体如下: 接下来,编写controller、server、mapper、xml文件。如下:emsp; UserController类:@Rest
2021-03-17 19:26:57
149
原创 Java锁机制
Java锁1. 线程安全2. 线程安全的实现方法2.1 互斥同步 (synchronized、ReentrantLock)2.2 非阻塞同步 (CAS)3. 锁优化3.1 自旋锁与自适应自旋3.2 锁消除3.3 锁粗化3.4 轻量级锁3.4.1 锁膨胀3.5 偏向锁4. ReentrantLock锁工作原理流程图5. ReentrantLock和synchronized性能测试对比1. 线程安全 “线程安全”这个名称,相信稍有经验的程序员都听说过,甚至在代码编写和走查的时候可能还会经常挂在嘴边,但是如
2021-03-14 21:40:19
440
原创 Java与线程
Java与线程1. 线程的实现1.1 内核线程实现1.2 用户线程实现1.3 混合实现2. Java线程的实现3. java线程调度4. 线程状态转换5. Java与协程5.1 内核线程的局限5.2 协程的复苏5.3 golang 协程5.3.1 实际工作中的我们5.3.2 golang 协程1. 线程的实现 主流的操作系统都提供了线程实现,Java语言则提供了在不同硬件和操作系统平台下对线程操作的统一处理,每个已经调用过start()方法且还未结束的java.lang.Thread类的实例就代
2021-03-11 22:49:11
293
3
原创 Java内存模型
Java内存模型1. CPU和缓存一致性2. Java内存模型2.1 主内存与工作内存2.2 内存间交互操作2.3 volatile型变量的特殊规则2.3.1 第一项是保证此变量对所有线程的**可见性**2.3.2 使用volatile变量的第二个语义是禁止指令重排序优化2.3.3 针对long和double型变量的特殊规则2.3.4 原子性、可见性与有序性1. 原子性(Atomicity)2. 可见性 (Visibility)3. 有序性(Ordering)2.3.5 先行发生原则1. CPU和缓存一致
2021-03-09 20:43:46
194
原创 第三章 垃圾收集器与内存分配策略
第三章 垃圾收集器与内存分配策略前言:3.1 概述3.2 对象已死?3.2.1 引用计数算法3.2.2 可达性分析算法3.2.3 再谈引用,四种引用类型3.2.4 生存还是死亡3.3 垃圾收集算法3.3.1 分代收集理论3.3.2 标记-清除算法3.3.3 标记-复制算法3.3.4 标记-整理算法3.4 HotSpot的算法细节实现3.4.1 Stop The World3.4.2 OopMap3.4.3 安全点3.4.4 安全区域3.4.5 记忆集3.4.6 写屏障3.4.7 并发的可达性分析3.5 经典
2021-03-07 22:27:34
141
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人