跳至主要內容
JUC-ThreadLocal详解

简单实用

  • 提供一个简单例子来使用 ThreadLocal
  • 声明 ThreadLocal,比如:private static final ThreadLocal<Object> threadLocal = new NamedThreadLocal<>("logs");
  • 先暂时省略 set 步骤,当需要 threadLocal 的时候,我们通常是:threadLocal.get()

threadLocal.get()

  • 先看代码:

HFwas...小于 1 分钟
JUC-线程池详解

创建线程池

  • 通过 Executor 框架的工具类 Executors 创建线程池
  • 通过 ThreadPoolExecutor 构造函数创建

ThreadPoolExecutor

构造函数

  • ThreadPoolExecutor 有七个参数,其中核心参数有三个:
    • corePoolSize:核心线程数量
    • maximumPoolSize:最大线程池数量
    • workQueue:工作队列
  • 其他参数:
    • keepAliveTime:空闲线程存活时间
    • unit:keepAliveTime 参数的单位
    • threadFactory:线程工厂
    • handler:线程的拒绝策略

HFwas...大约 2 分钟
MySql-日志

redo log

结构

  • redo log日志结构如下图所示:
image-20250518182237011
  • 字段含义:
    • type:该条 redo log 的类型
    • space id:表空间ID
    • page number:页号
    • data:该条 redo log的数据

undo log

bin log


HFwas...小于 1 分钟
MySql-记录结构

测试数据库版本:5.7.34

执行show variables like '%row_format%';查看当前版本支持的 row 格式,例如:

image-20250513205922624

HFwas...小于 1 分钟
MySql-存储引擎

执行select version();查看当前 mysql 版本,我本地版本是5.7.41

基础架构

  • 连接器
  • 查询缓存
  • 分析器
  • 优化器
  • 执行器
  • 存储引擎

存储引擎

  • 执行show engines;查看当前 MySql 的所有引擎列表
image-20250512210428597

HFwas...小于 1 分钟
MySql-执行计划

MySql 给我们提供了 explain 命令来分析 Sql 语句的性能,

分析步骤

获取需要分析执行计划的 Sql 语句,加 expalin 命令,格式explain sql语句,会得到以下的结果:

mysql> explain select * from users; 
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key          | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | users | NULL       | index | NULL          | idx_username | 259     | NULL |    1 |   100.00 | Using index |
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

mysql> 

HFwas...大约 3 分钟
Redis-常见的阻塞原因

O(N)命令

Redis 常见的命令执行速度都很快,算法复杂度基本都在 O(1) 级别,但是也有一些算法复杂度在 O(n) 级别,再加上数据量过大的情况,就会导致很慢,比如

  • hash 结构的 hgetall 命令
  • keys *命令

排查:

  • 获取慢查询:Redis 提供了slowlog get {n}命令来获取最近的 n 条慢查询命令,默认会将执行超过10ms的命令记录到队列当中,
  • 可以通过info commandstats命令来分析命令的不同执行时间,可以通过查看字段 usec_per_call 平均耗时来排查,单位是微秒

HFwas...大约 3 分钟
Redis-内存管理

Redis 的内存管理主要从以下两个方面入手:

  • 内存上限
  • 回收策略

内存上限

Redis 提供了 maxmemory 参数来限制最大可用内存,限制的目的有:

  • 用于缓存场景,当超出内存上限时使用 LRU 等删除策略释放空间
  • 防止使用量超过服务器物理内存

更改内存上限:

  • 可以通过命令config set maxmemory进行动态修改最大可用内存

回收策略


HFwas...大约 2 分钟
Redis-Cluster 集群高可用

Redis 之前的集群方案一般有两种:

  • 客户端分区方案,优点是分区逻辑可控,缺点是需要自己处理数据路由、高可用、故障转移等问题
  • 代理方案,优点是简化客户端分布式逻辑和升级维护便利,缺点是加重架构部署复杂度和性能损耗

Redis Cluster 优势

Redis Cluster 缺点

  • key 批量操作支持有限。如 mset、mget,目前只支持相同 slot 值的 key 执行批量操作
  • key 事务操作支持有限。同1,只支持相同 slot 值的 多key 的事务操作
  • key 作为数据分区的最小粒度,因此不能将一个大的键值对象如 hash、list 等映射到不同的节点
  • 不支持多数据空间。集群模式只能使用一个数据库空间,即 db0
  • 复制结构只支持一层,从节点只能复制主节点,不支持嵌套树状复制结构

HFwas...大约 3 分钟
Redis-Sentinel集群高可用
  • Redis Sentinel 是 Redis 的高可用方案

主从复制

作用

  • 将主节点的数据同步给从节点,作为主节点的一个备份,一旦主节点出现故障,从节点作为后备可以顶上去,并且保证数据尽量不丢失,主从复制是最终一致性
  • 从节点可以扩展主节点的读能力,一旦主节点不能承受大并发量的读操作,从节点可以分担压力

问题

  • 一旦主节点发生故障,需要手动晋升从节点为主节点。需要修改调用方的主节点地址。还需要命令其他从节点去复制新的主节点

HFwas...大约 4 分钟