38k35 分钟

2025-01-15🌱上海: ☀️ 🌡️+6°C 🌬️↓18km/h # 如何解决 Redis 中的热点 Key 问题? # 什么是热点 key 问题? 热 key 问题指的是在某个瞬间,大量请求集中访问 Redis 里的同一个固定 key,这会造成缓存击穿,使得请求都直接涌向数据库,最终拖垮缓存服务和数据库服务,进而影响应用服务的正常运行。 像 热点新闻 、 热点评论 、 明星直播 这类读多写少的场景,很容易出现热点 key 问题。虽然 Redis 的查询性能比数据库高很多,但它也有性能上限,单节点查询性能一般在 2 万 QPS,所以对单个固定 key 的查询不能超过这个
6.2k6 分钟

2025-01-15🌱上海: ☀️ 🌡️+6°C 🌬️↓18km/h # Redis 主从复制的实现原理是什么? # 总结分析 Redis 的主从复制指一个主节点可将数据复制到一个或多个从节点,从节点与主节点保持数据同步,其流程如下: 开始同步:从节点向主节点发送 PSYNC 命令发起同步请求。 全量复制:首次连接或连接失效时,从节点请求全量复制,主节点发送当前数据快照(RDB 文件)。 增量复制:全量复制完成后,主从保持长连接,主节点通过该连接将后续写操作传给从节点以保证数据一致。 # 扩展分析 # 主从架构 # 主从复制步骤 总的来说主从复制功能的详细步骤可以分为
27k25 分钟

2025-01-15🌱上海: ☀️ 🌡️+6°C 🌬️↓18km/h # Redis 中如何实现分布式锁? # 总结分析 在 Redis 中实现分布式锁,常见做法是将 set ex nx 命令与 lua 脚本组合使用。这一方式能确保多个客户端不会同时获取同一资源锁,还能保障安全解锁以及在意外情况下自动释放锁 。 # 扩展知识 为了能够更好的了解分布式锁的实现原理及为什么实现这些功能进行逐步分析 # 手写一个分布式锁 首先分析一下分布式锁实现都需要满足什么,可以基于 JUC 中的 AQS 规范进行参考 # 分布式锁所需满足的条件 独占性 任何时刻只能且仅有一个线程持有
8.6k8 分钟

2025-01-15🌱上海: ☀️ 🌡️+6°C 🌬️↓18km/h # Redis 中如何保证缓存与数据库的数据一致性? # 总结分析 缓存和数据库的同步有六种方式: 先更新缓存,再更新数据库; 先更新数据库,再更新缓存; 先删除缓存,再更新数据库,后续查询回种数据到缓存; 先更新数据库,再删除缓存,后续查询回种数据到缓存; 缓存双删策略:更新数据库前后各进行一次删除缓存操作,第二次为延迟删除; 使用定时任务进行重试删除缓存 使用 MQ 异步定时重试删除缓存 使用 Binlog 异步更新缓存,监听数据库 Binlog 变化异步更新 Redis 缓存。 前三种方式不太推
21k19 分钟

2025-01-15🌱上海: ☀️ 🌡️+6°C 🌬️↓18km/h # Redis 中跳表的实现原理是什么? # 总结分析 # 什么是跳跃链表(跳表) 跳表由多层链表组成,底层存所有元素,上层是下层子集。 插入操作:从最高层找位置,随机确定新节点层数,插入并更新指针。 删除操作:从最高层找节点,在各层更新指针以保持结构。 查找操作:从最高层开始逐层向下,效率高,时间复杂度为 O (logn)。 # 扩展知识 首先回顾下单链表,对于有序链表,若要查找其中某个数据,只能从头到尾遍历,这种方式查找效率低,时间复杂度为 O (n)。 在单链表中,查找一个数
11k10 分钟

2025-01-15🌱上海: ☀️ 🌡️+6°C 🌬️↓18km/h # Redis 中常见的数据类型有哪些? # 总结分析 String(字符串) 特点:最基本数据类型,能存储文本、数字、二进制数据,最大长度 512MB。 使用场景:缓存临时数据(如用户会话、页面缓存),作为计数器统计访问量、点赞数等。 Hash(哈希) 特点:键值对集合,适合存对象属性,内部用哈希表实现,适合小规模数据。 使用场景:存储商品详情的各个属性以便快速检索。 List(列表) 特点:有序字符串集合,支持两端推入和弹出,底层是双向链表。 使用场景:消息队列(通过 LPUSH
6.3k6 分钟

2025-01-15🌱上海: ☀️ 🌡️+4°C 🌬️↓19km/h # MySQL 中如何解决深度分页的问题? # 总结分析 # 什么是深分页? 定义:深度分页问题是在数据库查询中,访问分页查询结果集后面部分(深层页码)时出现的性能问题。 示例:以数百万条记录的表分页展示为例,当用户请求第 10000 页(pageSize 为 10)数据时,SQL 语句为 LIMIT 99990, 10,数据库需先扫描前 99990 条记录,导致性能显著下降。 起始 ID 计算:起始 ID = (页数 - 1) * 每页项目数 + 1 ,并以不同页数为例说明,如第 10000
9.9k9 分钟

2025-01-15🌱上海: ☀️ 🌡️+4°C 🌬️↓19km/h # MySQL 中有哪些锁类型? # 简要回答 在 MySQL 中,主要有以下几中锁类型: 行级锁:对特定行加锁,适合高并发,允许并发访问不同行。 表级锁:对整个表加锁,用于需保证完整性的小型表,加锁时其他事务无法读写。 意向锁:表锁,分意向共享锁(IS)和意向排它锁(IX),用于行级锁与表级锁结合。 共享锁:允许多个事务并发读,不允许修改,释放后其他事务才能获排它锁。 排它锁:只允许一个事务读写,其他事务需等待排它锁释放。 元数据锁(MDL):保护数据库对象元数据,防止 DDL 操作时被修改。 间隙锁
8.9k8 分钟

2025-01-15🌱上海: ☀️ 🌡️+4°C 🌬️↓19km/h # MySQL 中的事务隔离级别有哪些? # 事务的隔离级别 读未提交(READ UNCOMMITTED) 是最低的隔离级别,在这种隔离级别下,一个事务可以读到另一个事务未提交的数据。这种隔离级别下会存在幻读、不可重复读和脏读的问题。 读已提交 (READ COMMITTED) 在一个事务修改数据过程中,如果事务还没提交,其它事务不能读该数据。所以,这种隔离级别是可以避免脏读的发生的,但是可能会引发不可重复读问题,即在同一个事务中,相同的查询可能返回不同的结果。 可重复读 (REPEATABLE REA
6.9k6 分钟

2025-01-15🌱上海: ☀️ 🌡️+4°C 🌬️↓19km/h # MySQL 是如何实现事务的? # 简要回答 主要是通过锁、Redo log、Undo Log 、MVCC 来实现事务 通过事务的特性来分析 原子性: undo log(回滚日志),它会记录事务的反向操作,也就是保存数据的历史版本,用于事务的回滚,可以在事务执行失败之后恢复之前的数据,实现原子性和隔离性 一致性:通过原子性、隔离性、持久性来达到一致性的目的 隔离性: Mysql 利用锁机制,通过对数据并发修改的控制,满足事务的隔离性。 MVCC(多版本并发控制),满足了非锁定读的需