hexo + butterfly 搭建记录
认识 hexo简单来说,就是一个博客框架。社区很活跃,里面有很懂框架可以直接使用和自定义。更多详情,直接查看官网: https://hexo.io/zh-cn/docs/index.html 🚀 markdown 语法可以查看 本地搭建 hexo 记录1.git 安装:略2.node.js 安装:版本 22,详情略3.启动终端安装框架:npm install -g hexo-cli4.初始化 hexo 123hexo init <folder>cd <folder>npm install 5.在 hexo 根目录终端输入: hexo server,启动程序,访问 http://localhost:4000/ 不报错即成功。 常用命令1.在终端输入 hexo new page 导航栏名字,如:hexo new page about 配置 github pages注意: 创建github 仓库的时候,必须要一个 README.md,不然会失败。 详情查看官网文档:https://hexo.io/zh-cn/docs/github-pages 进阶 Ne...
场景分析
⭐海量数据下的实时模糊检索问题核心思路是:将“模糊检索”工作从关系型数据库(如MySQL)中剥离,交给专业的搜索/分析引擎来处理。 例如人:通过名字模糊查询用户,2000w数据,20%每月数据量增长,返回列表要怎么做?方案一:mysql硬撑方案二:引入第三方专业引擎,如ES,这是处理海量数据模糊搜索的标准工业级方案。方案三:高阶方案——分库分表 + ES 线程安全问题下面这段代码有什么线程安全问题,有几种方案解决? 12345678910public class demo { public void test(){ ReentrantLock lock = new ReentrantLock(); lock.lock(); //处理业务 lock.unlock(); }} 问题: 锁是局部变量,无法实现线程间互斥 未使用 try-finally,可能造成锁永不释放 解决方案一:将锁提升为成员变量,并配合使用try-finally 123456789101112...
jvm面试
JNI是什么Java编译器把Java文件编译为字节码文件之后,jvm执行引擎将字节码指令解释为对应操作系统能运行的指令,这也是为什么Java是编译和解释共存的语言。当Java代码执行的时候,需要调用底层的c或者c++写的本地方法,所以这里就需要本地方法接口(JNI)去和本地方法库做交互。 JVM的垃圾回收机制是怎么样的?想要回收垃圾,先得看一个对象他是不是垃圾,一般有两种方法: 引用计数法:如果对象被引用了,计数器+1,如果取消引用了就-1,计数器为零就可以回收了,简单除暴。但是他无法处理循环引用的问题。 可达性分析:对象A引用B,B引用C,C引用D会形成一个有向图。可达性分析会从根对象(gc root)出发遍历这个有向图,遍历不到的就是不可达对象,就是垃圾。 三色标记法:用于遍历标记判断的,用三种颜色去标记对象的状态。但是存在两个问题,一个是浮动垃圾,另一个是漏标的问题。 判断对象是垃圾之后,就需要使用垃圾回收算法去处理。基础的算法有三种: 标记清除算法:从gc roots 出发,去遍历标记所有可达性的对象,之后遍历堆去清除所有不可达的对象。缺点会产生内存碎片。 标记...
RocketMQ面试
如何保证消息的可靠性 生产者发送阶段:开启发送确认,失败了需要重试;核心业务可以落本地消息表或者事务消息,避免本地事务成功但是消息没有发送出去。 broker存储阶段:消息要持久化,关键的topic/队列配置副本高可用队列,刷盘策略和副本确认策略要和业务可靠性要求匹配。 消费者处理阶段:业务处理成功后再ACK或提交offset;处理失败要重试、斤死信队列或进入补偿流程。 业务兜底阶段:通过对账任务、补偿任务、警告和人工处理兜住极端异常。 不同的MQ的实现细节不同,但思路都一样:确认、持久化、重试、幂等、补偿。 如何处理重复消费幂等生产环境通常很难保证消息绝对只被消费一次,因此必须做幂等操作。幂等方案: 业务唯一索引 状态机 消费记录表 redis去重
Netty面试
Netty的ByteBuf与ByteBuffer相比的优势 灵活性和易用性:Java NIO的ByteBuffer虽然提供了对直接内存的支持,但其API相对较低级,使用起来相对繁琐。Netty的ByteBuf则是对Java NIO ByteBuffer的封装,并提供了更加灵活和易用的API,使得开发者可以更方便地操作数据,处理字节缓冲区。 可扩展性:Netty的ByteBuf是一个可扩展的缓冲区实现,它支持自动扩容和更高效的内存管理。在大量数据传输时,Netty的ByteBuf可以更好地处理动态增长和缩小,避免了频繁的内存复制和重新分配。 零拷贝优化:Netty的ByteBuf实现了”零拷贝”技术,即在数据传输时,可以避免将数据从一个缓冲区复制到另一个缓冲区,从而减少了数据在内存中的多次拷贝,提高了性能。 池化支持:Netty的ByteBuf支持内存池,可以通过池化的方式管理内存,降低内存分配和回收的开销,减少了垃圾回收的频率,从而提高了性能和效率。 内存释放:Netty的ByteBuf提供了更直观和安全的内存释放方式,开发者无需手动调用clear()或compact()等方法来...
Java基础面试
Java基础⭐包装类型常量池技术了解吗?常量池也叫缓存池,主要存储一些常用的数据。基本类型除开double和float浮点数太大了,没有常量池,其他都实现了。当发生自动装箱的时候,如果基本类型的值在缓存的范围内,则不会重新创建对象,而是复用缓存池中已经创建好的对象。 不同的包装类缓存的范围不同,也可以通过jvm参数上调。 原理: 装箱:调用的是XXX.valueOf()方法;在这个方法里面有缓存区间的代码。 拆箱:调用的是XXX.intValue()方法。 ⭐String、StringBuffer和StringBuilder的区别是什么?String为什么是不可变的? 可变性:String内部的value值是final修饰的,所以它是一个不可变的类。因此每次修改String的值的时候都会new一个新的对象。而StringBuffer和StringBuilder是可变的。 线程安全性: String由于它的不可变性,导致了它是一个线程安全的 StringBuffer也是线程安全的,因为它每个方法里面都使用了synchronized关键字 StringBuilder不是线程安...
并发面试
⭐乐观锁与悲观锁乐观锁与悲观锁的区别? 悲观锁:共享资源每次只给一个线程使用,其他线程阻塞,用完之后再把资源让给其他资源。但是读写锁可以多个线程同时读。 乐观锁:共享资源每次可以给多个线程使用,只是再提交修改的时候去验证资源是否被其他线程所修改。 使用场景: 悲观锁:适合写多读少的情况。 乐观锁:适合读多写少的情况。 缺陷: 悲观锁:高并发下,激烈的锁竞争会造成线程阻塞,大量的线程会导致系统上下文切换频繁,增加系统的性能开销;还有可能导致死锁。 乐观锁:高并发下,相比悲观锁来所,不存在锁竞争造成线程阻塞,也不会有死锁问题,性能往往更好。但是再写冲突高的场景下可能会导致ABA问题,性能忽高忽低等 CAS了解吗?原理是什么?乐观锁一般会使用版本号机制或者CAS算法实现,CAS算法使用会多一些。值得一提的是,这里的版本号机制和CAS算法中的ABA问题的解决方案是同一个东西。 CAS算法的思想很简单,就是用一个预期值和要更新的变量值进行比较,两个值相等才会进行更新。这里的比较和修改两个步骤再CPU硬件层面是一条原子指令,是不可拆分的,这也是CAS算法的基础。 比如Concur...
Tika入门
Tika官网:https://tika.apache.org/3.3.1/examples.html 引入依赖123456789101112<dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <version>3.2.3</version> <scope>compile</scope></dependency><dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-parsers-standard-package</artifactId> <version>3.2.3</version> <scope>compile</scope...
pgSql入门
初识PostgreSQLpgsql相比mysql而言,更加的标准和强大。对sql标准的支持度很高,在mysql中偷懒的写法在这里会报错;其次是pgsql的功能丰富,有很多扩展是按需加载的。像是ai需要使用的向量数据库,有现成的pgvecotr扩展可以直接使用就。 认识pgsqlPGvector 是一个为 PostgreSQL 设计的开源扩展,支持存储和检索机器学习生成的嵌入向量。它提供多种功能,让用户既能进行精确最近邻搜索,也能进行近似最近邻搜索。该扩展旨在与 PostgreSQL 的其他特性(包括索引和查询)无缝协作。 集成springboot在项目中添加 PgVectorStore 启动器依赖: 123456<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-vector-store-pgvector</artifactId> <version>2.0.0-M7</...
Spring开发中的问题
Spring Boot Configuration Annotation Processor not configured引入依赖: 123456<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional></dependency>







