设计模式
UML类图+:public、-:privated、#:default 软件设计原则 开闭原则 以前写好的代码不要动了,要想新的方法,就重新写一个 单一职责原则 一个类最好只干一件事 接口隔离原则 一个接口不要包含太多能力 设计模式单例模式 想象全公司只买得起一台打印机:机器加锁不让私自开(构造器私有),前台登记并保管它(静态实例),谁要打印都向前台借同一台(getInstance)。这样全程只有一台设备,省资源,也避免冲突。
计算机网络
计算机网络体系结构国际协议没有商业使用,商业上有一套标准,进而再抽象为教学的标准。 数据链路层有三个目标 封装成帧 信息在链路层的传输中都是靠帧来传输的,最重要的是要确定帧边界,明确哪里是一个完整的帧 帧定界方法:主要采取“特殊标志法,要处理转义字符,方法是在非帧开始/结束的后面添加一个转义字符防止错误定位帧区间。 差错检测 在信息传输的过程中,很容易数据传输出错,这时需要FCS(Frame Check...
java基础八股
抽象类 抽象类只有方法,没有实现,下面的子类继承父类,并且子类可以有自己的方法,比如Integer、Double包装类继承了Number类,Number类是一个抽象类,只有定义没有实现。如何体现多态?我们可以写父类的方法,但是调用的是不同的子类重写的方法。这就是运行时多态(即“动态绑定”)的典型体现。 123456789public static void printValue(Number value) { System.out.println(value.doubleValue()); } public static void main(String[] args) { Number n1 = new Integer(10); Number n2 = new Double(3.14); printValue(n1); printValue(n2); ...
Redis八股
面试问题什么是缓存击穿、穿透、雪崩?区别是什么?如何解决? 穿透:请求永远不会命中缓存 请求的数据缓存中没有,数据库也没有,每次请求都会打到数据库 查不存在的用户ID,如 ID=-1 ① 参数校验 ② 布隆过滤器 ③ 缓存空值 启动时将数据库中所有合法的 ID 加入布隆过滤器; 每次查询前先判断:ID 是否在布隆过滤器中? 如果不在 → 直接返回,不查缓存也不查库; 如果在 → 走正常的缓存查询流程。 击穿:缓存偶尔失效后瞬间打爆后端 某个热点数据突然过期,大量请求同时查询,穿透缓存打爆数据库 秒杀商品库存刚好过期 ① 加互斥锁 ② 提前续期 ③ 永不过期+异步更新 雪崩:大量缓存同时失效导致系统崩溃 大量缓存同一时间过期,所有请求打到数据库,系统瞬间崩溃 定时批量缓存设置相同过期时间 ① 加随机过期时间 ② 热点预热 ③ 多级缓存 布隆过滤器是一种概率型数据结构,可以用来判断一个元素一定不存在/可能存在 Redis的过期删除策略? 惰性删除:访问key时,才检查他是否过期,如果过期就删除 |...
SpringAiMySelf
AI 问答系统(Chat 接口)用户在前端输入问题,后端 Spring Boot 调用 AI 接口(如 OpenAI / 通义千问 / 自定义模型),返回回答并展示。 创建配置 JDK17 在IDEA中勾选依赖项 SpringWeb //搭建REST接口,用于对外提供API Spring Data Redis //使用Redis进行缓存/AI结果存储 MySQL Driver //用于连接数据库,存储用户、记录等结构化数据 Lombok //简化实体类开发,自动生成Getter/Setter/构造器等 配置application.yml(src/main/resources) 123456789101112131415161718192021222324server: port: 8080 #默认端口号spring: #配置数据库 datasource: url:...
SQL八股
MySQL基础MySQL是关系型数据库RDB 什么是SQL?SQL(Structured Query Language),专门用于和数据库打交道,从数据库中高效提取数据。 什么是MySQL?MySQL是一种关系型数据库,用于持久化我们系统中的一些数据,比如用户信息。 整数类型的UNSIGNED属性有什么用?UNSIGNED可以将表示的正整数范围提升一倍,比如TINYINT只能表示-128-127,如果使用UNSIGNED TINYINT就可以变为0-255,可以用在年龄,员工id等一些值不为负的场景。 CHAR和VARCHAR有什么区别? CHAR: 长度:定长字符串,比如CHAR(10),无论输入abc还是abcdefghij,都只会占用10个字符(如果输入超过十个就截断) 适用场景:长度固定的字符串,比如身份证号,性别,MD5算法加密后的密码等。 类比:CHAR 就像定长的信封,无论你放几张纸,都塞满; VARCHAR: 长度:变长字符串,VARCHAR 在存储时需要使用 1(长度小于255) 或 2(长度大于255)...
OS八股
...
RocketMQ
实际开发:短信分发,第一次进行预处理 用三个消息队列分别存储 : 移动/联通/电信的号码 RocketMQMQ概述MQ : Message Queue 消息队列,是在消息传输过程中保存消息的容器 1.优势 应用解耦 耦合度:指的是模块或组件之间的依赖程度。耦合度越高,容错越低。 防止消费者/生产者某一方崩了导致整个流程崩溃。 提高系统容错性以及可维护性 异步提速 生产方发完消息,可以继续下一步业务逻辑。 提升用户体验和系统吞吐量 削峰填谷相当于数据先打到缓存中,然后消费者从缓存中拿数据,而不是直接打到消费者,如果1w/s打到物流系统会崩溃 提高系统稳定性 2.劣势 系统可用性降低 如果MQ崩了,就会对业务造成影响。 如何保障MQ的高可用? 系统复杂度提高如何保障消息没有被重复消费,如何处理信息丢失,如何保障信息传递的顺序性 一致性问题A处理完业务通过MQ发给BCD,BC都成功处理,那D处理失败,如何保障消息处理数据的一致性? RocketMQ 工作原理总结RocketMQ...
juc
并发编程1.进程与线程1.进程与线程 进程 程序由指令和数据组成,指令需要运行,数据需要读写,就要将指令加载到cpu上,数据加载至内存。在指令运行过程中还需要使用磁盘,网络等设备。 进程就是用来加载指令、管理内存、管理I/O的。 当一个程序被运行,指令代码被加载至内存,这时就开启了一个进程。 进程可以视为程序的一个实例。有些可以多开(记事本),有些只能开一个(网易云) 线程 一个进程之内可以有多个线程 一个线程就是一个指令流,是 CPU 调度的基本单位,线程按照一定顺序执行代码,多个线程可以并发地被 CPU 核心调度执行。 java中,线程作为最小调度单位,进程作为资源分配最小单位。 两者对比 进程基本上相互独立的,而线程存在于进程内,是进程的一个子集 进程拥有共享的资源,如内存空间等,供其内部的线程共享 进程间通信较为复杂 同一台计算机的进程通信称为IPC(Inter-process communication) 常见的 IPC 方式包括管道(pipe)、共享内存、消息队列、socket...
jvm
什么是JVM? 定义:Java Virtual Machine java程序的运行环境(更确切:java二进制字节码的运行环境) 好处: 一次编写,到处运行的基石(跨平台) 自动内存管理,垃圾回收功能(垃圾回收处理堆内存的无用对象) 数组下标越界检查 多态 比较:Jvm Jre Jdk的关系 JVM的内存结构程序计数器(PC)1. 定义 Program Counter Register 使用寄存器实现 2. 作用: 记住下一条jvm指令的执行地址 3. 特点: 线程私有:每一个线程都是独立的,都有自己的时间片,以及自己的程序计数器 不会存在内存溢出 虚拟机栈1. 定义(java virtual machine stacks) 每个线程运行时所需要的内存称为虚拟机栈,线程私有 栈由多个栈帧(Frame)组成,每个栈帧对应一次方法调用。 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法(人话:栈顶) 2. 问题辨析: 垃圾回收是否涉及栈内存? 不涉及。虚拟机栈随着方法调用自动创建和销毁,不由 GC...
