自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 收藏
  • 关注

原创 设计模式-桥接模式

这是变化的第二个维度:形状。注意,Shape 类中包含了一个 Color 引用,这就是桥梁。// Abstraction: 形状抽象类// 关键!这就是桥梁,将Shape和Color连接起来​​// 抽象方法,由子类实现这些是具体的形状,它们继承 Shape 并使用 color 引用来完成自己的功能。// RefinedAbstraction: 圆形// 调用父类构造函数,把“桥”搭好​@Override。

2025-06-19 19:27:07 614

原创 设计模式-桥接模式

这是变化的第二个维度:形状。注意,Shape 类中包含了一个 Color 引用,这就是桥梁。// Abstraction: 形状抽象类// 关键!这就是桥梁,将Shape和Color连接起来​​// 抽象方法,由子类实现这些是具体的形状,它们继承 Shape 并使用 color 引用来完成自己的功能。// RefinedAbstraction: 圆形// 调用父类构造函数,把“桥”搭好​@Override。

2025-06-19 19:25:35 669

原创 设计模式-单例模式

定义:单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。通俗比喻:一个国家只能有一个皇帝或总统。无论你(程序中的任何部分)在何时何地需要和这位最高领导人沟通,你找到的都是同一个人。单例模式就是为了在整个软件系统中创建这位唯一的“皇帝”。核心要点私有化构造函数:为了防止外部通过 new 关键字随意创建实例,必须将构造函数声明为 private。持有静态实例:在类的内部创建一个静态的、属于类本身的实例变量。提供公共静态方法。

2025-06-19 19:25:02 969

原创 设计模式-迭代器模式

第1步:定义 Iterator 和 Aggregate 接口// Iterator 接口E next();​// Aggregate 接口第2步:创建具体聚合类 (ConcreteAggregate)// 具体的集合:书架// 当前书的数量​​​last++;​​// 核心:返回一个为 BookShelf 服务的迭代器实例@Override第3步:创建具体迭代器类 (ConcreteIterator)// 为 BookShelf 服务的具体迭代器​。

2025-06-11 20:10:31 1147

原创 设计模式-组合模式

/ Component: 定义了所有节点(文件和文件夹)的通用行为// 获取大小// 打印结构。

2025-06-11 20:09:48 884

原创 设计模式-备忘录模式

想象一下你在玩一个有存档功能的游戏。当你觉得当前进度不错,或者要进行一个有风险的操作前,你会选择“存档”。这个“存档”就保存了你当前游戏的所有状态(比如角色位置、等级、物品栏等)。如果后续操作失败或者你想回到之前的状态,你就可以“读档”,恢复到存档时的状态。

2025-06-10 19:12:31 1273

原创 设计模式-适配器模式

想象一下,你有一个欧标的电器插头(比如两孔圆形),但你家的插座是美标的(比如两孔扁平或三孔)。你不能直接把欧标插头插到美标插座里。这时候你需要一个“转换插头”或“适配器”,这个转换插头一端可以接欧标插头,另一端可以插到美标插座上。

2025-06-10 19:11:58 949

原创 设计模式-状态模式

当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变行为时,通常会在对象内部使用大量的条件语句(if/else 或 switch)。当 Context 对象的状态改变时,它会改变其持有的状态对象的引用。状态模式使得我们可以很容易地添加新的状态(比如 ArchivedState 归档状态)而不需要修改 DocumentContext 类,只需要创建新的状态类并调整状态转换即可。:增加一个新的状态只需要增加一个新的具体状态类,并修改相关的状态转换逻辑,符合开闭原则(对扩展开放,对修改关闭)。

2025-06-09 20:47:33 956

原创 设计模式-抽象工厂模式

定义产品族中每种产品的接口。Java: 通常是 interface。例子:interface Button, interface Checkbox。

2025-06-09 20:47:03 2481

原创 设计模式-观察着模式

观察者模式是一种实现对象间解耦的有效方式,使得当一个对象的状态改变时,能够自动通知依赖于它的其他对象。它在许多应用场景中都非常有用,尤其是在需要事件驱动或数据绑定机制时。理解其核心思想和优缺点,可以帮助你更好地设计和构建灵活、可维护的系统。

2025-06-07 15:17:06 1008

原创 设计模式-建造者模式

建造者模式是一种强大的创建型模式,特别适用于构建具有多个组成部分、配置复杂或有多个可选参数的对象。它通过将构建逻辑与对象表示分离,提高了代码的封装性、可读性和可扩展性。链式调用的变体使得对象的创建过程更加流畅和易于理解。

2025-06-07 15:16:22 733

原创 设计模式-外观模式

客户端只与 Facade 对象交互(直接朋友),而不需要了解 Facade 内部所依赖的子系统(朋友的朋友)。:当需要为子系统增加新的功能时,可能需要修改 Facade 类的源代码,这违反了开闭原则(对扩展开放,对修改关闭)。:Facade 只是提供了一个简化的接口,如果客户端需要更底层的、更灵活的控制,它仍然可以直接访问子系统类(如果子系统类是可见的)。Facade 并不阻止这种直接访问。总而言之,外观模式是一个非常有用的模式,当你想要简化复杂系统的使用,或者隔离变化时,它是一个值得考虑的选择。

2025-06-04 21:30:14 1597

原创 设计模式-迪米特法则

迪米特法则是指导我们设计低耦合、高内聚系统的一个重要原则。它的核心思想是限制对象之间的知识,让每个对象只与它的直接朋友交互。通过封装和委托,我们可以有效地应用迪米特法则,从而创建出更易于维护、扩展和理解的软件系统。但同时也要注意避免过度设计,找到一个合适的平衡点。

2025-06-04 21:29:34 1055

原创 设计模式-模板方法模式

模板方法模式是一种。

2025-06-03 20:59:42 728

原创 设计模式-原型模式

原型模式是一种创建型设计模式,它允许你。

2025-06-03 20:59:06 949

原创 设计模式-工厂方法模式

工厂方法模式定义了一个创建对象的接口(工厂方法),但由子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类。

2025-05-29 22:00:04 2045

原创 设计模式-代理模式

代理模式是一种结构型设计模式,它允许你提供一个实际对象的。

2025-05-29 21:59:16 1501

原创 设计模式-装饰模式

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。现在顾客可以要求加牛奶 (Milk)、摩卡 (Mocha)、豆浆 (Soy)、奶泡 (Whip) 等调料。如果需要添加功能,客户端将这个 ConcreteComponent 对象传递给一个 ConcreteDecorator 对象的构造函数,创建一个装饰后的对象。如果被装饰对象的接口很庞大,那么装饰器的实现也会变得复杂。// 通常,getDescription() 在抽象装饰器中可能是抽象的,或者直接委托。

2025-05-28 22:38:31 872

原创 设计模式-依赖倒转原则

通常指接口 (Interface) 或抽象类 (Abstract Class)。

2025-05-28 22:37:48 1099

原创 设计模式-开放封闭原则

开放封闭原则是 SOLID 原则中的第二个字母 "O",由伯特兰·迈耶 (Bertrand Meyer) 在其著作《面向对象软件构造》中提出。

2025-05-27 21:31:11 864

原创 设计模式-单一职责原则

单一职责原则是面向对象设计(OOD)中 SOLID 原则的第一个字母 "S"。

2025-05-27 21:30:32 1409

原创 设计模式-策略模式

策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户端而变化。

2025-05-26 21:03:12 850

原创 设计模式-简单工厂模式

简单工厂模式是一种创建型设计模式,它不属于 GoF(四人帮)的 23 种经典设计模式,但通常被认为是工厂方法模式的一种特殊实现或简化版本。

2025-05-26 21:02:41 2718

原创 TTL和死信交换机实现延迟队列

这使得精确的按消息延迟变得困难。这就是为什么 RabbitMQ 后来推出了 rabbitmq_delayed_message_exchange 插件,它专门用于实现延迟队列,避免了上述 TTL 模拟方式的缺陷,能够精确地按照消息指定的延迟时间进行投递,且消息在延迟期间对消费者不可见。(如 RocketMQ 支持的,或 RabbitMQ 插件提供的) 会更直接和高效地实现“消息在未来某个时间点才可被消费”的需求,并且在延迟期间消息对消费者是不可见的。当你发送一个希望延迟处理的消息时,你将它发送到队列 A。

2025-05-25 21:16:39 536

原创 消息队列的使用

在支付、交易、登录等关键操作发生时,需要实时分析用户行为、交易模式等,快速识别潜在的风险或欺诈行为,并在毫秒级内做出决策(如阻止交易、要求额外验证)。需要在大量数据涌入时,以极低的延迟进行匹配和分析。削峰:生产者的速度非常的高,并发流量非常的大,此时可以增加消费者线程,提高并发处理能力,来达到生产和消费的平衡。解耦:减少依赖,生产者和消费者之间没有直接的依赖,一个系统的故障不会影响另一个系统,保证系统的稳定性和健壮性。填谷:生产的频率降低,流量变小,此时可以减少一些消费者线程,来达到生产和消费的平衡。

2025-05-25 21:15:26 1103

原创 disryptor和rabbitmq

用于在。

2025-05-19 21:54:38 1178

原创 Redis的缓存三兄弟,管道技术,内存淘汰策略以及多种线程模型

在系统对外提供服务之前,就把数据预先加载到Redis中,优化用户的请求不去访问数据库(使用异步线程或者定时job,定时的将数据库中的数据加载到Redis中)对一个key设置了过期时间时,Redis会把该key带上过期时间存储到一个过期字典中,字典保存了数据库中所有key的过期时间。事务提供了一种“将多个命令打包,然后一次性,按顺序地执行”的执行的机制,并且事务在执行的期间不会主动中断。发送的命令数量不会被限制,命令的最大的存储体积为1G,当命令超过限制,命令就不会执行了。

2025-05-19 21:53:26 801

原创 本地缓存的三种实现

当窗口中的条目要进入主区域,或者有新条目要替换主区域中的条目时,Caffeine 会使用 TinyLfu 估算的频率信息来决定是否“录取”这个条目进入主区域,以及淘汰主区域中的哪个条目。这是一种近似的 LFU (Least Frequently Used,最不常用) 算法,它通过一个紧凑的数据结构(如 Count-Min Sketch)来。Caffeine 将缓存分为一个小的“窗口”区域和一个大的“主”区域。Caffeine 使用的缓存淘汰算法比 Guava 的 LRU 更先进、更复杂和高效。

2025-05-13 21:21:26 422

原创 binlog日志以及MySQL的数据同步

给每一个从库,都需要有单独的线程来处理,数据传输多份就要消耗更多的带宽,这会给主库的性能造成很大的压力,不仅不能提升系统性能,反而适得其反,对于生产环境来说,一般都是两到三个从库。:从库会创建一个SQL线程,会读取relay-log中的终极日志,重放binlog,从而更新从库中的数据,其实就是把binlog重新执行了一遍,加载到从库的DB中,完成主从的复制。:MySQL的从库创建的IO线程会连接到主库的binlog,主库会为每一个从库创建一个。中接收到主库的文件,把binlog文件写入到本地的。

2025-05-13 21:20:08 614

原创 Mysql的索引,慢查询和数据库表的设计以及乐观锁和悲观锁

如果查询数据较少,没有超过系统的变量sort_buffer_size时候,则直接在内存中进行排序,是快排,如果超过了变量大小,则会用文件进行排序,也就是归并排序,会导致特别慢,因为涉及到磁盘间文件交换。使用FileSort查询(order by)(排序字段没有加索引, 使用多字段排序,但是排序规则不同)数据表字段都是not null的,即使没有数据,最好也使用无意义的值填充,并在业务代码中特殊处理。不追求严格的数据精简(灵活调整),通过字段冗余来优化查询,减少表关联。触发索引覆盖,不需要回表,速度最优。

2025-05-12 21:06:00 691

原创 Spring的异步

Async需要和@EnableAsync一起使用才有效果。异步任务可以有返回值,也可以没有返回值。常见,常用的Spring内建事件。:事件,事件监听者,事件发布者。事件驱动和消息驱动的区别与联系。最好自定义线程池和异常处理器。

2025-05-12 21:03:34 184

原创 BeanPostProcessor和AOP

编程式事务两种实现:TransactionTemplate,PlatformTransactionManager。对Bean分析,处理,例如记录初始化时间,安全风险检查等。解析Bean的自定义注解,针对注解做一些前置处理。声明式事务:@Transaction;归类Bean,聚合处理过程。底层实现原理:动态代理。

2025-05-10 22:27:20 297

原创 IOC和Bean

这样一来,对象不再需要主动去查找或创建它们的依赖,而是由容器在创建对象时帮助它们完成依赖注入的过程。控制反转的概念主要是与传统的直接构造(即 new 操作)来控制对象依赖的方式相反。

2025-05-10 22:25:30 715

原创 DTO,VO,PO,Entity

DTO 是数据传输对象,用于在不同系统或层之间传输数据。

2025-04-29 22:15:19 989

原创 Mysql中索引的知识

核心概念:索引是什么?想象一下你有一本很厚的书,你想找到其中关于某个特定主题的内容。从头到尾翻阅整本书:这就像数据库中的全表扫描 (Full Table Scan)。如果书很长,这个过程会非常慢。查阅书末尾的索引:索引列出了书中的重要词汇或主题,并指明了它们出现在书的哪一页。你只需要快速查找索引(索引本身通常按字母排序),找到你想找的主题,然后直接翻到对应的页码。这就像数据库中的使用索引。在数据库中,索引也是一个类似的数据结构。

2025-04-29 22:13:48 1009

原创 InnoDB对LRU算法的优化

大量的、一次性访问的 Page(如全表扫描带来的)只会被加载到 Old Generation 的头部,它们需要在 Old Generation 中“冷却”一段时间并再次被访问后才有机会晋升到 Young Generation。当执行一个大的全表扫描时,会读取并访问表中所有的 Page。它的时间还没有超过 innodb_old_blocks_time 设定的阈值(默认是 0 毫秒),那么它不会被移动到 Young Generation,仍然留在 Old Generation 的原位。

2025-04-28 21:06:37 1112

原创 Redo log,Undo log和binlog

mysql的日志

2025-04-28 21:05:59 585

原创 大模型应用开发(PAFR)

针对特有业务场景对基础大模型做数据训练和微调,以满足特定场景的需求。:将应用端业务能力与AI大模型推理能力结合,简化复杂业务功能开发。:给大模型外挂一个知识库,让大模型基于知识库内容做推理和回答。将检索结果和用户问题填入Prompt模板。:利用大模型推理能力完成应用的核心功能。用最终获得的Prompt调用LLM。检索知识库中相关知识片段。

2025-04-25 21:10:02 343

原创 JUC学习(1) 线程和进程

一个进程往往可以包含多个线程,至少包含一个!:充分利用CPU的资源。

2025-04-17 22:01:05 367

原创 docker的基础知识

volumes:volumes:在这里定义了两个卷redis-data和redis-conf,这些卷将由 Docker 管理。它们的具体存储位置将由 Docker 决定,用户无需关心具体路径。这个 Docker Compose 文件定义了一个 Redis 服务,配置了环境变量、端口映射和数据持久化等设置,适合用于开发或测试环境。

2025-04-17 21:59:57 1442

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除