
查找和最小的 K 对数字要点最小堆int[]{数字坐标}想成数组。【x,0】先加进去class Solution { public ListListInteger kSmallestPairs(int[] nums1, int[] nums2, int k) { //最小堆 PriorityQueueint[] pq new PriorityQueue((a,b) - a[0] - b[0]); for(int i 0; i Math.min(nums1.length,k);i){ pq.add(new int[]{nums1[i] nums2[0], i, 0}); } ListListInteger ans new ArrayList(k); while(k-- 0){ int[] top pq.poll(); int i top[1]; int j top[2]; ans.add(List.of(nums1[i], nums2[j])); if(j1 nums2.length){ pq.add(new int[]{nums1[i] nums2[j1], i, j1}); } } return ans; } }颠倒二进制位要点32位置的模拟class Solution { public int reverseBits(int n) { int ans 0; for(int i 0; i 32; i ) { ans n % 2 2 * ans; n n1; } return ans; } }位1的个数要点n1class Solution { public int hammingWeight(int n) { int ans 0; while(n ! 0){ if(n%2 1){ ans; } nn1 ; } return ans; } }只出现一次的数字要点异或^class Solution { public int singleNumber(int[] nums) { // int ans 0; for(int num : nums){ ans ^ num; } return ans; } }只出现一次的数字 II要点位置上相加%3class Solution { public int singleNumber(int[] nums) { //异或 %3 int ans 0; for(int i 0; i 32; i){ int cnt1 0; for(int num : nums){ //取第i位置 cnt1 num i 1; } ans ans | ((cnt1 % 3) i); } return ans; } }数字范围按位与要点抹平后续class Solution { public int rangeBitwiseAnd(int left, int right) { int shift 0; while(left right){ left left 1; right right 1; shift; } return right shift; } }随机知识 MySQL Redis 面试核心知识点总结一、MySQL 篇1. 基础架构一条 SQL 是怎么执行的text客户端 → 连接器管理连接/权限→ 查询缓存8.0已废弃→ 解析器词法/语法分析→ 优化器选择索引→ 执行器调用存储引擎接口→ InnoDB2. 存储引擎InnoDB vs MyISAM对比维度InnoDBMyISAM事务✅ 支持❌ 不支持行级锁✅ 支持❌ 只支持表锁外键✅ 支持❌ 不支持MVCC✅ 支持❌ 不支持聚簇索引✅ 是❌ 否适用场景读写并发高、事务敏感读多写少、非事务型结论MySQL 5.5 默认 InnoDB几乎 90% 场景都用它。3. 索引重中之重3.1 BTree 索引为什么用 BTree 而不是 B-Tree 或二叉树BTree 非叶子节点不存数据一个磁盘页能存更多索引树更矮IO 次数少。叶子节点用双向链表连接支持范围查询和顺序遍历。3.2 聚簇索引 vs 非聚簇索引回表类型叶子节点存什么说明聚簇索引整行数据InnoDB 主键索引就是聚簇索引非聚簇索引二级索引主键 ID查询非索引字段需要回表再查一次主键索引覆盖索引查询所需字段直接在索引中不回表如select id,name where namexxx且name和id是联合索引3.3 最左前缀原则联合索引(a, b, c)相当于三个索引(a)、(a,b)、(a,b,c)。where a1 and b2✅ 用索引where b2 and c3❌ 不走索引跳过了 awhere a1 and c3→ 只走(a)部分3.4 索引下推ICPIndex Condition PushdownMySQL 5.6 引入。在存储引擎层就过滤掉不符合条件的记录减少回表次数。例子where a1 and b2先通过a找到记录在引擎层直接判断b2不符合的不回表。3.5 什么时候索引失效必背情况原因like %abc以 % 开头BTree 无法定位or两边有非索引字段整条 SQL 走全表扫描对索引字段做函数/计算如where date(create_time) 2025-01-01隐式类型转换如varchar字段传int!/无法用索引做等值查找is null/is not null多数情况下失效3.6 为什么索引不宜建太多占用磁盘空间。更新性能下降每次insert/update/delete所有索引都要同步更新。4. 事务与隔离级别4.1 四大隔离级别级别脏读不可重复读幻读READ UNCOMMITTED✅✅✅READ COMMITTED❌✅✅REPEATABLE READMySQL默认❌❌⚠️部分避免SERIALIZABLE❌❌❌4.2 事务隔离级别的实现MVCCMVCC多版本并发控制每一行数据有多个版本通过隐藏字段trx_id和roll_pointer指向 Undo Log。不同事务读到不同版本的数据实现非阻塞读。快照读select不加锁读的是快照版本。当前读select for update/update/insert读的是最新版本并加锁。5. 三大日志MySQL 的“保险丝”日志位置作用Binlog归档日志Server 层记录所有变更增删改用于主从复制和数据恢复。逻辑日志SQL 语句或行数据Redo Log重做日志InnoDB 层记录物理修改“在 Page X 偏移 Y 处写入 Z”。保证事务持久性崩溃恢复。WALWrite-Ahead Logging技术先写日志再写磁盘Undo Log回滚日志InnoDB 层记录修改前的版本用于事务回滚和MVCC 快照读5.1 两阶段提交保证 Binlog Redo Log 一致性textRedo Log Prepare → 写 Binlog → Redo Log Commit这是保证 MySQL 崩溃恢复时主从数据一致的关键机制。6. 锁机制6.1 行锁分类锁类型含义记录锁Record Lock锁定单行记录间隙锁Gap Lock锁定一个范围不包含记录本身防止幻读临键锁Next-Key Lock记录锁 间隙锁InnoDB RR 级别默认面试金句MySQL 在 RR可重复读级别下通过MVCC快照读Next-Key Lock当前读解决了幻读问题。6.2 死锁产生条件循环等待 互斥 不可抢占 请求与保持。解决方案按固定顺序访问资源使用SELECT ... FOR UPDATE时注意顺序开启innodb_deadlock_detect死锁检测自动回滚。7. 性能优化Explain 解读Explain 结果中重点看什么列名关注点typeconstrefrangeindexALL全表扫描要避免key实际使用的索引名NULL代表没走索引rows预估扫描行数越小越好ExtraUsing filesort需要额外排序慢Using temporary用了临时表慢Using index覆盖索引快8. 分库分表策略说明垂直分库按业务模块分订单库、用户库垂直分表大字段拆出去减少单表宽度水平分表按某个字段取模/范围分到多张表分表中间件ShardingSphere-JDBC、MyCat二、Redis 篇1. 为什么 Redis 这么快纯内存操作读写都是内存微秒级。单线程6.0 之前避免了上下文切换和锁竞争但 6.0 多线程仅用于网络 I/O。I/O 多路复用epoll一个线程监听多个 Socket 连接。高效的数据结构SDS、跳表、压缩列表等。2. 五大基础数据类型 底层实现重点数据类型用途底层结构String缓存、计数器、分布式锁SDS简单动态字符串Hash对象属性、购物车ziplist元素少/ hashtable元素多List消息队列、最近 N 条quicklist双向链表 ziplist 混合Set去重、交并差intset全整数少/ hashtableZSet排行榜、延时队列ziplist少/ skiplist dict多3. 持久化方式方式原理优缺点RDB快照全量内存数据写入.rdb文件恢复快占用小但可能丢失最后一次快照后的数据AOF日志记录每一条写命令数据更完整appendfsync always/everysec文件大恢复慢混合持久化4.0RDB AOF 混合兼顾恢复速度和数据完整性4. 过期策略 淘汰策略4.1 过期删除策略策略说明惰性删除访问时检查过期才删除定期删除每 100ms 随机抽取一批带 TTL 的 key 检查并删除主动淘汰内存满时见下方淘汰策略4.2 内存淘汰策略maxmemory-policy策略说明noeviction不淘汰直接返回错误allkeys-lru在所有 key 中淘汰最近最少使用volatile-lru在设置过 TTL 的 key 中淘汰 LRUallkeys-random/volatile-random随机淘汰volatile-ttl淘汰过期时间最近的 key大厂主流选型allkeys-lru追求命中率或volatile-lru只淘汰临时数据。5. 缓存三大问题 解决方案5.1 缓存穿透查不存在的 key请求的 key 在 Redis 和 DB 都不存在绕过缓存直接打 DB。解决方案布隆过滤器Bloom Filter先判断 key 是否存在不存在直接返回。缓存空值对不存在的 key 也缓存null并设短 TTL。5.2 缓存击穿热点 key 突然过期一个热点 key 过期瞬间大量请求同时打到 DB。解决方案互斥锁SETNX只允许一个线程去查 DB其他等待/重试。逻辑过期Redis 不设物理过期在 Value 里存过期时间戳过期时异步更新当前先返回旧数据。5.3 缓存雪崩大批 key 同时过期多个 key 同时过期或 Redis 宕机大量请求直接打 DB。解决方案过期时间加随机值避免大量 key 同时过期。多级缓存本地缓存Caffeine Redis 两层。熔断降级Redis 挂了直接返回兜底数据不打 DB。Redis 高可用主从 哨兵 / Cluster 集群。6. 分布式锁Redisson 看门狗标准写法原子性bashSET lock_key unique_value NX EX 30Redisson 的改进看门狗 WatchDog默认锁有效期 30 秒业务没执行完自动续期每 10 秒续一次。防止业务执行时间长导致锁自动释放引发并发问题。底层依赖lua脚本保证原子性判断锁持有者 释放锁。7. 集群模式模式适用场景特点主从复制读写分离一主多从主写从读。主挂需人工介入哨兵模式Sentinel高可用在主从基础上加哨兵自动故障转移选新主Cluster 集群海量数据 10G分片16384 个槽位多主多从。不支持跨槽位事务三、面试综合追问“MySQL 和 Redis 怎么配合使用”典型场景读请求先查 Redis命中则返回未命中则查 MySQL回写 Redis 并返回。写请求先更新 MySQL再删除或更新Redis 缓存。大厂选型强一致场景转账、支付走 MySQL不用缓存。读多写少场景商品详情、文章Redis MySQL允许短暂不一致。最终一致方案订阅 MySQL Binlog如 Canal异步更新 Redis彻底解耦。 面试金句背下来直接加分MySQL 索引“BTree 的非叶子节点不存数据叶子节点用链表相连既支持等值查询也支持范围查询磁盘 IO 次数少。”事务隔离“InnoDB 在 RR 级别下通过 MVCC 快照读 Next-Key Lock 当前读解决了幻读问题。”Redis 快“单线程 内存 I/O 多路复用 高效数据结构四者缺一不可。”缓存三大问题“穿透用布隆过滤器击穿用互斥锁或逻辑过期雪崩用过期随机值 熔断降级。”分布式锁“SET NX EXlua脚本保证原子性Redisson 看门狗解决锁续期问题。”把这份笔记刻进脑子里MySQL Redis 这块你就可以从容应对绝大多数面试了如果某个具体点如 Binlog 的三种格式、跳表原理、哨兵选举过程想深挖随时可以继续聊。碎碎念后续会更新每天学习的八股和算法 题开始准备秋招的第58天。努力连续更新100天以后每天就按秋招项目【java agent】科研必做项目算法八股锻炼身体来总结。总结继续重新看八股了加油加油1.算法面试150 118/150 2h2.秋招项目【java 项目】【agent 项目 】3.科研要跑一下4.实习7h6.背八股2h7.锻炼身体总结mysql和redis