- 博客(53)
- 收藏
- 关注
原创 # Android 例题套卷(二)//claude code生成
文字大小的推荐单位是 ____________,布局宽高的推荐单位是 ____________。
2026-06-24 09:58:03
160
原创 安卓期末复习
类作用Handler消息处理器,负责发送 Message 到 MessageQueue和在目标线程中处理 MessageMessage消息载体,包含what(int 标识)、arg1/arg2(int 参数)、obj(Object 数据)消息队列,以单链表存储 Message,按时间排序Looper消息循环器,不断从 MessageQueue 中取 Message 分发给对应 Handler。
2026-06-24 09:52:51
209
原创 RabbitMQ
对于高并发场景,可以通过多队列策略,格局业务Key(如订单)哈希后路由到不同队列,每个队列由独立的但消费者消费,从而实现部分有序并提升并发能力。:关闭自动ACK,必须在业务真正执行完再给Broker发送ACK,防止处理到一半消费者宕机,如果消费者持续处理失败,消息队列会自动重试失败,重试多次还是失败的消息会被扔到私信队列,方便事后排查,避免消息丢失(kafka需要自行实现死信队列)然后必须交换机持久化,队列持久化,消息持久化,三者缺一不可。AMQP核心组件:生产者,消费者,交换机,队列,绑定,虚拟主机。
2026-06-21 01:37:47
287
原创 redis
MOVED重定向表示这个槽永久性地属于另一个节点,客户端应更新本地槽映射并以后直接目标节点。而ASK重定向表示这个槽正在迁移中,数据可能在源节点也可能在目标节点,这次去目标节点问一下,但不用更新本地缓存MOVED错误:比如客户端要找的key不在这个节点上,这个节点就会返回一个MOVED错误,里面带着相应节点的ip和端口ASK的ASKING请求:因为迁移还没完成,目标节点理论上还没正式接管这个槽,相当于时一个临时授权,如果不发的话,目标节点可能会拒绝管理平衡的核心是按数据分级数据等级命中率要求。
2026-06-21 01:21:33
263
原创 Spring AI
RAG就像给ai装了大脑,让它回答问题的时候先从外部知识库(如文档,数据库)检索相关片段,再把这些片段作为上下文输入给模型,这样ai的回答就基于真实,最新数据。重排序是指在初步检索出一批候选文档后,使用一个更加精细,专精于相关性判断的的模型,重新评估每个文档与查询之间的匹配程度,并按新得分重新排序。[ ETL ] ← 提取+清洗+标准化 (Extract → Transform → Load)[ Embedding ] ← 向量化 (问题 → 查询向量)[ LLM ] ← 增强生成 (基于检索上下文)
2026-05-13 16:26:50
433
原创 微服务基础
配置中心是一个用于集中化管理配置,并支持配置动态更新和发布的工具或服务,当配置发生变化时自动通知各个服务实例进行更新,并且无需重启即可生效。熔断:触发:下游服务故障;目的:防止故障(订单服务调库存服务,库存挂了就熔断)降级:触发:系统压力过大;目的:保核心功能(大促时关闭商品评价功能,保下单链路)限流:触发:请求量超出系统承载能力;目的:防宕机(QPS限制到一万,超过直接拒绝)
2026-05-11 20:16:18
327
原创 ThreadLocal和CompletableFuture
底层数据结构:ThreadLocal的数据存在Thread对象里,每个Thread都有一个threadLocals字段,它的类型是ThreadLocalMap,这个map的key是ThreadLocal对象本身,value是你存的值!如果想要第一个成功的结果,得自己写逻辑,用一个 CompletableFuture 作为结果容器,每个任务完成时调 complete,因为 complete 只有第一次调用生效,后面的会被忽略。老版的Future是用来拿到另一个线程里的任务的执行结果,相当于是一个凭证,
2026-05-09 11:44:04
408
原创 Spring 相关
AspectJ是功能更强大的AOP框架,支持字段、构造器、初始化等多粒度织入,可在编译期织入,性能更好,但配置复杂,需要专用编译器或织入器。当Bean实例化完成之后,先把这个工厂放到三级缓存,而不立即产生代理,是根据后续是否出现循环依赖来触发工厂,这时候工厂才会把这个Bean代理的对象给别的用。AOP主要是通过代理机制实现的。二级缓存能够解决循环依赖问题,三级则是通过存储一个工厂实现延迟加载,只有真正发生循环依赖的时候才触发代理创建,没有循环依赖则这个工厂不会被调用,相当于是提前暴露,提前判断,延迟加载。
2026-05-07 19:48:15
394
原创 redis常见问题
MOVED重定向表示这个槽永久性地属于另一个节点,客户端应更新本地槽映射并以后直接目标节点。而ASK重定向表示这个槽正在迁移中,数据可能在源节点也可能在目标节点,这次去目标节点问一下,但不用更新本地缓存MOVED错误:比如客户端要找的key不在这个节点上,这个节点就会返回一个MOVED错误,里面带着相应节点的ip和端口ASK的ASKING请求:因为迁移还没完成,目标节点理论上还没正式接管这个槽,相当于时一个临时授权,如果不发的话,目标节点可能会拒绝管理。
2026-04-20 20:50:21
311
原创 juc相关
JAVA内存模型,是用来描述多线程之间内存访问规则和行为的规范,它定义了线程如何与内存交互,如何保证多线程环境下的可见性,有序性,和原子性,硬件和编译器优化等问题。而LongAdder的思路时把热点分散,内部维护一个base和多个cell,最后求和的时候把base和所有的cell值加起来,扩容上限=cpu核心数。共享内存是最直接的方式,volatile能保证可见性,synchonized和lock能同时解决可见性,原子性,有序性。AtomicLong所有的线程都在枪一个变量,并发上来就疯狂自旋。
2026-04-20 20:06:28
374
原创 CMS和G1
它不再像传统GC把堆划分为连续的新生代,老年代,而是切成几百上千个大小相等的小格子,没有物理上的分界,Eden、Survivor、老年代都是 Region 的逻辑集合,数量可以动态调整.并且它是全堆管理,每次GC时它会优先记录每个Region的垃圾比例,每次GC时它挑选垃圾最多的几个Region优先回收。CMS的核心思想就是用并发换停顿时间,7个阶段只有两个需要STW,其他都是和应用线程一起跑,代价是cpu占用高,有内存碎片,可能并发失败。分为两大块:并发标记和对象拷贝。优点:低停顿,响应快。
2026-04-20 20:01:27
269
原创 复习MySQL
聚簇索引:数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个非聚簇索引(二级索引):数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个通过二级索引找到对应的主键值,然后到聚簇索引中查找整行数据,这个过程就是回表覆盖索引是指二级索引中已经包含了查询需要的所有字段,查询时直接从索引里拿数据,不用再回表原本server层干的话交给了引擎层干这叫”下推“,索引下推是针对联合索引的,它是在存储引擎层根据索引条件先进性过滤,再进行回表,来减少回表次数。
2026-03-13 23:17:37
556
原创 深入了解JVM
线程分配时优先从子的TLAB拿内存,不够的话从Eden区申请新的,如果对象太大就直接在Eden区装配,绕过TLAB。因为根据统计新生代中的90%以上的对象活不过第一次GC,意味着每次Minor GC只需要预留10%给存活对象就够了,这个比例就是在空间利用率和晋升老年代的风险之间取得平衡,可以通过。比如生了8字节,但下一个对象要16字节,这时候得申请新的TLAB,那老的TLAB里的8字节就浪费了。新对象优先在Eden区分配,满了就会触发Minor GC,存活的放到幸存区,两个幸存区轮流用。
2026-03-13 23:12:18
266
原创 计算机网络
HTTP 1.0到1.1的核心升级:解决连接成本问题,使用长连接,同一个TCP连接可以复用。在建立TCP连接时,需要通过三次握手来建立。在断开TCP连接时,需要通过四次挥手来断开。HTTP 1.1到2.0的升级。
2026-03-13 23:09:28
395
原创 CAS和AQS相关问题
底层基于ReentrantLock + Condition实现,内部有一个count计数器和一个generation代,线程调用await()时获取锁,然后计数器-1,计数器不为0则会阻塞当前线程,如果减为0,说明最后一个线程到达,先执行barrierAction进行回调,再执行condition.signalALL()唤醒所有线程,然后重置计数器,更新generation开启下一轮。线程调用acquire(),如果许可数大于0,计数器-1,线程继续执行,如果许可数等于0,则线程则会阻塞等待。
2026-02-25 22:17:46
645
原创 ConcurrentHashMap
Node节点的value属性和next属性使用volatile修饰,保证修改value和新增节点时的对其他线程可见性使用table数组作为synchronized的锁来保证写操作的安全当头节点为null时,使用CAS操作来保证数据锁能正确的写入。
2026-02-25 22:09:55
499
原创 多线程复习doge
单例模式(线程安全的)饿汉创建的时间比较早,是在类加载的时候就创建出来了懒汉创建的时间比较迟,是在首次使用的时候才创建的通常情况下使用懒汉,效率高但是有线程安全问题。
2026-02-09 21:52:10
299
原创 集合复习doge
回答:主要原因是 CPU 缓存的影响。ArrayList 的数据在内存里是连续存放的,访问时缓存命中率高,搬运数据用的 System.arraycopy 也是高度优化的原生方法。LinkedList 虽然插入本身是 O(1),但首先得定位到插入位置,这个遍历过程是 O(n),而且每访问一个节点就可能触发一次缓存缺失。实测在中间位置插入大量数据,ArrayList 往往比 LinkedList 更快。只有在头部频繁插入删除时,LinkedList 才有优势。
2026-02-09 21:48:47
822
原创 基础复习doge
布隆过滤器的原理是用bit数组+多哈希实现的一种概率性数据结构,用来快速判断一个元素是不是在集合中。而查询元素时,同样经过哈希得到多个位置,只要有一个位置是0,元素一定没有在,全是1也未必在,存在一定误判率,但不会放过不存在的数。String 是不可变的,底层的 char 数组被 final 修饰,一旦创建就定死在那了。零拷贝指的是应用程序在需要把内核中的一块区域数据转移到另一块区域时,不需要先复制到用户空间再转移到目标内核区域去了,而是直接实现转移。在建立TCP连接时,需要通过三次握手来建立。
2026-02-09 21:46:08
345
原创 MySQL复习
控制,该参数是唯一核心,取值为0/1/2,生产环境禁止0,生产首选 1(默认),普通库可选 2,性能比1显著提升,避免了每次fsyn()开销,在安全上无数据丢失,最多丢失1秒内的已提交事务。第一,隐藏字段,里面有事务id,来记录每一次操作的事务id,还有回滚指针,指向这一个记录的上个版本。会的,MVCC的多版本留存是表膨胀的根本诱因,在高更新/高删除的场景下,大量过期版本未被及时清除。是重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的。不同的隔离级别的快照读是不一样的,最终的访问结果不一样。
2026-01-28 20:39:23
667
原创 redis哨兵和缓存
当A判定B为PFAIL后,和其他节点进行沟通,当数目超过总集群个数的一半,那么B就被彻底判定为故障节点了。实时生成才涉及,redis服务器首次介入之后,服务器里是没有数据的,此时所有的请求都打给mysql,通过独立的进程进行的,不负责储存数据,只是对其他的redis-server进程起到监控的效果。查询的某个key,在redis中没有,mysql也没有,这个key也不会被更新到redis中。如果redis中查到了,就直接返回;先通过离线的方式,通过一些统计的途径,先把热点数据找到一批,导入到redis中。
2026-01-25 21:51:35
706
原创 redis事务和主从模式
由于从节点的数据都是时刻和主节点保持一致的,因此其他客户端从从节点这里读取数据和从节点读取数据没有去别的,后续有客户端来读取数据就可以从上述节点随机挑一个节点来提供读取数据服务。主从节点在建立复制连接后,主节点会把自己收到的修改操作,通过tcp长连接的方式,源源不断的传输给从节点,从节点就会根据这些请求来同时修改自身的数据,从而保持和主节点数据的一致性。本来,在主节点保存一堆数据,引入从节点之后就是要把从节点上面的数据复制出来,放到从节点,后续主节点这边对于数据有任何修改都会把这样的修改给同步到从节点上。
2026-01-25 21:47:00
794
原创 redis持久化
按照aof的方式,每一个请求/操作都记录入文件,在触发aof重写之后,就把当前内存的状态按照rdb的二进制格式写入新的aof文件中,后续再进行的草早,仍然是按照aof文本的方式追加文件后面。硬盘上顺序读写数据的是比较快的,随机访问则速度很慢,AOF是每次把新的操作写入原有文件的末尾,属于顺序写入。子进程只需要内存中的当前数据获取出来,以AOF的格式写入到一个新的AOF文件中。这个复制出来的克隆体(子进程)的内存中的数据就是和“本体”一样的。硬盘的数据只是在redis重启的时候用来回复内存中的数据的。
2026-01-24 12:08:12
762
原创 多线程复习
针对扩容操作做出了单独的优化,原本HashMap扩容时需要把所有的元素都拷贝一遍,而ConcunrrentHashMap则是把扩容中一次搬运操作分成多次,每次只搬运一部分数据,避免这单次操作过于卡顿。充分利用了CAS特性,把一些不必要加锁的环节给省略加锁了,比如需要用变量记录hash表中的元素个数,此时就可以使用原子操作(CAS)修改元素个数。将连续多次对同一个对象加锁、解锁的操作,合并为一次范围更大的加锁操作,从而减少锁的获取和释放次数,提升性能。
2026-01-21 20:13:54
427
原创 多线程复习
而实际情况下无法知道一个代码这两类的占比是多少,因此需要根据代码的实际场景,通过实验的方式对程序进行性能测试,测试中不断修改线程数目,看哪种情况下符合要求。如果M和A的值相同,就把M和B的值进行交换,交换的本质是为了把B的值赋给A,主要参数:核心线程数,最大线程数,空闲存活时间,工作队列,拒绝策略。CAS(M,A,B)其实是一个cpu指令,是原子性的。饿汉创建的时间比较早,是在类加载的时候就创建出来了。懒汉创建的时间比较迟,是在首次使用的时候才创建的。这是锁的一种特性,是一类锁,不是具体的锁。
2026-01-19 19:29:03
260
原创 redis数据结构
如果有两个客户端并发的发起请求,redis服务器就会串行/顺序的执行这多个命令。redis能够使用单线程模型很好的工作的原因在于它的逻辑性都是短平快,不太消耗cpu资源也不太消耗多核。Redis中的字符串直接就是按照二进制数据的方式存储,存的是啥,取得就是啥。弊端:redis要特别小心,避免某个操作时间长,阻塞了其他命令的执行。同一个数据类型,背后可能的编码实现是不同的,会根据特定场景优化。redis的key都是字符串,但value的类型是存在差异的。数据结构:redis承诺给你的,也可以理解成数据类型。
2026-01-13 23:36:53
507
原创 redis通用命令
一个redis中可能同时存在很多很多的key,这些key中很大部分都有过期时间,此时的redis服务器咋知道哪些key已经过期要被删除,哪些key还没过期?虽然有了上述两种策略,但整体效果一般, 仍然可能会有很多过期的key被残留,没有及时删除掉,redis对上述进行补充还提供了一系列的==内存淘汰策略。把时间划分成很多小段,每个小段都挂着一个链表,每个链表都代表一个要执行的任务。引入redis的缺点是会更慢,但是有了redis之后就可以把数据单独存储,redis的key的过期策略是怎么实现的?
2026-01-10 02:13:06
855
原创 JVM的类加载和垃圾回收
也就是把“符号引用”(文件偏移量)替换成“直接引用 ”(内存地址),因为在文件中不涉及到内存地址,因此初始化的语句会被设置为一个”文件的偏移量“,通过偏移量就能找到这个字符串所在的位置。而这里的可达性分析都是周期性进行的,当前某个对象是否是垃圾,是随着代码的执行会发生改变的。//这里只是分配内存空间,还没有初始化呢,此时这个空间上的内存的数值就是全0的。有一组线程周期性的扫描我们代码中所有的对象出发,尽可能的进行访问的遍历,复制算法:通过复制的方式,把有效的对象归类在一起,再统一释放剩下的空间。
2026-01-08 17:58:32
923
原创 JVM 内存区域划分
虚拟机栈和程序计数器都是每个线程都有一份,JVM进程中有10个线程就会有10个虚拟机栈,也会有10个程序计数器(每个线程各自有一个),堆和元数据区只有一份。如果是顺序执行的代码下一条代码就是指令地址递增,而如果是循环/条件代码,下一条就可能跳转到一个比较远的位置。栈帧里就包含了方法的入口,方法返回的位置,方法的形参,方法的返回值,局部变量。常见误点:t这个变量是一个引用类型的变量,存的是对象的地址,不是对象本身。随着一条一条的指令的执行,程序计数器的值都会自动更新去指向下一条指令。
2026-01-07 14:32:26
294
原创 上传图片功能
UUID.randomUUID():生成全球唯一的 32 位标识符(含横线),避免多用户上传同名文件时覆盖原有文件,是文件重命名的常用方案(也可使用时间戳 + 随机数)。mkdirs():能创建多级目录(如 D:/upload/pics/2026/01),即使上级目录不存在,也会递归创建所有不存在的目录,是文件上传场景的首选。mkdir():仅能创建单级目录(如 D:/upload),若上级目录(如 D:/upload)不存在,创建失败;
2026-01-05 21:30:58
193
原创 加密和解密
HASH加密:不可逆 MD5,SHA26。将指定的类型转化为存放在数据库支持的类型。例如:手机号-自动的进行加密-存放数据库。对称加密:AES,3ES (密钥)明文–>>HASH–>>加密结果。明文+密钥–>>加密结果。加盐HASH 盐:随机数。
2026-01-01 22:33:12
275
原创 Spring AOP
• @AfterReturning:返回后通知,此注解标注的通知⽅法在⽬标⽅法后被执⾏,有异常不会执⾏。• 代码⽆侵⼊:不修改原始的业务⽅法,就可以对原始的业务⽅法进⾏了功能的增强或者是功能的改变。• @After:后置通知,此注解标注的通知⽅法在⽬标⽅法后被执⾏,⽆论是否有异常都会执⾏。• @Around:环绕通知,此注解标注的通知⽅法在⽬标⽅法前,后都被执⾏。• @Before:前置通知,此注解标注的通知⽅法在⽬标⽅法前被执⾏。@Aspect // 声明这个类是一个切面。AOP 面向切面编程。
2025-11-18 20:32:16
246
原创 配置文件&&层级调用
SpringBoot支持三种配置文件tomcat是一个web服务器,用来启动发布web项目Springboot把tomcat进行了集成、properties语法:server.port:改端口号用配置来写参数这样避免数字写死,便于更改声明一个对象,然后用spring提供的@Value(" { }")来连接yml语法:@ConfigurationProperties来给对象赋值,从配置文件中来读取对象缺点:不适合复杂的配置文件(yml/properties)↓。
2025-11-02 19:52:50
775
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
2