- 博客(97)
- 收藏
- 关注
原创 如果我是面试官,会怎么问JVM(一)
考察:希望面试者有实战经验,并能总结经验,能在工作中提升思考答:有。常见的JVM异常有OutOfMemoryError、StackOverflowError。
2023-12-09 16:51:50
930
原创 Elasticsearch底层原理分析——新建、索引文档
参考官网(https://www.elastic.co/guide/cn/elasticsearch/guide/current/translog.html)理解。所以会先将文档写入文件系统缓存中,也即图中In-memory buffer中,对应的是 Indexing Buffer(https://www.elastic.co/guide/en/elasticsearch/reference/8.10/indexing-buffer.html)。源码主要在ReplicationOperation类中。
2023-11-28 21:31:55
1524
1
原创 Elasticsearch内存分析
Segments Cache(segments FST数据的缓存),为了加速查询,FST 永驻堆内内存,无法被 GC 回收。1)这部分堆内存,首先得包括Elasticsearch从字节码加载验证解析到内存的部分,如局部变量存储虚拟机栈,实例对象存储堆空间等;新的文档写入原理是,首先被添加到内存索引缓存中,然后写入到一个基于磁盘的段,这部分内存为Indexing Buffer。6)ES 底层存储采用 Lucene,Lucene 引入排索引的二级索引 FST,原理上可以理解为前缀树,加速查询。
2023-11-07 19:00:20
1091
1
原创 向量检索库Milvus架构及数据处理流程
Sealed:Segment 已经被关闭了,它的空间不可以再往外分配。例如以登陆次数和平均观看时长作为特征时,余弦相似度会认为(1,10)、(10,100)两个用户距离很近,但显然这两个用户的活跃度是有着很大差异的,(10,100)这个用户的价值更高,此时我们更关注数值绝对差异,应当使用欧氏距离。milvus的索引内存数据,存储在query node中,当query扩容(或缩容)时,由于索引文件持久化在对象存储中,query coord会进行重新分配,从而拥有水平扩(缩)容的能力。
2023-10-23 21:04:14
3052
原创 es评分 BM25
评分机制详解参数解释当只有一篇文档时,只有docId为1的文档中elastic, 匹配搜索词项elastic再增加一篇文档当增加一篇文档时原来的文档1返回改变的有:再增加一篇不相关的此时查询文档1改变的有:......
2022-07-04 23:34:09
613
原创 etcd源码学习
etcd源码启动1 go 代理配置vi ~/.bash_profile# 添加export GOROOT="/usr/local/go"export GOPATH="/Users/xx/go"PATH=$PATH:$GOPATH/binexport PATHgo env -w GO111MODULE=ongo env -w GOPROXY=https://goproxy.cn,direct #之所以在后面拼接一个 ,direct,是因为通过这样做我们可以在一定程度上解决私有库的问题#
2022-05-24 21:58:29
176
原创 ShardingSphere-JDBC进行分表
文章目录maven配置application.yml配置MySpringPhysicalNamingStrategy分表逻辑maven配置<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.1</v
2022-05-18 22:57:02
380
原创 elasticsearch源码启动
下载源码由于git clone 拉不下来,直接下在zip文件https://github.com/elastic/elasticsearch/archive/refs/heads/master.zip遇到问题最新版本需要jdk16,下载jdk16 并支持切换环境。JAVA_HOME配置jdk16执行./gradlew localDistro(https://github.com/elastic/elasticsearch),产物在distribution中。选择你对应系统的包,mac 系统
2021-11-18 21:25:39
1768
原创 Elasticsearch之深入理解
文章目录ES应用场景ES应用场景举例应用场景思考ES和其他数据库对比ES架构GatewayLucene数据处理发现机制与脚本TransportREST full APIES中集群、节点、索引、分片、段等概念集群节点索引分片段(segment)文档(document)字段(field)词项(term)词条(token)(_analyze查询)Mapping分片解决什么问题?分片数该怎么设置?副本解决什么问题?集群的初期规划ES底层数据结构un-inverted data(Doc Values 正排索引)场景生
2021-08-23 18:08:26
2418
原创 通过MyCat中间件去理解分库分表
数据库划分OLTP:联机亊务处理。面向交易的处理系统,其基本特征是原始数据可立即传送到计算中心进行处理,并在很短时间内给出处理结果。OLAP:联机分析处理。是指通过多维的方式对数据进行分析、查询和报表,可以同数据挖掘工具、统计分析工具配合使用,增强决策分析能力垂直切分和水平切分数据切分的经验:第一原则:能不切分尽量不要切分。第二原则:如果要切分一定要选择合适的切分规则,提前规划好。第三原则:数据切分尽量通过数据冗余或表分组(Table Group)来降低跨库 Join 的可能。第四原则:
2021-03-24 22:47:06
253
1
原创 面试题:线程池内线程没有catch处理,抛出异常,线程池会怎么办?
答案当线程池中线程执行任务的时候,任务出现未被捕获的异常的情况下,线程池会将允许该任务的线程从池中移除并销毁,且同时会创建一个新的线程加入到线程池中;可以通过ThreadFactory自定义线程并捕获线程内抛出的异常,也就是说甭管我们是否去捕获和处理线程池中工作线程抛出的异常,这个线程都会从线程池中被移除源码这道面试题源码在ThreadPoolExecutor#runWorker()方法中任务运行是task.run(),进行了try catch处理,catch中将异常直接抛出,所以用户没有进行任何处
2021-01-29 10:11:39
925
1
原创 Netty中使用的设计模式
创建型简单工厂public class DefaultThreadFactory implements ThreadFactory { @Override public Thread newThread(Runnable r) { Thread t = newThread(FastThreadLocalRunnable.wrap(r), prefix + nextId.incrementAndGet()); try { if (t.
2021-01-19 23:32:59
303
原创 Spring中使用的设计模式
创建型单例模式单例模式概念是一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。Spring中默认Bean创建可以认为是一种使用ConcurrentHashMap实现的特殊的单例模式@Beanprivate final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);protected Object getSingleton(String beanName, boolean
2021-01-19 21:23:54
234
原创 排序算法与数据结构资料总结
查找Arrays工具类中二分查找private static int binarySearch0(int[] a, int fromIndex, int toIndex, int key) { int low = fromIndex; int high = toIndex - 1; while (low <= high) { int mid = (low + high) >>&g
2021-01-18 11:36:41
150
原创 Kafka知识总结及面试题
文章目录概念Kafka基础概念命令行Kafka 数据存储设计kafka在zookeeper中存储结构生产者生产者设计消费者消费者设计面试题kafka设计请说明什么是Apache Kafka?请说明什么是传统的消息传递方法?请说明Kafka相对传统技术有什么优势?Kafka与传统MQ消息系统之间有三个关键区别说说Kafka的使用场景?使用Kafka有什么优点和缺点?谈谈Kafka吞吐量为何如此高?zookeeper对于kafka的作用什么是ISR伸缩Kafka中是怎么体现消息顺序性的?Kafka中的分区器、序
2021-01-07 20:06:17
2919
原创 zookeeper中zxid查看
ZAB ( ZooKeeper Atomic Broadcast , ZooKeeper 原子消息广播协议) 协议的事务编号 Zxid设计中,Zxid 是一个 64 位的数字,其中低 32位是一个简单的单调递增的计数器,针对客户端每一个事 务请求,计数器加 1;而高 32 位则代表 Leader 周期 epoch 的编号。每个当选产生一个新的 Leader服务器,就会从这个 Leader服务器上取出其本地日志中最大事务的 ZXID,并从中读取epoch 值,然后加 1,以此作为新的 epoch,并将低
2021-01-05 10:38:09
3785
原创 深入理解Redis系列之内存
内存消耗划分自身内存Redis空进程自身内存消耗非常少,通常used_memory_rss在3MB左右,used_memory在800KB左右,一个空的Redis进程消耗内存可以忽略不计。对象内存对象内存存储着用户所有的数据,对象内存消耗可以简单理解为sizeof(keys)+sizeof(values)。缓冲内存缓冲内存主要包括:客户端缓冲、复制积压缓冲区、AOF缓冲区。客户端缓冲指的是所有接入到Redis服务器TCP连接的输入输出缓冲。复制积压缓冲区:Redis在2.8版本之后提供了
2021-01-04 15:22:27
468
原创 深入理解Redis系列之缓存设计
缓存使用的优缺点优点加速读写,优化用户体验降低后端负载,帮助后端减少访问量和复杂计算(如很复杂的SQL语句),在很大程度降低了后端的负载缺点数据不一致性,缓存层和存储层的数据存在着一定时间窗口不一致性,时间窗口跟更新策略有关。代码维护成本,加入缓存后,需要同时处理缓存层和存储层的逻辑,增大了开发者维护代码的成本运维成本,如Redis Cluster,加入后增加了运维成本。使用缓存场景基本包含:开销大的复杂计算,以MySQL为例,一些复杂的操作或计算(如大量联表操作、一些分
2020-12-31 16:05:31
213
原创 深入理解Redis系列之事务
事务命令Redis通过MULTI、EXEC、WATCH等命令来实现事务MULTI //事务开始SET "name" "test" //do something...EXEC //提交事务WATCH "name" //WATCH监视DISCARD //丢弃事务事务执行流程事务命令队列WATCH命令WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为。Redis事务到底是不是原子性的?官方文档对事务的定义:事务是一个单独的隔离操作
2020-12-31 10:06:19
140
原创 深入理解Redis系列之持久化
redis持久化配置redis.conf// RDB配置save 900 1save 300 10save 60 10000// AOF配置appendonly yes//AOF三种同步方式# appendfsync alwaysappendfsync everysec# appendfsync noRDB配置对应saveparams参数:dirty:距离上一次成功执行SAVE或BGSAVE命令之后,服务器对数据库状态进行了多少次修改RDB和AOF对比因为AOF更新频
2020-12-30 21:05:59
116
原创 《Redis设计与实现》笔记之单机数据库
过期时间和删除策略三种删除策略:定时删除:在设置键的过期时间同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作优点:保证过期键会尽可能快地被删除,并释放过期键所占内存缺点:抢占CPU运行时间,在过期键比较多情况,删除过期键可能占用相当一部分CPU时间,对服务器响应时间和吞吐量造成影响。惰性删除:放任键过期不管,但每次从键空间获取键时,都检查取得的键是否过期,如果过期就删除该键。没有就返回该键。优点:对CPU时间友好,不会在删除其他无关键花费CPU资源缺点
2020-12-30 18:59:47
109
原创 基于数据库、redis和zookeeper实现的分布式锁
基于数据库基于数据库(MySQL)的方案,一般分为3类:基于表记录、乐观锁和悲观锁基于表记录用表主键或表字段加唯一性索引便可实现,如下;CREATE TABLE `database_lock` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `resource` int NOT NULL COMMENT '锁定的资源', `description` varchar(1024) NOT NULL DEFAULT "" COMMENT '描述', PRIMARY K
2020-12-30 14:06:58
154
原创 深入理解MySQL系列之优化
查询语句优化选取最适用的字段属性。设置合适表中字段的宽度,尽量把字段设置为NOTNULL,这样在将来执行查询的时候,数据库不用去比较NULL值。对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多使用连接(JOIN)来代替子查询使用联合(UNION)来代替手动创建的临时表使用事务保证数据一致性和完整性锁定表使用外键使用索引应尽量避免在
2020-12-29 13:45:50
89
原创 深入理解MySQL系列之锁
按锁思想分类悲观锁优点:适合在写多读少的并发环境中使用,虽然无法维持非常高的性能,但是在乐观锁无法提更好的性能前提下,可以做到数据的安全性缺点:加锁会增加系统开销,虽然能保证数据的安全,但数据处理吞吐量低,不适合在读书写少的场合下使用乐观锁优点:在读多写少的并发场景下,可以避免数据库加锁的开销,提高DAO层的响应性能,很多情况下ORM工具都有带有乐观锁的实现,所以这些方法不一定需要我们人为的去实现。缺点:在写多读少的并发场景下,即在写操作竞争激烈的情况下,会导致CAS多次重试,冲.
2020-12-26 15:41:45
151
原创 深入理解MySQL系列之redo log、undo log和binlog
事务的实现redo log保证事务的持久性,undo log用来帮助事务回滚及MVCC的功能。InnoDB存储引擎体系结构redo logWrite Ahead Log策略事务提交时,先写重做日志再修改页;当由于发生宕机而导致数据丢失时,就可以通过重做日志来完成数据的恢复。InnoDB首先将重做日志信息先放到重做日志缓存按一定频率刷新到重做日志文件重做日志文件: 在默认情况,InnoDB存储引擎的数据目录下会有两个名为ib_logfile1和ib_logfile2的文件。每个Inn
2020-12-25 23:33:16
319
原创 《Redis设计与实现》笔记之数据结构与对象
数据结构与对象SDSSDS(simple dynamic string): 简单动态字符串SDS定义:SDS与C字符串区别:C字符串并不记录自身的长度信息,SDS有len属性。C字符串容易缓冲区溢出,SDS不会,SDS会先检查空间是否满足需要,不够扩展空间SDS字符串可以减少修改字符串时带来的内存重分配次数。C字符串如增长字符串忘记内存重分配来扩展底层数组空间大小,会产生缓冲区溢出;如是缩短字符串操作,忘记内存重分配释放不需要的空间,会产生内存泄漏。而频繁内存重分配,影响性能。
2020-12-24 22:52:08
136
2
原创 深入理解MySQL系列之索引
索引查找一条数据的过程先看下InnoDB的逻辑存储结构:表空间:可以看做是InnoDB存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。默认有个共享表空间ibdata1。如果启用innodb_file_per_table参数,需要注意每张表的表空间内存放的只是数据、索引和插入缓冲Bitmap页,其他类的数据,如回滚信息、插入缓冲索引页、系统事务信息、二次写缓冲等还是存放在原来共享表空间中。段:表空间是由各个段组成,常见的段有数据段、索引段、回滚段等。数据段即为B+树叶子节点(Leaf
2020-12-24 15:14:09
115
原创 《MySQL技术内幕》笔记
MySQL体系结构连接池组件管理服务和工具组件SQL接口组件查询分析器组件缓冲组件插件式存储引擎物理文件各存储引擎对比InnoDB存储引擎InnoDB存储引擎体系架构InnoDB存储引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责:维护所有进程/线程需要访问的多个内部数据结构缓存磁盘上的数据,方便快速地读取,同时在对磁盘文件的数据修改之前在这里缓存重做日志(redo log)缓冲…后台线程:Master Thread:主要负责将缓冲池中的数据异
2020-12-23 14:16:28
207
原创 线程池源码分析
ThreadPoolExecutor的参数解释public class ThreadPoolExecutor extends AbstractExecutorService { public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
2020-12-21 16:59:39
227
原创 ThreadLocal源码分析
Java内存结构图说明:每个线程都会有一个局部变量 threadLocals,存放在各自线程栈帧局部变量表中,指向堆中的ThreadLocalMap实例对象不同的线程在堆中对应不同的ThreadLocalMap实例对象ThreadLocalMap的key是ThreadLocal实例对象每个线程拥有各自的ThreadLocalMap实例对象在threadLocal set值的时候,若threadLocalMap为null,new一个ThreadLocalMap对象所以每个线程都是新new的
2020-12-21 14:15:12
263
原创 Semaphore、CountDownLatch、CyclicBarrier、Exchanger、Phaser源码
SemaphoreSemaphore最主要功能特点,是控制同时访问特定资源的线程数量。其源码实现就是在初始化时传入permits参数,紧接着调用AQS同步器setState方法,将内存中state值设为permits传入的参数值;而当要同时访问的线程数, 大于state的值,即remaining小于0时,线程加入同步器中队列进行等待。public class Semaphore implements java.io.Serializable { abstract static class S
2020-12-18 15:16:01
156
原创 ReentrantReadWriterLock源码(state设计、读写锁、共享锁、独占锁及锁降级)
ReentrantReadWriterLock读写锁类图(截图来源https://blog.youkuaiyun.com/wangbo199308/article/details/108688148)state的设计读写锁将变量state切分成两个部分,高16位表示读,低16位表示写源码中将4字节(32位)的int数据类型state,通过SHARED_SHIFT(16)划分读和写;每次读锁增加的单元,SHARED_UNIT = (1 << SHARED_SHIFT) 也即0x000100
2020-12-18 13:11:10
370
原创 synchronized实现原理及ReentrantLock源码
synchronizedsynchronized的作用范围public class SynchronizedTest { // 实例方法,方法访问标志ACC_SYNCHRONIZED,锁对象是对象实例 public synchronized void test1(){} // 静态方法,方法访问标志ACC_SYNCHRONIZED,锁对象是MetaSpace中的Class // 相当于类的全局锁,会锁住所有调用该方法的线程 public synchronized
2020-12-17 22:11:14
154
原创 Java中的锁优化(对象头、锁膨胀过程、自旋锁、偏向锁、轻量级锁及锁粗化)
对象头对象头内存布局使用jol查看对象头内存布局(查看锁标志时,注意大端存储和小端存储)引入依赖<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.14</version> <scope>provided</scope>&l.
2020-12-16 22:22:22
382
原创 Java内存模型(MESI、内存屏障、volatile和锁及final内存语义)
JMM (Java内存模型)Java线程的实现实现线程主要有三种方式,Java线程从JDK1.3后采用第一种方式实现:使用内核线程实现(1:1实现)使用用户线程实现(1:N实现)使用用户线程加轻量级进程混合实现(N:M实现)KTL: 内核线程LWP:轻量级进程UT:用户线程线程之间通信机制Java并发采用的是共享内存模型共享内存消息传递重排序包括:编译器优化的重排序。指令级并行的重排序。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。.
2020-12-16 17:24:18
293
原创 NIO之Buffer源码分析
https://dongzl.github.io/netty-handbook/#/_content/chapter03测试代码public class BasicBuffer { public static void main(String[] args) { LongBuffer longBuffer = LongBuffer.allocate(4); System.out.println(longBuffer.mark() + "," + longBuffe
2020-12-05 23:44:09
126
原创 多线程submit返回值实现源码
测试代码public class ThreadTest { public static void main(String[] args) { ExecutorService pool = Executors.newFixedThreadPool(5); Future future = pool.submit(new Callable<Object>() { @Override public String c
2020-12-03 21:35:12
220
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人