随笔 - 171  文章 - 0  评论 - 0  阅读 - 62142
03 2023 档案
缓存行与伪共享问题
摘要:局部性原理 时间局部性:如果数据正在被访问,那么在近期它很可能还会被再次访问。比如循环、方法的反复调用等。 空间局部性:如果存储器的位置被引用,那么将来他附近的位置也会被引用。比如顺序结构、数组。 CPU缓存 执行程序是靠CPU执行主存中代码,但是CPU和主存的速度差异是非常大的,为了降低这种差距, 阅读全文
posted @ 2023-03-30 17:44 zhengbiyu 阅读(112) 评论(0) 推荐(0) 编辑
Condition
摘要:Condition用途 当多个线程需要访问一个共享资源时,需要给共享资源加锁。 当一个线程释放锁时,所有等待锁的线程都会尝试去获取锁。如果想只让部分等待锁的线程去获取锁时,就需要用到Condition。 执行wait方法后,线程会阻塞,并释放同步代码块的锁(sleep方法会持有锁),notify的方 阅读全文
posted @ 2023-03-30 16:52 zhengbiyu 阅读(163) 评论(0) 推荐(0) 编辑
线程状态
摘要:Java 线程状态 (6 种) Java线程的生命周期分为:NEW(初始化状态)、RUNNABLE(可运行状态/运行状态)、BLOCKED(阻塞状态)、WAITING(等待状态)、TIMED_WAITING(有时限的等待)、TERMINATED(终止状态)。 可以看下源码中线程State的枚举类: 阅读全文
posted @ 2023-03-30 00:44 zhengbiyu 阅读(4) 评论(0) 推荐(0) 编辑
AQS与ReentrantLock
摘要:AQS aqs全称为AbstractQueuedSynchronizer,它提供了一个FIFO队列,可以看成是一个用来实现同步锁以及其他涉及到同步功能的核心组件,常见的有:ReentrantLock、CountDownLatch等。AQS是一个抽象类,主要是通过继承的方式来使用,它本身没有实现任何的 阅读全文
posted @ 2023-03-30 00:43 zhengbiyu 阅读(7) 评论(0) 推荐(0) 编辑
synchronized和lock的区别
摘要:synchronized是Java内置的一个关键字,Lock是是一个Java接口。 synchronized无法判断获取锁的状态,而lock锁可以判断是否获取到了锁。 synchronized会自动释放锁,而lock必须手动释放锁。如果不释放就会变成死锁。 synchronized 可重入锁,不可以 阅读全文
posted @ 2023-03-30 00:41 zhengbiyu 阅读(18) 评论(0) 推荐(0) 编辑
ThreadLocal
摘要:运行时,会在栈中产生两个引用,指向堆中相应的对象。 可以看到,ThreadLocalMap使用ThreadLocal的弱引用作为key,这样一来,当ThreadLocal ref和ThreadLocal之间的强引用断开 时候,即ThreadLocal ref被置为null,下一次GC时,thread 阅读全文
posted @ 2023-03-30 00:34 zhengbiyu 阅读(18) 评论(0) 推荐(0) 编辑
查询过程
摘要:读操作步骤(根据文档id查询): 客户端发送Get请求到NODE1。 NODE1使用文档的_id决定文档属于shard0。shard0的所有分片位于所有3个节点上。这次,它将请求路由至NODE2。 NODE2将文档返回给NODE1,NODE1将文档返回给客户端。 ES读数据底层原理: 客户端发送请求 阅读全文
posted @ 2023-03-30 00:17 zhengbiyu 阅读(15) 评论(0) 推荐(0) 编辑
线程池
摘要:线程池的生命周期,总共有五种状态 RUNNING :能接受新提交的任务,并且也能处理任务队列中的任务; SHUTDOWN:关闭状态,不再接受新提交的任务,但却可以继续处理阻塞队列中已保存的任务。在线程池处于 RUNNING 状态时,调用 shutdown()方法会使线程池进入到该状态。(finali 阅读全文
posted @ 2023-03-29 23:16 zhengbiyu 阅读(16) 评论(0) 推荐(0) 编辑
synchronized
摘要:基本使用 Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个: 原子性:确保线程互斥的访问同步代码; 可见性:保证共享变量的修改能够及时可见,其实是通过Java内存模型中的 “对一个变量unlock操作之前,必须要同步到 阅读全文
posted @ 2023-03-29 22:56 zhengbiyu 阅读(49) 评论(0) 推荐(0) 编辑
volatile
摘要:volatile是 Java 中的一个关键字,当一个变量是共享变量,同时被 volatile 修饰当值被更改的时候,其他线程再读取该变量的时候可以保证能获取到修改后的值,通过 JMM 屏蔽掉各种硬件和操作系统的内存访问差异 以及 CPU 多级缓存等导致的数据不一致问题。 需要注意的是,volatil 阅读全文
posted @ 2023-03-29 21:58 zhengbiyu 阅读(53) 评论(0) 推荐(0) 编辑
Happens-Before原则
摘要:Happens-Before 程序顺序原则:如果程序操作 A 在操作 B 之前,那么多线程中的操作依然是 A 在 B 之前执行。 监视器锁原则:在监视器锁上的解锁操作必须在同一个监视器上的加锁操作之前执行。 volatile 变量原则:对 volatile 修饰的变量写入操作必须在该变量的读操作之前 阅读全文
posted @ 2023-03-29 21:52 zhengbiyu 阅读(17) 评论(0) 推荐(0) 编辑
内存模型
摘要:JMM(Java Memory Model,Java 内存模型) JMM 是一个抽象概念,由于 CPU 多核多级缓存、为了优化代码会发生指令重排的原因,JMM 为了屏蔽细节,定义了一套规范,保证最终的并发安全。它抽象出了工作内存与主内存的概念,并且通过八个原子操作以及内存屏障保证了原子性、内存可见性 阅读全文
posted @ 2023-03-29 21:50 zhengbiyu 阅读(74) 评论(0) 推荐(0) 编辑
double check lock
摘要:双重检查(单例模式) class Singleton{ private volatile static Singleton instance = null; private Singleton() { } public static Singleton getInstance() { if(inst 阅读全文
posted @ 2023-03-29 20:14 zhengbiyu 阅读(26) 评论(0) 推荐(0) 编辑
八种原子操作
摘要:为了支持 JMM,Java 定义了 8 种原子操作(Action),用来控制主存与工作内存之间的交互: read 读取:作用于主内存,将共享变量从主内存传动到线程的工作内存中,供后面的 load 动作使用。 load 载入:作用于工作内存,把 read 读取的值放到工作内存中的副本变量中。 stor 阅读全文
posted @ 2023-03-29 20:03 zhengbiyu 阅读(283) 评论(0) 推荐(0) 编辑
三色标记
摘要:在遍历对象图的过程中,把需要遍历的对象按照“是否访问过”分为以下三种颜色。 白色:表示对象尚未被垃圾回收器访问过。显然,在可达性分析刚刚开始的阶段,所有的对象都是白色的,若在分析结束的阶段,仍然是白色的对象,即代表不可达。 黑色:表示对象已经被垃圾回收器访问过,且这个对象的所有引用都已经扫描过。黑色 阅读全文
posted @ 2023-03-29 19:56 zhengbiyu 阅读(96) 评论(0) 推荐(0) 编辑
G1
摘要:G1抛弃了之前的分代收集的方式,面向整个堆内存进行回收,把内存划分为多个大小相等的独立区域Region。 一共有4种Region: 自由分区Free Region 年轻代分区Young Region,年轻代还是会存在Eden和Survivor的区分 老年代分区Old Region 大对象分区Humo 阅读全文
posted @ 2023-03-29 19:54 zhengbiyu 阅读(464) 评论(0) 推荐(0) 编辑
DDD基本概念
摘要:DDD是复杂系统设计方法论,核心设计思想:将对软件的分析与设计还原到真实世界中。 系统增删改的业务适用于领域驱动设计,数据分析场景不适合。例:订单与订单明细场景,统计所有订单明细的商品,不可能去查询出订单,再查出订单明细,再统计商品数据分析。 实体 通过一个唯一标识来区分真实世界中每一个个体的领域对 阅读全文
posted @ 2023-03-29 19:41 zhengbiyu 阅读(97) 评论(0) 推荐(0) 编辑
分析器
摘要:分析 包含下面的过程: 首先,将一块文本分成适合于倒排索引的独立的 词条 , 之后,将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recall 分析器执行上面的工作。 分析器 实际上是将三个功能封装到了一个包里: 字符过滤器 首先,字符串按顺序通过每个 字符过滤器 。他们的任务是在分词前 阅读全文
posted @ 2023-03-29 19:38 zhengbiyu 阅读(44) 评论(0) 推荐(0) 编辑
倒排索引
摘要:正排索引:key-value 中,通过 key 去寻找 value。 倒排索引:通过 value(或包含 value)去寻找对应的 key。 正排索引需要首先对全局进行扫描遍历,进而从中做筛选;而倒排索引可以仅抽取符合条件的 value 值,节省大量的资源。 每个被索引的字段都有自己的倒排索引,是否 阅读全文
posted @ 2023-03-29 19:37 zhengbiyu 阅读(47) 评论(0) 推荐(0) 编辑
ES索引字段主要属性配置
摘要:index属性 analyzed:分词后索引,可搜索。 not_analyzed:字段值不分词,以单个关键词进行索引。 no:字段不索引,当然也就不能搜索。 store属性 属性store默认false,当某个数据字段很大,我们可以指定其它字段store为true,这样就不用从_source中取数据 阅读全文
posted @ 2023-03-29 19:36 zhengbiyu 阅读(240) 评论(0) 推荐(0) 编辑
事务消息
摘要:事务消息需要消息队列提供相应的功能才能实现,Kafka和RocketMQ都提供了事务相关功能。 以在电商平台上下单购物的场景为例: 订单系统要保证订单创建后一定能发消息通知到购物车系统。 首先,订单系统在消息队列上开启一个事务。然后订单系统给消息服务器发送一个“半消息”,这个半消息不是说消息内容不完 阅读全文
posted @ 2023-03-29 17:52 zhengbiyu 阅读(225) 评论(0) 推荐(0) 编辑
MIT 6.824
摘要:大数据存储场景下为什么这么难? 为了追求高性能,进行数据分片 performance -> sharding 为了容错 faults -> tolerance,需要数据复制,多副本 tolerance -> replication 为了维护primary数据与replicate副本的数据一致性 re 阅读全文
posted @ 2023-03-29 17:37 zhengbiyu 阅读(56) 评论(0) 推荐(0) 编辑
消息压缩
摘要:什么情况适合使用压缩? 在使用压缩之前,首先你需要考虑,当前这个场景是不是真的适合使用数据压缩。 比如,进程之间通过网络传输数据,这个数据是不是需要压缩呢?我和你一起来对比一下: 不压缩直接传输需要的时间是: 传输未压缩数据的耗时。 使用数据压缩需要的时间是: 压缩耗时 + 传输压缩数据耗时 + 解 阅读全文
posted @ 2023-03-29 17:35 zhengbiyu 阅读(30) 评论(0) 推荐(0) 编辑
如何保证消息顺序消费
摘要:全局严格顺序 如果业务必须要求全局严格顺序,就只能把消息队列数配置成 1,生产者和消费者也只能是一个实例,这样才能保证全局严格顺序。 局部有序 大部分情况下,我们并不需要全局严格顺序,只要保证局部有序就可以满足要求了。比如,在传递账户流水记录的时候,只要保证每个账户的流水有序就可以了,不同账户之间的 阅读全文
posted @ 2023-03-29 17:21 zhengbiyu 阅读(220) 评论(0) 推荐(0) 编辑
消息模型
摘要:消息模型 RocketMq、JMQ模型分别为Broker、Topic、Queue。 Kafka:将Queue换成Partition。 消费者、MQ、生产者关系图 假设有一个主题 MyTopic,我们为主题创建 5 个队列,分布到 2 个 Broker 中。 假设我们有 3 个生产者实例:Produe 阅读全文
posted @ 2023-03-29 17:19 zhengbiyu 阅读(48) 评论(0) 推荐(0) 编辑
保证消息不丢失
摘要:确保消息可靠传递 一条消息从生产到消费完成这个过程,可以划分三个阶段,为了方便描述,我给每个阶段分别起了个名字。 生产阶段: 在这个阶段,从消息在 Producer 创建出来,经过网络传输发送到 Broker 端。 存储阶段: 在这个阶段,消息在 Broker 端存储,如果是集群,消息会在这个阶段被 阅读全文
posted @ 2023-03-29 16:51 zhengbiyu 阅读(6) 评论(0) 推荐(0) 编辑
防止消息重复消费
摘要:用幂等性解决重复消息问题 一般解决重复消息的办法是,在消费端,让我们消费消息的操作具备幂等性。 幂等(Idempotence) 本来是一个数学上的概念,它是这样定义的: 如果一个函数 f(x) 满足:f(f(x)) = f(x),则函数 f(x) 满足幂等性。 这个概念被拓展到计算机领域,被用来描述 阅读全文
posted @ 2023-03-29 16:46 zhengbiyu 阅读(55) 评论(0) 推荐(0) 编辑
LSMT(Log-Structured Merge-Tree)
摘要:LSM简介Log Structured Merge Tree,下面简称 LSM。2006年,Google 发表了 BigTable 的论文。这篇论文提到 BigTable 单机上所使用的数据结构就是 LSM。目前,LSM 被很多存储产品作为存储结构,比如 Apache HBase, Apache C 阅读全文
posted @ 2023-03-29 16:39 zhengbiyu 阅读(992) 评论(0) 推荐(0) 编辑
加载过程
摘要: 阅读全文
posted @ 2023-03-29 16:36 zhengbiyu 阅读(3) 评论(0) 推荐(0) 编辑
lua脚本
摘要:Redis通过内置的lua编译/解释器,可以使用EVAL命令对lua脚本进行求值。 脚本的命令是原子的,RedisServer在执行脚本命令中,不允许插入新的命令;同时脚本的命令可以复制,RedisServer在获得脚本后不执行,生成标识返回,Client根据标识就可以随时执行。 EVAL命令 通过 阅读全文
posted @ 2023-03-29 16:13 zhengbiyu 阅读(228) 评论(0) 推荐(0) 编辑
RDB和AOF
摘要:Redis目前支持两种持久化的方式,RDB和AOF。RDB文件是压缩后的二进制文件,AOF记录的是每一次写操作的命令。所以一般来说AOF文件比RDB占用内存大。 RDB RDB(RedisDataBase)是基于快照(snapshoptting)实现的。redis在运行时会在满足一定条件的情况下将运 阅读全文
posted @ 2023-03-29 16:02 zhengbiyu 阅读(10) 评论(0) 推荐(0) 编辑
Cluster和Slot
摘要:Redis 应对数据量增多的两种方案:纵向扩展(scale up)和横向扩展(scale out)。 纵向扩展:升级单个 Redis 实例的资源配置,包括增加内存容量、增加磁盘容量、使用更高配置的 CPU。 优势:简单、直接 劣势: 当数据量过大时,使用RDB对数据进行持久化时,需要的内存也会增加, 阅读全文
posted @ 2023-03-29 15:54 zhengbiyu 阅读(80) 评论(0) 推荐(0) 编辑
@Transactiona注解失效原因
摘要:用在非public方法 @Transactional是基于动态代理的,Spring的代理工厂在启动时会扫描所有的类和方法,并检查方法的修饰符是否为public,非public时不会获取@Transactional的属性信息,这时不会生成动态代理对象。 同一个类中,非@Transactional方法调 阅读全文
posted @ 2023-03-29 15:09 zhengbiyu 阅读(76) 评论(0) 推荐(0) 编辑
bean加载过程
摘要:加载过程 load BeanDefinition merge BeanDefinition(GenericBeanDefinition -》RootBeanDefinition) 不存在parent,直接创建RootBeanDefinition 存在parent,复制新的RootBeanDefini 阅读全文
posted @ 2023-03-29 14:59 zhengbiyu 阅读(37) 评论(0) 推荐(0) 编辑
traceId实现
摘要:普通 内部拦截器,threadlocal变量set上下文context。 父子线程传递 InheritableThreadLocal Thread内部为InheritableThreadLocal开辟了一个单独的ThreadLocalMap。在父线程创建一个子线程的时候,会检查这个ThreadLoc 阅读全文
posted @ 2023-03-29 11:53 zhengbiyu 阅读(208) 评论(0) 推荐(0) 编辑
https
摘要:基本概念 对称加密 通信双方使用同一个密钥进行加密解密。 例:AES。 非对称加密 服务端用私钥加密,客户端用公钥解密。 公钥加密的数据只能用私钥解密,私钥加密的数据只能用公钥解密。 例:RSA。 摘要 通过摘要算法为原文生成固定长度的内容摘要,且摘要无法被逆向得到原文,不同的内容极大概率(绝大多数 阅读全文
posted @ 2023-03-29 10:42 zhengbiyu 阅读(25) 评论(0) 推荐(0) 编辑
AOP原理
摘要:AOP相关的概念 1)Aspect:切面,切入系统的一个切面。比如事务管理是一个切面,权限管理也是一个切面。 2)Join point:连接点,也就是可以进行横向切入的位置。 3)Advice:通知,切面在某个连接点执行的操作(分为:Before advice,After returning adv 阅读全文
posted @ 2023-03-27 22:29 zhengbiyu 阅读(99) 评论(0) 推荐(0) 编辑
redisObject
摘要:结构 /* * Redis 对象 */ typedef struct redisObject { // 类型 4bits unsigned type:4; // 编码方式 4bits unsigned encoding:4; // LRU 时间(相对于 server.lruclock) 24bits 阅读全文
posted @ 2023-03-27 19:02 zhengbiyu 阅读(13) 评论(0) 推荐(0) 编辑
topK问题
摘要:设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。 请实现 KthLargest 类: KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。 int add(int val) 将 val 阅读全文
posted @ 2023-03-27 00:40 zhengbiyu 阅读(15) 评论(0) 推荐(0) 编辑
二叉树中是否存在节点和为指定值的路径
摘要:给定一个二叉树和一个值\ sum sum,判断是否有从根节点到叶子节点的节点值之和等于\ sum sum 的路径,例如:给出如下的二叉树,sum=22返回true,因为存在一条路径 5→4→11→2 的节点值之和为 22。 递归 class Solution { public boolean has 阅读全文
posted @ 2023-03-27 00:39 zhengbiyu 阅读(16) 评论(0) 推荐(0) 编辑
两个链表的第一个公共节点
摘要:public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode p1 = headA, p2 = headB; while(p1 != p2){ p1 = p 阅读全文
posted @ 2023-03-27 00:38 zhengbiyu 阅读(9) 评论(0) 推荐(0) 编辑
最小路径和
摘要:给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 1: 输入:grid = [[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径 1→3→1→1→1 的总和最小。 阅读全文
posted @ 2023-03-27 00:37 zhengbiyu 阅读(14) 评论(0) 推荐(0) 编辑
流式数据中位数
摘要:解决策略 建立一个大根堆和一个小根堆,用一个临时变量(count)来统计数据流的个数 当插入的数字个数为奇数时,使小根堆的个数比大根堆多1;当插入的数字个数为偶数时,使大根堆和小根堆的个数一样多 当总的个数为奇数时,中位数就是小根堆的堆顶;当总的个数为偶数时,中位数就是两个堆顶的值相加除以2 imp 阅读全文
posted @ 2023-03-27 00:36 zhengbiyu 阅读(37) 评论(0) 推荐(0) 编辑
合并有序链表
摘要:遍历解法 同时不断遍历两个链表,取出小的追加到新的头节点后,直至两者其中一个为空,再将另一者追加的新链表最后 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode dummy = new ListNode(-1); Li 阅读全文
posted @ 2023-03-27 00:36 zhengbiyu 阅读(39) 评论(0) 推荐(0) 编辑
反转链表
摘要:class Solution { public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode curr = head; while(curr != null) { ListNode nxt = curr.ne 阅读全文
posted @ 2023-03-27 00:33 zhengbiyu 阅读(9) 评论(0) 推荐(0) 编辑
删除倒数第n个节点
摘要:class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode pre = new ListNode(0); pre.next = head; ListNode start = pre, end = 阅读全文
posted @ 2023-03-27 00:33 zhengbiyu 阅读(8) 评论(0) 推荐(0) 编辑
删除重复节点
摘要:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5 数据范围:链表长度满足 0≤n≤1000,链表中的值满足 1≤val≤1000 进阶:空间复杂度 O(n),时间复杂度 O( 阅读全文
posted @ 2023-03-27 00:33 zhengbiyu 阅读(22) 评论(0) 推荐(0) 编辑
删除重复的元素
摘要:给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 阅读全文
posted @ 2023-03-27 00:32 zhengbiyu 阅读(26) 评论(0) 推荐(0) 编辑
全排列
摘要:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例 2: 输入:nums = [0,1] 输 阅读全文
posted @ 2023-03-27 00:31 zhengbiyu 阅读(23) 评论(0) 推荐(0) 编辑
连续子数组的最大和
摘要:输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 示例1: 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 提示: 1 <= arr.le 阅读全文
posted @ 2023-03-27 00:30 zhengbiyu 阅读(242) 评论(0) 推荐(0) 编辑
顺时针打印矩阵
摘要:class Solution { public int[] spiralOrder(int[][] matrix) { if(matrix.length == 0) return new int[0]; int l = 0, r = matrix[0].length - 1, t = 0, b = 阅读全文
posted @ 2023-03-27 00:29 zhengbiyu 阅读(9) 评论(0) 推荐(0) 编辑
二叉树层序遍历
摘要:递归 按照深度优先的处理顺序,会先访问节点 1,再访问节点 2,接着是节点 3。之后是第二列的 4 和 5,最后是第三列的 6。 每次递归的时候都需要带一个 index(表示当前的层数),也就对应那个田字格子中的第几行,如果当前行对应的 list 不存在,就加入一个空 list 进去。 class 阅读全文
posted @ 2023-03-27 00:29 zhengbiyu 阅读(14) 评论(0) 推荐(0) 编辑
每k个节点反转链表
摘要:给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 示例 1: 输入:head = [1,2 阅读全文
posted @ 2023-03-27 00:28 zhengbiyu 阅读(178) 评论(0) 推荐(0) 编辑
change buffer
摘要:change buffer 是 buffer pool 里的一块区域。 change buffer 不缓存聚簇索引的更新,二级索引的page假如符合使用 change buffer 更新条件的话,就不去读磁盘,直接使用 change buffer 的 page,change buffer 的 pag 阅读全文
posted @ 2023-03-27 00:25 zhengbiyu 阅读(106) 评论(0) 推荐(0) 编辑
索引失效场景
摘要:什么时没必要用索引 1) 数据唯一性差,区分度不高(一个字段的取值只有几种时)的字段不要使用索引 比如性别,只有两种可能数据。意味着索引的二叉树级别少,多是平级。这样的二叉树查找无异于全表扫描。 2) 频繁更新的字段不要使用索引 比如logincount登录次数,频繁变化导致索引也频繁变化,增大数据 阅读全文
posted @ 2023-03-27 00:15 zhengbiyu 阅读(48) 评论(0) 推荐(0) 编辑
B Tree和B+Tree
摘要:索引结构(innodb) B Tree 每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为null,叶子结点不包含任何关键字信息 B+Tree 所有的叶子结点中包含了全部关键字的信息,非叶子节点只存储键值信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的 阅读全文
posted @ 2023-03-26 23:47 zhengbiyu 阅读(17) 评论(0) 推荐(0) 编辑
undo log
摘要:事务回滚用,属于逻辑日志。 行记录隐藏列roll_pointer(7字节)会指向undolog,每条undolog中也有一个roll_pointer指向更早的undolog记录,在mvcc中会使用版本链来达到事务隔离的效果。 我们知道如果想要保证事务的原子性,就需要在异常发生时,对已经执行的操作进行 阅读全文
posted @ 2023-03-26 23:39 zhengbiyu 阅读(80) 评论(0) 推荐(0) 编辑
redo log
摘要:在mysql中数据更新的流程是:1、执行器先从引擎中找到数据,如果在内存则直接返回,如果不在内存查询后返回。2、执行器拿到数据后,会先修改数据,然后记录undolog,调用引擎接口重新写入数据。3、引擎将数据更新到内存,同时写入redo log,此时处于prepare状态。4、执行器生成这个操作的b 阅读全文
posted @ 2023-03-26 23:38 zhengbiyu 阅读(65) 评论(0) 推荐(0) 编辑
死锁
摘要:死锁的必要条件 多个并发事务(2个或者以上)。 每个事务都持有锁(或者是已经在等待锁)。 每个事务都需要再继续持有锁(为了完成事务逻辑,还必须更新更多的行)。 事务之间产生加锁的循环等待,形成死锁。 总结:当两个或多个事务相互持有对方需要的锁时,就会产生死锁。 死锁的检测(8.0版本增加) 当死锁检 阅读全文
posted @ 2023-03-26 23:29 zhengbiyu 阅读(59) 评论(0) 推荐(0) 编辑
表新增字段如何减少影响业务影响
摘要:首先选择业务低峰期执行,如果24小时业务都频繁,有以下几种方式: 直接添加 如果该表读写不频繁,数据量较小(通常1G以内或百万以内),直接添加即可。 MySQL 5.6后自带OnlineDDL功能(MyISAM表无法使用,且不支持全文和空间索引),自身的OnlineDDL是inplace模式,当整个 阅读全文
posted @ 2023-03-26 23:20 zhengbiyu 阅读(241) 评论(0) 推荐(0) 编辑
数据库表数据空洞处理
摘要:数据空洞 当对一条数据执行delete操作时,MySQL将数据删除后,并未将数据占用的空间返还给操作系统,而是将当前空间标记为"可复用",当有新的数据插入时,则不会重新申请空间,而是插入到"可复用"空间中,这种"可复用"空间,称之为数据空洞。 MySQL官方文档对此的解释如下: After dele 阅读全文
posted @ 2023-03-26 23:14 zhengbiyu 阅读(188) 评论(0) 推荐(0) 编辑
一般怎么分析一个sql
摘要:explain语句进行分析。还需要进一步分析的话可以进行optimizer_trace,一共prepare、optimizer、execute阶段,主要关注optimizer阶段。 type 详见索引的访问类型。 key 实际使用的索引。 key_len 使用的索引的长度。可以分析联合索引用上了几个 阅读全文
posted @ 2023-03-26 23:11 zhengbiyu 阅读(41) 评论(0) 推荐(0) 编辑
MVCC机制
摘要:行记录隐藏列trx_id(占用 6 个字节)。 RC隔离级别是在每次执行sql时生成read view,RR隔离级别是在事务开始后第一次执行sql生成read view。 ReadView中主要包含4个比较重要的内容: m_ids:表示在生成ReadView时当前系统中活跃的读写事务的事务id列表。 阅读全文
posted @ 2023-03-26 23:09 zhengbiyu 阅读(41) 评论(0) 推荐(0) 编辑
数据类型-Sorted Set(待补充)
摘要:Redis为什么使用skiplist而不是平衡树 Redis中的skiplist主要是为了实现sorted set相关的功能,红黑树当然也能实现其功能,为什么redis作者当初在实现的时候用了skiplist而不是红黑树、b树之类的平衡树? 而且显然红黑树比skiplist更节省内存啊! Redis 阅读全文
posted @ 2023-03-25 22:21 zhengbiyu 阅读(18) 评论(0) 推荐(0) 编辑
数据结构-跳表
摘要:数据结构 /* ZSETs use a specialized version of Skiplists */ typedef struct zskiplistNode { sds ele; double score; struct zskiplistNode *backward; struct z 阅读全文
posted @ 2023-03-25 22:09 zhengbiyu 阅读(54) 评论(0) 推荐(0) 编辑
分布式锁
摘要:redis做分布式锁采用set命令实现。 set指令扩展参数:SET key value[EX seconds][PX milliseconds][NX|XX] - NX :表示key不存在的时候,才能set成功,也即保证只有第一个客户端请求才能获得锁, 而其他客户端请求只能等其释放锁,才能获取。 阅读全文
posted @ 2023-03-25 19:13 zhengbiyu 阅读(16) 评论(0) 推荐(0) 编辑
数据类型-Hash
摘要:参考数据类型与底层数据结构,Hash类型存在压缩列表和字典两种数据结构。 当Hash中节点比较少的情况下,底层才用压缩列表ziplist进行存储数据,随着数据的增加,底层的ziplist就可能会转成字典结构,具体配置如下: filed元素个数小于 hash-max-ziplist-entries(默 阅读全文
posted @ 2023-03-25 16:54 zhengbiyu 阅读(16) 评论(0) 推荐(0) 编辑
数据结构-字典
摘要:字典结构 typedef struct dict { // 类型特定函数 dictType *type; // 私有数据 void *privdata; // 哈希表 dictht ht[2]; // rehash 索引 // 当 rehash 不在进行时,值为 -1 int rehashidx; 阅读全文
posted @ 2023-03-25 16:47 zhengbiyu 阅读(56) 评论(0) 推荐(0) 编辑
数据结构-ziplist压缩列表
摘要:压缩列表实际上类似于一个数组,数组中的每一个元素都对应保存一个数据。 压缩列表结构 struct ziplist<T> { int32 zlbytes; int32 zltail_offset; int16 zllength; T[] entries; int8 zlend; } zlbytes:整 阅读全文
posted @ 2023-03-25 16:28 zhengbiyu 阅读(46) 评论(0) 推荐(0) 编辑
数据类型-String
摘要:当保存 64 位有符号整数时,String 类型会把它保存为一个 8 字节的 Long 类型整数,这种保存方式通常也叫作 int 编码方式。 当保存的数据中包含字符时,String 类型就会用简单动态字符串(Simple Dynamic String,SDS)结构体来保存,如下图所示: buf:字节 阅读全文
posted @ 2023-03-25 16:09 zhengbiyu 阅读(74) 评论(0) 推荐(0) 编辑
数据类型概述
摘要:为了实现从键到值的快速访问,Redis 使用了一张全局哈希表来保存所有键值对。 数据类型与底层数据结构 String 类型的底层实现只有一种数据结构,也就是简单动态字符串。而 List、Hash、Set 和 Sorted Set 这四种数据类型,都有两种底层实现结构。通常情况下,我们会把这四种类型称 阅读全文
posted @ 2023-03-25 15:53 zhengbiyu 阅读(19) 评论(0) 推荐(0) 编辑
new Object()占用内存
摘要:32位虚拟机和64位虚拟机下的Java对象头内存模型: 本地环境是jdk1.8,64位虚拟机,这里我以64位虚拟机(开启指针压缩)来分析,因为默认情况下,jdk1.8 在64位虚拟机默认开启指针压缩。 Java 对象头主要包括两部分,第一部分就是 Mark Word,这也是 Java 锁实现原理中重 阅读全文
posted @ 2023-03-25 15:46 zhengbiyu 阅读(28) 评论(0) 推荐(0) 编辑
JVM内存分布
摘要:JVM内存分布图 执行字节码的模块叫做执行引擎,执行引擎依靠程序计数器恢复线程切换。本地内存包含元数据区域以及一些直接内存。 程序计数器(Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器,指向下一个将要执行的指令代码,由执行引擎来读 阅读全文
posted @ 2023-03-19 23:35 zhengbiyu 阅读(97) 评论(0) 推荐(0) 编辑
对象访问方式
摘要:Object objectRef = new Object(); 假设这句代码出现在方法体中,Object objectRef这部分将会反映到Java栈的本地变量中,作为一个reference类型数据出现。而new Object()这部分将会反映到Java堆中,形成一块存储Object类型所有实例数 阅读全文
posted @ 2023-03-19 23:16 zhengbiyu 阅读(26) 评论(0) 推荐(0) 编辑
项目启动时CPU高
摘要:在发布或重启某线上某服务时,常常发现有些机器的load会飙到非常高(高达70),并持续较长一段时间(5分钟)后回落,与此同时响应时间曲线也与load曲线一致。注:load飙高的初始时刻是应用服务端口打开,流量打入时(load)。 发布时候load飙高 发布时候响应时间飙高 cpu使用率较高的两个线程 阅读全文
posted @ 2023-03-19 20:48 zhengbiyu 阅读(270) 评论(0) 推荐(0) 编辑
类加载器
摘要:创建bootstrapClassLoader,创建启动器Launcher。 父子加载器的类关系不是继承关系,子加载器通过parent变量引用父加载器。 为什么类加载的顺序不是从引导类加载器先加载,而是从应用类加载器加载? 因为只有AppClassLoader会检查类是否已被加载过。因为项目中大部分代 阅读全文
posted @ 2023-03-19 20:43 zhengbiyu 阅读(23) 评论(0) 推荐(0) 编辑
Tomcat类加载
摘要:tomcat如何实现,应用隔离类加载? org.apache.catalina.loader.WebappClassLoaderBase#loadClass(java.lang.String, boolean) (1)先在本地缓存中查找是否已经加载过该类(对于一些已经加载了的类,会被缓存在resou 阅读全文
posted @ 2023-03-19 20:37 zhengbiyu 阅读(106) 评论(0) 推荐(0) 编辑
SPI与双亲委派模型
摘要:类加载顺序图: 这样做的好处就是:Java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如类java.lang.Object,它存放在rt.jar中,无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都是同一个类 阅读全文
posted @ 2023-03-19 20:28 zhengbiyu 阅读(53) 评论(0) 推荐(0) 编辑
创建对象内存分配方式
摘要:对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来。分配方式有指针碰撞和空闲列表两种,选择哪种分配方式由 Java 堆是否规整决定,而 Java 堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。 内存分配的两种方式 (补充内容 阅读全文
posted @ 2023-03-19 20:21 zhengbiyu 阅读(39) 评论(0) 推荐(0) 编辑
对象创建过程
摘要:首先进行类加载,然后会对象进行逃逸分析,如果对象引用不会逃逸,那么进行栈上分配。 编译器分层编译:C1、C2。C2下才会有栈上分配的优化,且不同虚拟机优化方式不一样,Hotspot虚拟机使用的是标量替换方式进行优化,把对象拆解,让对象的成员变量分配在栈上。 Class 文件需要加载到虚拟机中之后才能 阅读全文
posted @ 2023-03-19 20:19 zhengbiyu 阅读(17) 评论(0) 推荐(0) 编辑
常用JVM参数
摘要:-XX:+PrintCommandLineFlags 打印那些已经被用户或者JVM设置过的详细的xx参数的名称和值。 -XX:+PrintFlagsInitial 打印所有JVM参数启动的初始值 -XX:+PrintFlagsFinal 打印所有JVM参数的最终值 -Xms6144m -Xmx614 阅读全文
posted @ 2023-03-19 20:02 zhengbiyu 阅读(65) 评论(0) 推荐(0) 编辑
Card Marking
摘要:如果 young gc 线程只遍历年轻代内的对象引用,那么老年代到年轻代的跨代引用就会被忽略,被老年代存活对象跨代引用的年轻代对象会被回收,这样就破坏了应用程序的运行。但是如果每次ygc都进行全堆扫描,且ygc次数较频繁,会很慢。在 young gc 时,为了找到跨代引用,通常有这几个方法: 当对象 阅读全文
posted @ 2023-03-19 19:02 zhengbiyu 阅读(36) 评论(0) 推荐(0) 编辑
CMS
摘要:一种以获取最短回收停顿时间为目标的收集器。 特点:基于标记-清除算法实现。并发收集、低停顿。 应用场景:适用于注重服务的响应速度,希望系统停顿时间STW最短,给用户带来更好的体验等场景下。如web程序、b/s服务。 CMS收集器的缺点: CMS收集器对CPU资源非常敏感,在并发阶段虽然不会导致用户线 阅读全文
posted @ 2023-03-19 18:46 zhengbiyu 阅读(116) 评论(0) 推荐(0) 编辑
HashMap
摘要:流程 resize 初始化大小16,负载因子0.75。 当桶节点个数大于扩容阈值,会进行扩容,容量扩大到2倍。 //离100最近的2次幂是128,默认负载因子是0.75,所以扩容阈值是128*0.75=96,以下put发生rehash HashMap hashMap = new HashMap(10 阅读全文
posted @ 2023-03-19 18:15 zhengbiyu 阅读(29) 评论(0) 推荐(0) 编辑
半连接、全连接队列溢出分析
摘要:全连接队列 watch 'netstat -s | grep overflowed' 动态观察全连接队列溢出,如果数值在增长,那么确定是全连接队列满了。 半连接队列 cat /proc/sys/net/ipv4/tcp_syncookies 查看是否启用了SYN Cookies。默认0,1表示开启。 阅读全文
posted @ 2023-03-07 00:09 zhengbiyu 阅读(30) 评论(0) 推荐(0) 编辑

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示