<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[sdfsfaffs的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/sdfsfaffs</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; sdfsfaffs]]></copyright><item><title><![CDATA[Kafka 基础知识]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/157768616</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/157768616</guid><author>sdfsfaffs</author><pubDate>Mon, 02 Mar 2026 23:47:38 +0800</pubDate><description><![CDATA[kafka 是支持数据持久化、高吞吐、高可用的分布式发布-订阅消息队列，常用于 服务解耦、流量削峰、日志收集功能kafka 组成部分：1. 生产者(Producer)：向 Kafka 发送消息2. 消费者(Comsumer)：拉取 Kafka 指定 Topic 的消息3. 服务节点(Broke)： 处理生产者/消费者请求信息、存储数据4. 消费者组(Comsumer Group)：由多个消费者组成。]]></description><category></category></item><item><title><![CDATA[Netty 基础知识]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/157724380</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/157724380</guid><author>sdfsfaffs</author><pubDate>Thu, 05 Feb 2026 11:33:49 +0800</pubDate><description><![CDATA[Netty 是一个基于 NIO 高性能、异步事件驱动的网络框架，可快速开发 高可用、高并发、低延迟的服务端或客服端应用Netty 组件介绍：1. Channel(通道)：服务端与客服端数据传输连接通道2. EventLoop(事件循环)/EventLoopGroup：事件监听、读写 IO 数据操作3. ChannelPipeline(通道处理流)：数据处理流水线4. ChannelHandler(通道处理器)：处理网络/服务 数据编码、数据解码、业务逻辑等操作。]]></description><category></category></item><item><title><![CDATA[SQL decode() 函数]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/151222684</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/151222684</guid><author>sdfsfaffs</author><pubDate>Fri, 05 Sep 2025 15:55:30 +0800</pubDate><description><![CDATA[SQL中的DECODE()函数是一个条件表达式，主要用于多分支条件判断，语法为DECODE(表达式,值1,结果1,...,默认值)。它通过等值比较返回对应结果，类似于CASE WHEN但更简洁，但仅支持等值判断且在Oracle中更常见。示例展示了如何用DECODE()对学生分数评级，并比较了它与CASE WHEN的区别：DECODE适合简单判断，而CASE WHEN更灵活且跨数据库兼容。注意DECODE是Oracle特有函数，在其他数据库中应优先使用CASE WHEN。]]></description><category></category></item><item><title><![CDATA[SQL 常用 OVER() 窗口函数介绍]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/151221234</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/151221234</guid><author>sdfsfaffs</author><pubDate>Fri, 05 Sep 2025 15:40:53 +0800</pubDate><description><![CDATA[在上面的 sql 中，OVER()窗口函数核心语法是定义一个数据窗口，可以理解为定义组内其它数据与当前行处理逻辑，例如上面 sql 的逻辑是，同一个分组内从第一行开始将数据累加到当前行。注意：上面 sql 看似与GROUP BY处理相同，其实所有区别，窗口函数不会将多行数据合并为一行，而是在原有行的数据基础上为每行添加一个计算结果。OVER()在不减少原表行数的前提下，实现对 "相关数据组" 的灵活计算，特别适合需要同时展示明细数据和聚合分析结果的场景（如报表中的累计占比、排名、移动平均等）。]]></description><category></category></item><item><title><![CDATA[EasyExcel 基础用法]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/143107851</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/143107851</guid><author>sdfsfaffs</author><pubDate>Wed, 03 Sep 2025 17:19:58 +0800</pubDate><description><![CDATA[常用基础注解：        @ExcelProperty  注解 ， value 设置标题 ，index 设置标题排序 ，位置从 0 开始       @ContentStyle 注解，horizontalAlignment 设置风格       @ColumnWidth 注解，设置单元格的宽度        EasyExcel.write(文件路径 / 数据流(比如：response.getOutputStream()，new FileOutputStream() )).head(ExcelData.c]]></description><category></category></item><item><title><![CDATA[springboot + druid-spring-boot-starter + mysql 实现动态多数据源]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/142740016</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/142740016</guid><author>sdfsfaffs</author><pubDate>Mon, 07 Oct 2024 17:01:11 +0800</pubDate><description><![CDATA[*** 多数据源注解,可以在方法和类添加该注解*/// 数据源类型@Override// 公共key// 加密密码// 解密密码// 设置密码// 加密// 解密try{LOGGER.info("解密失败！{}",e);]]></description><category></category></item><item><title><![CDATA[Orecle 迁移 人大金仓数据库 SQL 问题]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/142713880</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/142713880</guid><author>sdfsfaffs</author><pubDate>Sun, 06 Oct 2024 11:35:25 +0800</pubDate><description><![CDATA[使用 oracle 项目一般使用，start with ... connect by 语法做菜单栏数据查询，该语法在人大金仓数据库提供的可视化工具中可以执行，但在Springboot + mybatis 项目中无法执行(版本2.X)，通过与人大金仓人员交涉，可以使用 with recursive.... as(... union ..) select ... where... 语法替代，该语法基础是如下：      假设有如下一张表(menu_table)：       我们可以使用一下 SQL查询出树状数]]></description><category></category></item><item><title><![CDATA[Oracle PL/SQL 基础知识]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/140990716</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/140990716</guid><author>sdfsfaffs</author><pubDate>Wed, 07 Aug 2024 15:42:20 +0800</pubDate><description><![CDATA[- 业务执行逻辑 ，dbms_output.put_line('holle!ELSEIF i == 1 THEN dbms_output.put_line('当前 i 等于 1！IF  i == 0  THEN  dbms_output.put_line('当前 i 等于 0！v_name  varchar2(20)  -- 声明 varchar2(20) 类型变量 v_name。dbms_output.put_line('i')  -- 打印 i 信息。v_name :=  '小明';]]></description><category></category></item><item><title><![CDATA[MQ(Rabbit MQ)基础知识]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136721755</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136721755</guid><author>sdfsfaffs</author><pubDate>Sat, 16 Mar 2024 16:31:04 +0800</pubDate><description><![CDATA[普通集群：多个服务共享 交换机、队列等元信息，但是不共享队列中存储的数据，而是其它服务保存指向存有真实数据队列的地址， 在保存或访问数据，访问节点中没有真实数据，会将信息转发到有真是信息的节点保存或获取数据，如果真实保存数据的节点宕机了，就无法保存获取数据了。消息消费者怎么知道去那个队列拿信息？死信队列：消息提供者在发布消息时设置消息存活时间，在存活时间内没有消费者消费该信息，则该信息为死信，如果当前队列没有绑定死信交换机该消息会被抛弃，绑定有死信交换机，该信息会被存放到死信队列中，被死信队列消费者消费。]]></description><category></category></item><item><title><![CDATA[分布式系统常见问题]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136692156</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136692156</guid><author>sdfsfaffs</author><pubDate>Thu, 14 Mar 2024 18:18:50 +0800</pubDate><description><![CDATA[事务管理者(TM)开启全局事务，然后调用分支事务(RM)向分布式事务协调者(TC)注册分支事务信息，分支事务执行完 SQL 语句后不提交事务，先向事务协调者报告当前事务的状态，事务协调者检查所有分支事务状态，如果都没有问题事务协调者通知所有分支事务提交数据结束全局事务，如果有一个分支事务状态异常，事务协调者通知所有分支事务回滚数据， XA 方案要求数据强一致性是 CP 架构。RM 分支事务资源管理者：管理分支事务与事务协调者交互，注册分支事务、提交分支事务状态、提交与回滚分支事务。]]></description><category></category></item><item><title><![CDATA[Spring Cloud 基础知识]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136681756</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136681756</guid><author>sdfsfaffs</author><pubDate>Wed, 13 Mar 2024 17:58:05 +0800</pubDate><description><![CDATA[服务熔断：需要在启动类加上 EnableCircuitBreaker 注解，针对整个服务如果大量请求处理会开启服务熔断，一段时间内不会再调用异常服务，等一段时间后再尝试调用异常服务，如果可以正常调用关闭服务熔断，不能正常服务继熔断。Hystrix 组件主要做服务保护，如果在服务的调用链路中有一个服务出现故障，可能导致调用该服务的其它服务功能不可用，如果有大量服务异常出现服务雪崩问题，可以使用 Hystrix 做服务降级或者服务熔断。Euraka 注册中心主要提供 服务注册、服务发现、服务心跳检测等功能，]]></description><category></category></item><item><title><![CDATA[Spring 框架基础知识]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136653301</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136653301</guid><author>sdfsfaffs</author><pubDate>Wed, 13 Mar 2024 13:17:55 +0800</pubDate><description><![CDATA[spring 框架中的 bean 默认是单例，如果当前 bean 是一个无状态对象是线程安全，如果当前 bean 不是无状态对象不是线程安全的，可以根据当前对象中是否有共享属性，判断当前对象是否为无状态对象，无共享属性为无状态对象，如果不是无状态对象可以使用 Scope 注解，设置为 多例 或者 使用锁 解决线程安全问题。2. 同一个类中，一个为加事务注解的方法中调用添加事务注解的方法，导致事务注解失效，因为同一个类两个方法互相调用不走代理类，无法开启事务。]]></description><category></category></item><item><title><![CDATA[Redis 集群基础知识]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136635901</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136635901</guid><author>sdfsfaffs</author><pubDate>Tue, 12 Mar 2024 15:09:39 +0800</pubDate><description><![CDATA[分片集群虽然解决了海量数据读写问题，也引出了新的问题，比如再写数据时发现某个主节点故障，导致某一个区间的数据无法保存，这时需要一个监控机制 帮助集群故障恢复，目前主流解决方案，让每个主节点相互监测，当多个主节点发现某个主节点，在一段时间内没有发送心跳信息就将其标注为故障，如果有一半以上的主节点将其标注，客观认为该主机点已经故障，便从故障主从集群中投票选举一个从节点作为新的主节点，同时通知其它机器新主节点的信息。1. 从节点向主节点发送同步数据请求，并发送主节点的 run id 和 offset 信息。]]></description><category></category></item><item><title><![CDATA[Redis 基础知识：]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136609148</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136609148</guid><author>sdfsfaffs</author><pubDate>Mon, 11 Mar 2024 18:06:31 +0800</pubDate><description><![CDATA[rdb 方式：当执行 save 或者 bgsave 指令时，redis 会记录当前时刻内存缓存的数据快照并将数据写入到文件后缀为 rdb 的文件中，如果使用的是 save 指令持久化数据会导致阻塞，因为它使用 redis 主线程做数据持久化，如果使用 bgsave 指令持久化数据会开启子线程，由子线程做数据持久化，当子线程持久化数据时，主线程会复制一份完成的数据，后续主线程处理新的请求修改缓存数据，但是只修改新副本中的数据，aof 保存指令信息持久化数据，文件体积大，服务宕机数据恢复慢，数据完整度高。]]></description><category></category></item><item><title><![CDATA[Mybatis 基础知识]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136590343</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136590343</guid><author>sdfsfaffs</author><pubDate>Sun, 10 Mar 2024 17:39:42 +0800</pubDate><description><![CDATA[mybatis 二级缓存是 namespace 命名空间缓存，需要手动开启在配置文件中添加 Cache Enable 信息并且在 Mapper 文件中添加缓存标签<Cache /> 才会开启，二级缓存也是本地缓存，如果在同一个 namespace 命名空间先执行相同的 sql 语句，第一次会去数据库中查询数据，后续几次直接获取本地缓存数据，但是在同一个 namespace 命名空间下做过一次 增删改操作，会清空当前命名空间下的所有缓存信息。]]></description><category></category></item><item><title><![CDATA[MySQL 基础知识]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136491048</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136491048</guid><author>sdfsfaffs</author><pubDate>Fri, 08 Mar 2024 23:35:35 +0800</pubDate><description><![CDATA[在介绍 undo log 与 redo log 前先介绍一下 缓存池（buffer pool、数据页 （data page）缓存池：在执行语句时，会先去寻找当前要操作的数据是否在缓存池中，如果缓存池中没有，先将磁盘中的数据加载到缓存池中，然后在操作缓存池中的数据数据页： innodb 存储引擎在磁盘中管理数据最小单位，数据一行一行的保存在数据页中。]]></description><category></category></item><item><title><![CDATA[Java 集合基础知识]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136473346</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136473346</guid><author>sdfsfaffs</author><pubDate>Tue, 05 Mar 2024 21:43:44 +0800</pubDate><description><![CDATA[4. 先判断当前下标中是否存在数据 ，存在数据且两个数据 key 不相同，判断当前数组中对象类型是否属于红黑树节点类型，如果是红黑树节点类型，根据 hash 值查找红黑树中是否有存在 key 相同的节点并覆盖旧数据，没有key相同的接口创建一个新的节点添加到红黑树中，如果不是红黑树节点类型，遍历链表比较 key 数据，找到 key 相同节点覆盖旧数据，否则创建一个新的节点放到链表中。4.2 用最小容量与当前数组最大容量比较，如果大于当前数据容量，依挡墙容量的1.5倍进行扩容并进行数组拷贝。]]></description><category></category></item><item><title><![CDATA[线程 ThreadLocal 对象]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136454061</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136454061</guid><author>sdfsfaffs</author><pubDate>Mon, 04 Mar 2024 17:27:35 +0800</pubDate><description><![CDATA[如果当前线程没有 ThreadLocalMap 对象(当前线程ThreadLocalMap 对应的属性值为null)，会创建一个 ThreadLocalMap 对象并将ThreadLocal 对象与要存储的数据当作Key 和 Value 放入Entity 对象，然后在存放进Entity数组中，以ThreadLocal对象计算出数据在数组中下标。set 方法：存数据前先获取当前线程对象，然后用线程对象获取 ThreadLocalMap 对象，补充：java 对象的四种引用类型：强、软、弱、虚。]]></description><category></category></item><item><title><![CDATA[线程池基础知识]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136437531</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136437531</guid><author>sdfsfaffs</author><pubDate>Mon, 04 Mar 2024 12:25:33 +0800</pubDate><description><![CDATA[新的任务进来时会先判断核心线程是否空闲，如果空闲直接处理任务，不空闲判断一下工作队列是否装满，没有装满将新的任务添加到工作队列中，如果工作队列已经满了，判断是否有临时线程，有临时线程让临时线程处理任务，没有临时线程走拒绝策略。创建线程需要一定的内存空间，无限的创建线程非常浪费内存资源且CPU 一次只能处理一个线程任务，大量的线程挂起唤醒线程之间的切换会导致性能变差，所以一般使用线程池管理线程。3.newSingleThreadPool() 单线程池，线程池只有一个线程，核心线程数与最大线程数都是1。]]></description><category></category></item><item><title><![CDATA[Java 常用锁介绍]]></title><link>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136424661</link><guid>https://blog.youkuaiyun.com/sdfsfaffs/article/details/136424661</guid><author>sdfsfaffs</author><pubDate>Sun, 03 Mar 2024 20:23:20 +0800</pubDate><description><![CDATA[AQS (AbstractQueuedSynchronized) 是抽象队列同步器，它是构建锁的基础框架，常见的 ReentrantLock 锁、CountDownLatch 计数器都以AQS为基础框架，AQS 架构中有一个 Volatle 修饰的变量 state 用于记录锁的状态，如果有线程修改 state 值为 1，成功获取到所资源，其它线程尝试修改失败，会等待并存放到队列中等待锁的释放。AQS 与 Synchronized 比较。]]></description><category></category></item></channel></rss>