Redis面试题笔记

637 常见的数据类型 String Set Hash List Zset (Sorted Set) BitMap => 位图,考勤,或者xxx分配情况 HyperLogLog => 用户访问的独立用户数量 GEO => 地理 应用场景: 缓存 实时系统 消息队列 分布式锁 计数器:页面访问量、点赞数、评论数 651 Redis 主从复制的实现原理 为什么需要主从复制 **提供故障恢复:**数据冗余&故障恢复,某个节点宕机了,但是其他节点还活着; **负载均衡:**提供负载均衡,配合读写分离策略,主节点写操作,从节点提供读操作; ⭐ **高可用:**主从复制是Redis的高可用的基础,也是哨兵和集群实施的基础。 两种同步复制方式: 全量 & 增量 全量复制:分三阶段 主节点发送SYNC命令与从节点进行连接,开始同步, 主从之间建立联系; 主节点将当前数据生成RDB文件,发送给从节点; 发送的期间,主节点将期间的所有写命令缓存到Replication buffer。最后发送Replication buffer的写命令给从节点。 增量复制 短暂失联后同步数据 主要有三个步骤: 从服务器在恢复网络后,会发送 psync 命令给主服务器,此时的 psync 命令里的 offset 参数不是 -1; 主服务器收到该命令后,然后用 CONTINUE 响应命令告诉从服务器接下来采用增量复制的方式同步数据; 然后主服务将主从服务器断线期间,所执行的写命令发送给从服务器,然后从服务器执行这些命令。 那么关键的问题来了,主服务器怎么知道要将哪些增量数据发送给从服务器呢? 答案藏在这两个东西里: repl_backlog_buffer,是一个「环形」缓冲区,用于主从服务器断连后,从中找到差异的数据; (环形堆积缓冲区) replication offset,标记上面那个缓冲区的同步进度,主从服务器都有各自的偏移量,主服务器使用master_repl_offset 来记录自己,「写」到的位置,从服务器使用 slave_repl_offset 来记录自己「读」到的位置。 ·repl_backlog_buffer,是一个「环形」缓冲区,用于主从服务器断连后,从中找到差异的数据; 保持连接与断线重连 Redis中,主节点会和从节点保持长连接,以确保数据的持续同步; ...

March 1, 2025 · 8 min · 1645 words · LongWei

Spring笔记

1. 什么是循环依赖 两个及以上的类之间相互依赖。模块A依赖于模块B,模块B依赖于模块A,导致依赖链的循环,无法确定加载/初始化顺序。 => 多个Bean循环引用导致Spring容器无法正常初始化它们。 延迟某些Bean的初始化时间,使用@Lazy进行懒加载,只有当实际使用了该对象才创建。 2. Spring如何解决循环依赖 提前暴露未完全创建的Bean 三级缓存解决: 一级缓存(Single Objects Map):用于初始化单例Bean; (成品) 二级缓存(Early Singleton Objects Map): 用于存储尚未完全初始化,但实例化的Bean,用于提取暴露对象,避免循环依赖问题;(半成品,成员变量未初始化) 三级缓存(Singleton Factories Map): 用于存储对象工厂,可以通过工厂创建早期Bean **解决步骤:**例如AB两个相互依赖,三级缓存策略 创建A,查询一级缓存看看有没有完全体B,没有则看看二级缓存有没有半成品B,都没有则创建A的Bean,调用ceateBean方法(实例化,属性注入,初始化); 之后,A往三级缓存加入一个A的getObject方法 到了属性注入,因为A依赖B,那么需要创建B。同样的路线,B查询到二级缓存都没发现A,调用createBean创建B实例。到了B的属性注入,发现三级缓存有A工厂,调用getObject创建半成品A,放到二级缓存中,完成B的第二步属性注入。后面initializeBean完成B的创建,并放到一级缓存中。 回到A,A调用一级缓存的B完成注入。 未解决的问题: 而如果说 A 是构造器注入,B 是 set 注入。则说明 A 需要 B 的时刻提前了,在实例化 new A(B b)的时候就需要 B。此时 A 没有往三级缓存放getObject,因此到了创建依赖 B的时候,无法获取 A的 getObject 工厂方法,只能继续 new A,造成循环依赖的死循环。 4. Spring重要的模块组成 Core Container 核心容器: Spring Core:提供依赖注入DI和控制反转IOC的实现。 Spring Beans:负责管理Bean的定义和生命周期,通过IOC完成Bean的创建、依赖注入、初始化、销毁等操作; Spring Context:基于Core和Beans的高级容器,提供类似JNDI的上下文功能,包含国际化、事件传播、资源访问等功能; Spring Expression Language:用于运行时查询和操作对象的值。 AOP面向切面编程 Spring AOP:提供面向切面编程的功能,可以在方法执行前后或抛出异常时动态插入额外的业务逻辑。 Data Access 数据访问 ...

March 1, 2025 · 3 min · 516 words · LongWei

Java面试题笔记

415 序列化&反序列化 将Object转为字节流,或反之 普通:实现serializable接口 ˈsɪərɪəlaɪzəbl 使用Jackon,Obj => json格式 416 Java中的不可变类 final 修饰,例如String类 🎉优点: 线程安全 缓存友好 缺点 性能问题,因为不能修改,所有每次状态变化,都需要生成新的对象。 411 多态特性 继承 方法重载,函数名相同,但是函数签名需要有差异(参数类型&数量) 重写,子类重写父类方法,通过父类调用方法时,调用的是子类重写后的函数。 412 Java参数传值是副本还是引用呢? 基本类型是传值副本,int… 引用数据类型是传引用副本。 including:obj,array 425 Java中 包装类型和基本类型 🏷️基本类型 => int long float double … 位于栈上(局部变量的话) ,性能好,但不支持为null (局部变量在栈上,成员变量在堆上,静态字段在方法区) 🏷️包装类型 => 每一个基本类型都对应一个包装类型。包装类型是类,在堆中,支持null JVM内存模型 ❗❗❗内存堆和数据结构堆不是同一个东西(不是堆的结构) 1+--------------------------------------------+ 2| 方法区(Method Area) | ← 线程共享 3| - 类元数据(Class 信息) | 4| - 静态变量(static 变量) | 5| - 常量池(字符串常量等) | 6+--------------------------------------------+ 7 ↑ ↑ 8 | | 9+----------------+ +-----------------+ 10| 栈(Stack) | | 堆(Heap) | ← 线程共享 11| - 局部变量 | | - Java 对象实例 | 12| - 方法调用栈 | | - 数组 | 13+----------------+ +-----------------+ 413 interface & abstract class interface(自上而下) 知晓某一种行为,基于这些行为约束定义的接口, 一些类需要有这些行为的话,需要实现这些接口 abstract class(自下而上): 有许多类,它们有共同点,很多代码可以复用,因此将公共逻辑封装为抽象对象。 100 hashCode & equals & == hashCode用于散列表(hashMap)用于计算hash值,从而计算存储位置; ...

February 19, 2025 · 7 min · 1389 words · LongWei

高频SQL50题刷题笔记

高频SQL50题 查询 Where&GroupBy&HAVING 1SELECT id, revenue # 某个用户2021年可能有多项记录 2FROM users 3Where year = 2021 4 5SELECT id, SUM(revenue) 6FROM users 7Where year = 2021 # 1. 先筛选出此年份所有记录 8Group By id # 2. 再根据id分组 3. 必须结合SUM() 或者其他聚合函数,因此这个有多列,需要处理为单值。 9 10SELECT id 11FROM users 12Where year = 2021 # 1. 先筛选记录 13Group By id # 2. 分组 14HAVING SUM(revenue) > 1000 # 3. 聚合分组字段记录 并 判断 查找没买过东西的顾客 1# 1. NOT EXISTS 2SELECT `name` AS `Customers` 3FROM `Customers` AS c 4WHERE NOT EXISTS ( 5 SELECT `customerId` 6 FROM `Orders` AS o 7 Where o.customerId = c.id 8) 1# 2. Left Join 2# example 3SELECT c.id AS id, c.name, o.id AS oid 4FROM customers AS c LEFT JOIN orders AS o 5on c.id = o.customerId 6 7SELECT `name` as `Customers` 8FROM customers AS c LEFT JOIN orders AS o 9on c.id = o.customerId 10WHERE o.id is NULL 计算特殊奖金 编写解决方案,计算每个雇员的奖金。如果一个雇员的 id 是 奇数 并且他的名字不是以 'M' 开头,那么他的奖金是他工资的 100% ,否则奖金为 0 。 ...

November 24, 2024 · 14 min · 2965 words · LongWei

DL基准模型训练伪代码

minGPT author: karpathy Andrej ✅ 解决问题 生成式文本任务,比如写文章、对话、续写句子。目标是给定前文,预测下一个词。 🛠️ 具体措施 输入一句话,例如:"我 爱 自然" → 转成数字编号 [23, 45, 67]。 构造训练样本: 输入 X = [X1, X2, X3, Y1, Y2] 标签 Y = [-1, -1, Y1, Y2, Y3](-1表示忽略不计算损失) 模型结构: 首层:词嵌入 + 位置编码 骨干:多层的 单向自注意力(只能看前面的词) + 前馈网络 尾层:分类头输出每个位置的词概率分布 训练时一次性并行预测多个词(只看前面上下文) 推理时串行生成:每生成一个词,就加到输入里继续生成下一个。 💥 损失函数 就像做 完形填空: 给前面几个字,猜后面是什么字。 猜错一个字就扣分,扣分规则是 交叉熵(预测概率分布和真实答案差多远)。 -1的位置不扣分(相当于没让你填)。 💼 工作流程 1String: ['X1', 'X2', ..., 'Xn'] =[dictionary]=> [k1, k2, ..., kn] # word2index 2 3# Train: 4X = [X1, X2, X3, Y1, Y2], Y = [-1, -1, Y1, Y2, Y3] 5Model = {(WordEmbed+PosEmbed) => (CausalSelfAttention+FFN)xN => (ClassHead)} 6# attn = A B C 7# A √ × × uni-directional 8# B √ √ × 9# C √ √ √ 10 11Z = Model(X) => [Z1, Z2, Z3, Z4, Z5] 12Y = [-1, -1, Y1, Y2, Y3] 13# Equal to Parallel Train 14(X1,X2,X3) =predict=> Y1 15(X1,X2,X3,Y1) =predict=> Y2 16(X1,X2,X3,Y1,Y2) =predict=> Y3 17 18loss = crossentropy(Z, Y, ignore=-1) # Zi => {P1,...,Pclass} multi-class task 19 20# Test: Serial generation 21give inp = [X1, X2, X3] 22Step 1: 23 Z = Model(inp) = [Z1,Z2,Z3] 24 Y = [-1,-1,Y1] 25 inp = inp + Y[-1] = [Z1,Z2,Z3,Y1] 26Step 2: 27 Z = Model(inp) = [Z1,Z2,Z3,Z4] 28 Y = [-1,-1,-1,Y2] 29 inp = inp + Y[-1] = [Z1,Z2,Z3,Y1,Y2] 30Step 3: 31 Z = Model(inp) = [Z1,Z2,Z3,Z4,Z5] 32 Y = [-1,-1,-1,-1,Y3] 33 inp = inp + Y[-1] = [Z1,Z2,Z3,Y1,Y2,Y3] 34 35out: [Z1,Z2,Z3,Y1,Y2,Y3] minBert ✅ 解决问题 理解类任务:比如问答、文本分类、句子关系判断(如是否上下句)、填补缺失词。 ...

October 31, 2024 · 4 min · 738 words · LongWei

ECG论文和实验

论文 ⭐IM-ECG - 2023 IM-ECG: An interpretable framework for arrhythmia detection using multi-lead ECG - Expert Systems With Applications sci-1 创新点: Conv2D模型与Grad-CAM的适配更好 - 实时标注病理区域 解释性 双核残差块 - 横轴与竖轴+面 三种扫描方式 k * n(区域扫描)内核朝向中心压缩ECG以更直接地捕获导联间特征,而1 * n(横轴扫描)内核沿着时间维度压缩ECG并且因此更关注导联内特征 流程图示 模型结构 Block Lightweight Transformer - 2022 Enhancing dynamic ECG heartbeat classification with lightweight transformer model Artificial Intelligence In Medicine sci-1 创新点: 两级注意力机制: 局部 + 全局 // 局部注意力 == 通道注意力 SEBlock || 全局注意力 == Transformer Encoder ...

April 19, 2024 · 12 min · 2541 words · LongWei

Java学习笔记

Java 反射 它提供了动态性和灵活性,使得程序可以在运行时动态地加载类、调用方法、访问字段等,而不需要在编译时确定这些操作。 1. 动态加载类 在运行时根据类名动态加载类,而不是在编译时硬编码类名。 – 插件化架构:根据配置文件或用户输入动态加载类。 2. 创建对象 通过反射可以在运行时动态创建对象,即使类的构造函数是私有的。 工厂模式:根据配置动态创建对象。 依赖注入框架:Spring 通过反射创建 Bean 实例。 3. 调用方法 通过反射可以在运行时动态调用对象的方法,即使方法是私有的。 测试框架:JUnit 通过反射调用测试方法。 4. 访问字段 通过反射可以在运行时动态访问对象的字段,即使字段是私有的 序列化和反序列化:通过反射访问对象的字段。 对象关系映射(ORM):Hibernate 通过反射访问实体类的字段。 7. 注解处理 通过反射可以获取类、方法、字段上的注解,并根据注解执行相应的逻辑。 24/4/14 1️⃣ 反射的作用 获取类中的所有信息(e.g.持久化、IDE的代码提示) 1Field[] fields = cls.getDeclaredFields(); 2for (int i = 0; i < fields.length; i++) { 3 fields[i].setAccessible(true); 4 // String name = fields[i].getName(); // 属性名 第一次先生成列名 5 Object value = fields[i].get(obj); 6 bw.append(value.toString()); 7 if (i < fields.length - 1) { 8 bw.append(", "); 9 } 10} 11bw.newLine(); 结合配置文件动态创建对象 1Properties prop = new Properties(); 2 3String filename = "prop.properties"; 4FileInputStream is = new FileInputStream(filename); 5 6prop.load(is); 7 8String classname = prop.getProperty("classname"); 9String method = prop.getProperty("method"); 10String name = prop.getProperty("name"); 11 12Class cls = Class.forName(classname); 13Constructor con = cls.getDeclaredConstructor(); 14Object o = con.newInstance(); 15 16Method setName = cls.getMethod("setName", String.class); 17setName.invoke(o, name); 18 19Method met = cls.getDeclaredMethod(method); 20met.invoke(o); 2️⃣ 获取Class的三种方式 ...

April 19, 2024 · 25 min · 5142 words · LongWei

深度学习论文汇总1

图示 卷积注意力 自注意力 学习 Norm Loss Cross Entropy $$ Loss = -\sum_{i}^{C}y_ilog(p(x_{i})), where \ y_i\ is label,p(x_i)\ is\ predict. $$ BCE Loss $$ Loss = −\sum_{i}^{c}(y_ilog(p(x_i)+(1−y_i)log(1−p(x_i)) \ where \ y_i \in [0, 1] \ pos_partition = -log(p(x_i))\ neg_partition = -log(1-p(x_i)) $$ Focal Loss $$ Loss = -α_t(1-p_t)^γlog(p_t)\ # Multi-Label:\ 1.\ pos_loss = α(1-p(x_i))^γ\ \ -log(p_t)\ 2.\ neg_loss = (1-α)p(x_i)^γ\ \ -log(1-p_t) $$ 论文 Mlp-mixer - NIPS 2021 title: Mlp-mixer: An all-mlp architecture for vision ...

April 19, 2024 · 12 min · 2517 words · LongWei

深度学习论文汇总2

CAM - CVPR 2015 Learning Deep Features for Discriminative Localization 弱监督对象定位 - 仅提供Image level label 期望:每个单元被其感受野内的某种视觉模式激活。因此 fk (表示空间位置 (x, y) 处最后一个卷积层中单元 k 的激活//输出特征图的一个像素)是该视觉模式存在的地图。类激活图只是这些视觉模式在不同空间位置的存在的加权线性和 计算卷积特征图对于特定输出单元的重要性来实现的 ⭐⭐⭐网络可以保留其卓越的定位能力,直到最后一层 => 深层特征的定位能力 ❗❗❗尽管接受了图像级标签的训练,CNN 仍具有出色的对象定位能力 缺陷:卷积特征图→全局平均池化→softmax层 // 特定网络结构 做法图示 数学公式 在卷积特征图上执行全局平均池化,并将它们用作全连接层的特征,产生所需的输出分类; ❗❗❗将输出层的权重投影回卷积特征图来识别图像区域的重要性 Grad-CAM - ICCV 2017 适用CNN模型 但论文提到在CNN+LSTM的也能定位有区别的图像区域 α 捕获特征图 k 对于目标类 c 的重要性 // 与CAM的分类线性层权重作用一致 ReLU的作用,只对对感兴趣的类别有积极影响的特征感兴趣。负像素可能属于图像中的其他类别 上述操作 => 具有类别区分性并且可以很好地定位相关图像区域 - 最后特征图比较小! 但缺乏显示细粒度重要性的能力 (能区分猫狗,但对为什么识别为猫,不够精确) 通过点乘法融合 引导反向传播 和 Grad-CAM => 可视化 ...

April 19, 2024 · 22 min · 4530 words · LongWei