数据库速查
MySQL 命令、SQL 语法、用户权限、备份恢复、主从调优 + Redis 命令与场景:数据库开发与运维双视角速查。
MySQL 基础与连接
客户端连接、库表查看与状态诊断
mysql 命令行客户端热门
MySQL 官方命令行客户端:交互执行 SQL、批量跑脚本、做巡检导出;支持 -e 直接执行、-D 指定库、多种输出格式与选项文件。
SHOW PROCESSLIST 查看连接与运行中 SQL热门
实时列出所有连接的账号、来源、库、状态与已执行时长,是定位长事务、慢查询与连接堆积的第一手段。
连接报错 1045 Access denied 排错
认证或授权失败:账号不存在、来源主机不匹配、密码错误或账号被锁定。核心是先把「用户名@来源主机」这个完整身份对齐。
SHOW DATABASES 与库表清单查看
盘点实例有哪些库、库下有哪些表;SHOW 系列命令最直接,information_schema.tables 可带引擎、行数与容量排序。
连接报错 2003 Can't connect to MySQL server
ERROR 2003 表示客户端建立不了 TCP 连接,排查顺序:服务是否启动、端口是否监听、bind-address、防火墙与云安全组。
mysql -e 非交互执行与输出格式
用 -e 一次性执行 SQL 就退出,适合脚本与巡检;-B 制表符适合喂给 awk,-E 纵向适合宽表,-N 去掉列名行。
SHOW VARIABLES 查看与核对参数
查看当前生效参数(版本、字符集、缓冲池、连接上限、binlog、sql_mode),核对配置文件与运行态是否一致。
字符集与排序规则:utf8mb4 全链路统一
乱码和 emoji 写不进去的根因几乎都是字符集链路不一致:客户端、连接、结果、库、表五层要统一 utf8mb4。
SHOW STATUS 状态变量速查
实例运行计数器:连接数、查询量、锁等待、缓冲池读写等;判断负载瓶颈与容量趋势的一手数据。
慢查询日志与通用日志开启
slow log 记录超过 long_query_time 的语句(性能分析必开);general log 记录每一条到达服务端的语句,仅短时排障用。
mysqladmin 实例管理命令
官方管理工具:看状态与线程数、ping 探活、建库删库、刷新权限与日志、干净关闭实例,是轻量脚本运维的常用手。
KILL 终止会话与语句
KILL QUERY 只结束当前语句、保留连接;KILL CONNECTION 断开整个会话。批量清理前先确认业务影响。
MySQL 服务启停与开机自启
Linux 下用 systemd 管理 mysqld:启动、停止、重启、查看状态、设置开机自启;重启前必须评估业务与复制影响。
mysql 安全输入密码的三种方式
命令行携带明文密码会泄露到历史记录与进程列表;推荐 mysql_config_editor 加密登录路径,其次 600 权限选项文件,环境变量仅限测试。
SHOW CREATE TABLE 查看建表语句
取得表的完整 DDL(引擎、字符集、索引、外键、注释),是核对线上表结构与跨环境复制结构的标准手段。
mysqlbinlog 查看二进制日志
binlog 是数据变更流水,也是复制与按时间点恢复(PITR)的基础;mysqlbinlog 把二进制内容解码为可读文本。
max_connections 与连接数管理
连接上限与 Too many connections 报错:排查现有连接来源、调大上限或优化连接池,Emergency 超级账号可应急进入。
SHOW INDEX 查看表索引
列出索引名称、列序、唯一性、Cardinality 与索引类型,用于核对索引现状和评估选择性。
PROCESSLIST 常见 State 含义速查
连接卡在哪一步看 State:Sending data 多为扫描/回表,Waiting for lock 是锁等待,Creating sort index 在排序,copying to tmp table 常关联磁盘临时表。
sys 库常用诊断视图
官方把 performance_schema 封装成人话视图:资源消耗排行、锁等待链、冗余与未使用索引,一查即得。
DESCRIBE 与 SHOW COLUMNS 查看列结构
快速查看列名、类型、NULL、键、默认值与额外属性;SHOW FULL COLUMNS 额外带 Collation、权限与注释。
performance_schema 快速上手
MySQL 自带运行时监控库:当前谁在跑、等什么锁、哪类语句最耗资源,全部可以用 SQL 查,不必翻日志。
MySQL 错误日志(error log)
记录启动关闭、崩溃、复制中断与死锁等关键事件;位置由 log_error 决定,是排障第一现场。
SHOW ENGINE INNODB STATUS 读懂引擎报告
InnoDB 全量运行报告:最近一次死锁详情、事务与锁等待、缓冲池命中、I/O 与后台线程状态,疑难卡顿的核心证据。
时区设置与时间显示排查
时间函数结果取决于会话时区:云数据库与容器常是 UTC,业务按东八区理解就会出现「时间差 8 小时」。
LOAD DATA 批量导入与 mysqlimport
大批量数据导入的首选:LOAD DATA LOCAL INFILE 读客户端文件,服务端版本读服务器路径;比逐条 INSERT 快一个数量级。
连接报错 socket 路径不一致
本地连接走 Unix socket 而非 TCP:socket 文件缺失、路径不符或权限不足都会报 2002;客户端与服务端必须指向同一个 socket 文件。
MySQL 配置文件加载顺序与常用段
my.cnf 按固定顺序加载:/etc/my.cnf → /etc/mysql/my.cnf → $MYSQL_HOME → ~/.my.cnf 等;mysqld 段管服务端,client 段管所有客户端工具。
SHOW WARNINGS 与 SHOW ERRORS 获取细节
语句执行成功但结果异常时,用 SHOW WARNINGS 看截断、隐式转换等提示;出错后用 SHOW ERRORS 拿到精确定位。
连接超时与空闲回收参数
连接被莫名断开多与超时参数有关:wait_timeout、interactive_timeout、net_read_timeout,以及中间件/负载均衡的空闲回收。
mysql 交互会话常用快捷键与命令
交互模式内置大量反斜杠命令:\G 纵向显示、\c 取消输入、\s 看状态、source 执行脚本、tee 记录会话,熟练后效率翻倍。
SELECT 计算与虚拟表 dual
不需要表就能算表达式、查变量、做健康探测:SELECT 1; 是最轻量的连通性检查,dual 表是一行虚拟表可作 FROM 对象使用。
USE、quit 与 help contents 会话基础命令
切换数据库用 USE,退出用 quit/\q,help contents 能列出所有服务端帮助主题、help 加关键字看语法,离线也能查。
MySQL TLS 加密连接与状态检查
8.0 默认支持 TLS:可查会话是否加密、证书信息,并用 REQUIRE SSL 强制特定账号必须加密连接。
查看版本、编译信息与发行版
对接问题先对齐版本:VERSION() 给出版本号,@@version_comment 反映发行版(Oracle/Percona/MariaDB),差异决定可用语法。
忘记 root 密码:跳过授权表救援
极端手段:临时以 --skip-grant-tables 启动改密码,改完立即恢复;仅限本地救援,且必须断开网络暴露面。
SQL 语法
增删改查、连表、聚合与常见函数
SELECT 基础查询与列投影热门
SQL 查询的起点:指定列、给列起别名、用表达式与常量列;生产环境避免 SELECT * 以减少回表与网络开销。
WHERE 条件过滤与运算符热门
用比较、逻辑、范围与空值运算符筛选行;NULL 判断必须用 IS NULL,任何与 NULL 的比较结果都是未知。
INNER JOIN 内连接热门
只返回两表都能匹配上的行;连接条件写在 ON(或等价的 WHERE),是最常用也最容易被优化器重排的连接类型。
LIMIT 分页与 OFFSET 深翻页问题
限制返回行数并支持偏移;大偏移(LIMIT 1000000, 20)会扫描大量行,应改用基于游标的键集分页。
LEFT / RIGHT JOIN 外连接
保留一侧全部行,另一侧无匹配补 NULL;判断是否存在匹配时要在 WHERE 里排除 NULL 或改用 NOT EXISTS。
INSERT 插入数据(单行/多行/部分列)
向表写入行:支持单行、多行批量与 INSERT ... SELECT;批量插入显著减少往返与 binlog 开销。
事务:BEGIN / COMMIT / ROLLBACK
把多条语句打包成原子单元;InnoDB 默认 REPEATABLE READ,配合行锁与 MVCC 保证一致性。
ORDER BY 排序与多列排序
按一列或多列排序,支持 ASC/DESC 与表达式;排序列有合适索引时可用索引顺序避免 filesort。
GROUP BY 分组统计
按一列或多列把行分组并配合聚合函数计算;8.0 默认开启 ONLY_FULL_GROUP_BY,选择列表必须与分组列一致或用聚合函数。
UPDATE 更新数据与安全实践
修改已有行:务必带 WHERE、先 SELECT 验证条件、最好开启事务或限制行数;批量更新要关注锁范围与主从延迟。
EXPLAIN 读执行计划:type / key / rows / Extra
用 EXPLAIN 看优化器怎么执行:访问类型、命中索引、估算行数与额外动作(filesort、temporary)。调优从它开始。
聚合函数 COUNT / SUM / AVG / MAX / MIN
五大聚合函数覆盖计数、求和、均值与极值;COUNT 区分列与星号语义、COUNT 对 NULL 的处理是常见考点。
CREATE TABLE 建表语法与设计要点
定义列、类型、约束、索引与表选项;InnoDB + utf8mb4 是默认组合,主键与聚簇索引设计直接决定后续性能。
CREATE INDEX 索引创建与使用策略
为查询条件、排序与连接列建索引:复合索引遵循最左前缀,覆盖索引可免除回表,但索引不是越多越好。
子查询(标量 / IN / EXISTS 变体)
子查询可出现在 SELECT 列表、WHERE、FROM;相关子查询与外层行数挂钩,能用 JOIN 改写时通常更快。
DELETE 与 TRUNCATE 删除数据
DELETE 可带条件、逐行记录 binlog(可回滚);TRUNCATE 直接重建表、不可回滚、秒级清空整表并重置自增。
ALTER TABLE 修改表结构
增删列、改类型、加索引、改表选项;8.0 支持 ALGORITHM=INSTANT 在线加列,但多数变更仍需重建表并影响写入。
IN 与 LIKE:集合匹配与模糊匹配
IN 做集合匹配(命中索引仍可走 range);LIKE 前置通配符 % 会失效索引,全文检索需求应上 FULLTEXT 或外部搜索。
INSERT IGNORE / ON DUPLICATE KEY UPDATE / REPLACE
三种冲突处理:IGNORE 跳过(可能吞掉其他错误)、ON DUPLICATE KEY UPDATE 更新(推荐)、REPLACE 先删后插(会触发级联)。
日期时间函数:NOW / CURDATE / DATE_FORMAT / DATE_ADD
取当前时间、格式化、日期加减与差值计算;日期函数用在索引列上会阻断索引,过滤要改写为范围条件。
DISTINCT 去重与去重优化
对结果集整行去重;本质是排序或哈希去重,昂贵。想对单列去重通常可以用 GROUP BY 或 EXISTS 改写。
HAVING 分组后过滤
对聚合结果过滤只能用 HAVING;能提前到 WHERE 的条件尽量下推,HAVING 只留聚合判断。
CASE WHEN 条件表达式
在 SQL 内做分支:简单 CASE 对值比较,搜索 CASE 对条件判断;常用于分桶统计与结果转义,也是行列转换的基础。
SELECT ... FOR UPDATE / FOR SHARE 加锁读
显式加锁保证读-改-写的原子性:FOR UPDATE 排他锁、FOR SHARE 共享锁;加锁读会阻塞其他写。
字符串函数:CONCAT / SUBSTRING / REPLACE / TRIM / LENGTH
拼接、截取、替换、去空白与长度;函数作用于列会让索引失效,能用前缀匹配替代就不要包函数。
NULL 处理函数:IFNULL / COALESCE / NULLIF
空值兜底与判定:IFNULL 二元兜底、COALESCE 多级兜底、NULLIF 相等时返回 NULL;聚合与运算前做兜底避免整列 NULL。
窗口函数:ROW_NUMBER / RANK / SUM OVER(8.0)
在结果集上做排名、累计与移动聚合而不折叠行;比自连接写法更清晰也更快,是 8.0 升级的重要理由。
UNION 与 UNION ALL 集合运算
纵向拼接两个结果集:UNION 去重(有排序成本)、UNION ALL 保留全部(默认首选);列数类型必须兼容。
CTE(WITH 子句)与递归 CTE
把复杂查询拆成可读的命名子查询;递归 CTE 用 WITH RECURSIVE 展开树形/层级数据(组织架构、分类、物料 BOM)。
EXPLAIN ANALYZE 与性能诊断链路
8.0.18+ 的 EXPLAIN ANALYZE 实际执行并在计划上标注真实耗时与行数估计误差,是 SQL 性能诊断的完整闭环。
事务隔离级别与并发现象
四种隔离级别的取舍:脏读、不可重复读、幻读;InnoDB 在 RR 下用间隙锁减少幻读,代价是更多锁等待。
JSON 函数:JSON_EXTRACT / ->> / JSON_SET
MySQL 5.7+ 原生 JSON 类型与函数:路径提取、更新、数组遍历;高频查询的 JSON 字段可建生成列索引。
SQL 常见报错对照与排查
高频 SQL 报错的定位路径:1064 语法、1054 未知列、1146 表不存在、1213 死锁、1205 锁等待超时、1114 结果集过大。
sql_mode 常见模式与排错
sql_mode 决定严格程度与语法兼容:严格模式拒绝坏数据、ONLY_FULL_GROUP_BY 拒绝歧义分组、ANSI_QUOTES 改双引号语义。
约束与外键:主键 / 唯一 / 非空 / 外键
用约束把数据正确性交给数据库:主键唯一标识、UNIQUE 防重复、NOT NULL 防缺失、外键保引用完整;外键在高并发写入场景要权衡。
排序与临时表:filesort 与 temporary 的优化
ORDER BY / GROUP BY / DISTINCT 无索引支撑会走 filesort 或临时表;优化方向是让排序分组列与索引前缀对齐。
隐式类型转换与索引失效
字符串列与数字比较、字符集不同的连接列都会触发隐式转换:既可能扫全表又可能拿到错误结果,是慢 SQL 的隐蔽来源。
CROSS JOIN 与 SELF JOIN
CROSS JOIN 是无条件笛卡尔积(慎用);SELF JOIN 是同一张表自连接,常用于层级与前后行比较。
SHOW / information_schema 元数据联动
除了 SHOW 命令,大量结构信息可直接查 information_schema:列、索引、约束、表大小、字符集,一网打尽。
锁等待与死锁的 SQL 级分析
用 sys.innodb_lock_waits 找到阻塞链,用 performance_schema.data_locks 看锁位点,最后用固定顺序 + 短事务根治。
表别名与列别名
用 AS 或空格给表列起短别名,让多表查询更清晰;别名还常用于自连接区分同一张表的两份引用。
数值函数:ROUND / CEIL / FLOOR / ABS / 取模与类型转换
数值计算与取舍、类型转换 CAST/CONVERT;金额与精算用 DECIMAL,浮点等高比较要做容差处理。
判断索引是否真的被用上
三步确认:EXPLAIN 看 key 命中、优化器 trace 看选择理由、索引使用统计确认长期效果;建了不用的索引只会拖慢写入。
视图 VIEW:创建、查询与安全边界
把常用查询封装为命名视图:简化复杂 SQL、限制列级可见性;视图不存数据(普通视图),查询时实时展开。
预处理语句 PREPARE / EXECUTE / DEALLOCATE
服务端预处理可复用于高频 SQL;应用层参数化查询(占位符)是防注入的根本手段,比手工拼接字符串安全得多。
存储过程与存储函数基础
把逻辑放在数据库侧:封装批量作业、减少网络往返;但调试、版本管理与移植性较差,业务逻辑仍建议放应用层。
临时表与派生表(FROM 子查询)
临时表用于会话内暂存中间结果;派生表把子查询当作表参与连接;8.0 优化器常把派生表合并展开。
查询改写常用套路
把 OR 改 UNION、把子查询改 JOIN、把 COUNT 估算化、把深分页改游标;改写前先 EXPLAIN 对照,避免凭感觉重写。
多表 UPDATE / DELETE JOIN 语法
跨表条件更新与删除用 JOIN 子句表达;同一条 UPDATE 只会更新每行一次,语义与直觉不同要留意。
表与列字符集转换(ALTER 转换)
把 latin1 老表迁到 utf8mb4:ALTER TABLE … CONVERT TO CHARACTER SET utf8mb4 会重建并转换全部文本列,大表要评估时间与空间。
索引提示与连接顺序提示(USE INDEX / STRAIGHT_JOIN)
优化器偶尔选错索引或连接顺序,可用 USE/IGNORE/FORCE INDEX 与 STRAIGHT_JOIN 强行干预;但它们是最后手段而非常态。
表空间与碎片整理:OPTIMIZE 与 ANALYZE
长期大量增删改会留下碎片与空洞:OPTIMIZE TABLE 重建表回收空间(近似 DDL,慎用于生产),ANALYZE TABLE 刷新统计信息提升计划质量。
用户与权限
账号管理、授权回收与安全基线
GRANT 授权(库表列与全局)热门
按最小权限原则授予:全局 *.*、库级 db.*、表级 db.tbl、列级与存储过程级;GRANT 后 8.0 默认自动生效无需 FLUSH。
CREATE USER 创建账号(用户名@主机)
MySQL 账号由用户名与来源主机共同定义:'app'@'%' 与 'app'@'localhost' 是两条独立账号,密码策略与插件随账号设置。
root 账号加固与专用账号拆分
root@% 或 root 直达业务系统是重大风险:root 只允许 localhost、业务使用专用最小权限账号、运维走跳板机与个人账号。
REVOKE 回收权限与账号降级
回收权限使用 REVOKE 语法与授权对称;回收全部权限账号仍存在(需另行 DROP),权限变更后要核实实际生效。
ALTER USER 改密码、解锁与资源限制
改密码、解除锁定、切换认证插件、设置资源限制(每小时查询数/连接数)与 SSL 要求;密码修改后连接池需重连。
账号安全基线检查清单
一次巡检覆盖:匿名用户、空密码、% 通配、过期凭据、过度授权、锁定账号与遗留测试账号,输出可复核的整改单。
角色 ROLE 与 SET ROLE 权限复用
8.0 角色把权限模板化:建角色、授角色给账号、账号激活角色,权限变更只改角色一处,回收账号时统一清理。
密码复杂度与过期策略(validate_password)
用 validate_password 组件强制强度:长度、大小写数字符号组合、字典校验;账号级还支持密码过期与历史密码复用限制。
DROP USER / RENAME USER 账号生命周期
账号下线用 DROP USER(同时清理权限)、改用户名用 RENAME USER;离职或下线系统时同步清理账号能消除隐蔽入口。
权限报错 1142 / 1227 / 1370 排查
遇权限报错先确认「当前账号+来源主机+目标对象」三元组,再用 SHOW GRANTS 对照缺失项;1227 多指需要 SUPER/SYSTEM_VARIABLES_ADMIN 类动态权限。
权限表与实用查询(mysql.user/db/tables_priv)
权限落库在 mysql 系统库;日常用 SHOW GRANTS,批量审计直接查表更全面,但系统表结构随版本变化,写脚本要谨慎。
忘记普通账号密码与密码轮换
管理员重置:ALTER USER … IDENTIFIED BY;轮换要连业务配置、定时任务、监控探活一起改,遗漏就会在下次重连时爆雷。
账号管理常见实操问答
把高频问题固化:怎么看某账号能做什么、如何只给单表读写、如何批量清理测试账号、账号被锁如何自救,答案都要落到 SQL。
审计日志与操作留痕(audit log / general log)
合规场景需要记录谁在什么时间执行了什么:社区版可用 general log 短时取证,企业版 audit_log 或第三方审计插件长期留存。
授权层级与生效顺序(user → db → tables_priv → 会话)
权限校验顺序:全局权限 → 库权限 → 表/列权限逐层合并,最终取并集;理解层级才能解释「为什么只授了库权限却能查表」。
SELECT INTO OUTFILE 与 secure_file_priv 限制
把查询结果导出为服务器端文件;受 secure_file_priv 目录白名单限制,且需要 FILE 权限,是敏感操作。
MySQL 8.0 动态权限与 SYSTEM_USER
8.0 把 SUPER 拆成细粒度动态权限(SYSTEM_VARIABLES_ADMIN、BACKUP_ADMIN、REPLICATION_APPLIER 等),最小授权可按需精确到操作。
skip_name_resolve 与主机名解析
开启 skip_name_resolve 后账号主机部分只能用 IP/通配,不再做 DNS 反解:登录更快且避免解析故障导致连不上。
账号强制 TLS 连接与证书要求
对高敏账号设置 REQUIRE X509/SSL/SUBJECT 要求加密与证书校验;结合客户端 ssl-mode 可做到端到端身份验证。
管理员账号与委托授权(GRANT OPTION)
GRANT OPTION 允许把权限继续转授;委托管理常见于多团队共用实例,但必须限制范围并记录,否则权限扩散不可控。
代理用户与 mysql.proxies_priv 概念
代理用户允许一组账号以另一账号身份执行(服务层免密协作场景);企业内多系统共享连接时能避免密码扩散。
备份与恢复
mysqldump、xtrabackup 与恢复演练
mysqldump 全库逻辑备份热门
官方逻辑备份工具基础用法:把所有库的建表语句与数据导出为 SQL 文本,官方自带、跨版本迁移方便,是中小数据量场景的首选。
mysqldump 一致性快照(--single-transaction)热门
InnoDB 场景必备参数:导出前开启 REPEATABLE READ 一致性快照,多表导出期间不锁表,得到同一时间点的数据视图。
mysqldump 备份的恢复导入
恢复就是把 SQL 文本喂回服务器:mysql 重定向、source 命令、或直连管道;大库恢复要临时关 binlog 提速并预留维护窗口。
时间点恢复(PITR)全流程
标准流程:全备恢复到新实例 → 用归档 binlog 重放到目标时间点 → 校验业务数据 → 切流;目标时间点要精确到秒或具体事务边界。
mysqldump 单库备份(-B 与不带 -B)
按库导出有两种模式:带 --databases 会写入建库与 USE 语句,适合跨实例迁移;不带则文件里没有 USE,恢复时必须手工指定目标库。
mysqldump 的 GTID 处理(--set-gtid-purged)
GTID 环境备份必须评估该参数:AUTO/ON 会写入 gtid_executed 信息,OFF/COMMENTED 则剥离,选择错误会导致导入报错或从库位点异常。
XtraBackup 物理热备概览
Percona 出品的开源物理备份工具:直接拷贝 InnoDB 数据文件并在拷贝过程中持续追 redo,备份过程不阻塞 DML,是大中型库的主流备份方案。
XtraBackup 恢复(copy-back / move-back)
把 prepare 完成的备份拷回数据目录:--copy-back 保留备份目录、--move-back 直接移动;恢复前 datadir 必须为空且权限归 mysql。
XtraBackup prepare(应用 redo 到一致状态)
恢复前的必做步骤:--prepare 在备份副本上重放 redo,把数据文件推进到一致状态;增量链要按顺序逐层 apply-log。
mysqldump 记录复制位点(--source-data)
用 --source-data=2 把 binlog 位点以注释形式写进备份头部:构建从库或做时间点恢复时,可从该位点继续重放 binlog。
备份策略设计(3-2-1 与 RPO/RTO)
把「怎么备」变成「怎么保证能恢复」:全量+增量+binlog 三层组合,按 RPO/RTO 目标定频率与保留,异地留存防单点灾难。
XtraBackup 增量备份
基于上一次备份的 LSN 只拷贝变化页:--incremental-basedir 指向基准备份目录,层层叠加形成增量链,备份体积与耗时大幅下降。
mysqldump 单表与多表备份
按表粒度导出:库名后跟一个或多个表名即可,适合临时备份几张大表、迁移单表或导出给业务方做分析。
恢复演练流程(Restore Drill)
按季度对真实备份做一次完整恢复:在隔离环境重建实例、恢复数据、核对行数与业务抽样,实测 RTO 并固化到 Runbook。
binlog 归档备份方案
PITR 的命脉是 binlog 全量归档:定期拷贝 + 实时流式拉取(mysqlbinlog --stop-never)双保险,归档到与数据不同故障域的存储。
mysqldump 导出存储过程与事件(--routines --events)
存储过程、函数与事件对象默认不在备份范围内:不加这两个选项,恢复出来的库会缺程序性对象,属于常见的「备份不全」事故。
mysqldump 锁与流式导出(--quick / --lock-tables)
--quick 逐行流式导出不缓存整个结果集,大表必开;--lock-tables 与 --single-transaction 语义冲突,线上备份应跳过锁表。
XtraBackup 全量备份
标准全备命令:--backup 指定目标目录,--parallel 开并行拷贝,完成后核对 xtrabackup_checkpoints 与备份日志尾部的 completed OK。
mysqlbinlog 常用参数
重放控制四件套:--start/stop-datetime(时间)、--start/stop-position(位点)、--database(过滤库)、--skip-gtids(剥离 GTID,按需);配套 --verbose 解析行事件。
mysqldump 压缩与管道传输
大库备份通常接 gzip 压缩或直接管道传到备机:省磁盘、省带宽;配合 pipefail 才能可靠捕获管道中段的失败。
备份完整性校验
备份文件生成≠可恢复:通过尾部标记、压缩完整性、校验和、抽样导入四步确认,把坏备份拦在事故之前。
大库备份的取舍与提速要点
上百 GB 的库要换思路:物理备份替代逻辑导出、从从库备份分摊主库压力、分区表分而治之,并预留恢复(比备份更慢)的窗口。
binlog 格式选择(ROW/STATEMENT/MIXED)
复制与恢复都依赖 binlog:ROW 记录行级变化(8.0 默认,最安全),STATEMENT 记录 SQL 原文(体积小但不确定性大),MIXED 混合。
备份失败常见原因排查表
备份失败集中在五类:磁盘满、权限不足、锁等待、网络中断、工具版本错配;按报错关键字对号入座,逐一排查。
mysqldump 只备份表结构(--no-data)
用 --no-data(-d)只导出建表语句:用于建库评审、跨环境初始化 schema、对比结构差异,体积小、执行快。
备份脚本与定时任务(cron + 告警)
生产备份靠定时任务兜底:flock 防重入、日志留痕、退出码与文件大小双重校验,失败即告警,杜绝「以为在备、其实早挂了」。
binlog 清理与过期策略
binlog 不能无限堆积:设置过期时间自动清理(binlog_expire_logs_seconds,8.0 默认 2592000 秒=30 天),或按文件手工 PURGE;主从环境必须保留足够窗口。
逻辑备份与物理备份选型对比
逻辑备份(mysqldump/mydumper)产出 SQL 文本、跨版本友好但慢;物理备份(xtrabackup)直接拷贝文件、快但绑定版本与文件格式。选型看规模与恢复目标。
mysqldump 只备份数据(--no-create-info)
用 --no-create-info(-t)只导出 INSERT 语句,适合往已有 schema 的表里灌数据、做数据级同步或补数。
mysqldump 字符集选项(--default-character-set)
指定客户端字符集保证导出文件编码正确:utf8mb4 环境显式声明可避免中文乱码与双重编码问题,跨版本迁移尤为重要。
备份专用账号与最小权限
备份账号按需授权:SELECT/SHOW VIEW/TRIGGER/EVENT/LOCK TABLES/RELOAD/REPLICATION CLIENT/PROCESS,避免用 root 跑脚本扩大泄漏面。
binlog 文件位置与大小管理
binlog 默认与 datadir 同盘(log_bin 变量可指路径),单文件大小由 max_binlog_size 控制;用 SHOW BINARY LOGS 查看清单与体积。
跨服务器恢复/迁移流程
把生产数据搬到新实例的标准动作:目标版本核对 → 账号与参数预置 → 恢复数据 → 重建复制/校验应用连接;全程留回退路径。
mysqldump 排除表(--ignore-table)
用 --ignore-table=库.表 排除不需要备份的表(大日志表、缓存表、分表归档),每个表一条参数,支持重复出现。
GTID 模式下的 PITR 注意点
GTID 实例的 binlog 带 GTID_NEXT 事务头:整段重放用 gtid_executed 定位;重复重放要么跳过已执行 GTID,要么用 --skip-gtids 剥离后按位点重放。
升级前的备份与回退预案
大版本升级前必做:逻辑全备(保底可读)+ 物理全备(快速回退)+ 升级检查器(mysqlcheck --check-upgrade)三件套,任何异常可退回原版本。
mysqldump 条件导出(--where 按行过滤)
用 --where 给导出加 WHERE 条件:按时间范围导出增量、给业务方导出子集数据都靠它,语法与 SELECT 的 WHERE 完全一致。
mydumper / myloader 并行逻辑备份
第三方多线程逻辑备份工具:并行导出、分块(chunk)拆表、直接压缩,大型库上比单线程 mysqldump 快数倍,恢复侧对应 myloader。
XtraBackup 压缩与加密备份
备份产物压缩省磁盘(--compress + --decompress),敏感数据加密(--encrypt=AES256 + --encrypt-key-file);恢复端分别解压/解密。
从逻辑备份中恢复单表
只有整库 dump 但要救一张表:先找表在文件中的起止行区间,抽取到临时库验证后再进生产;mydumper 目录备份可直接定位单表文件。
mysqldump 插入语句批量控制(--extended-insert)
默认把多行合并成批量 INSERT,恢复快、文件小;--skip-extended-insert 拆成逐行 INSERT,便于 diff、定位坏行,代价是恢复变慢。
XtraBackup 部分备份(库/表级)
用 --databases 或 --tables 只备指定库表:适合单库迁移、重点业务加备;注意部分备份不支持带过滤条件的增量。
mysqlbinlog 远程拉取与多文件处理
直接从运行中的实例拉 binlog:--read-from-remote-server 系列参数支持实时流式(--stop-never)与原始文件(--raw)两种模式,适合归档与远程分析。
云盘快照备份与一致性
云数据库/云盘快照是最省事的方案,但「运行中直接拍快照」的崩溃一致性对非事务引擎不保证;稳妥做法是锁表快照或快照+PXB 双层。
mysqldump 触发器选项(--triggers / --skip-triggers)
触发器默认随表导出,位于建表与插数据之后;--skip-triggers 用于只搬数据或往已有库补数据时避免触发器定义冲突。
MySQL Shell util.dumpSchemas 并行备份
MySQL Shell 8.0 内置的逻辑备份工具:聚合 mysqldump 思路并支持并行、压缩、断点续传、一致性快照,适合云上与本地大库。
XtraBackup 版本选择与安装校验
版本必须与 MySQL 对应:8.0 实例用 Percona XtraBackup 8.0,5.7 用 2.4;装完先跑 --version 与最小备份验证工具链可用。
XtraBackup LSN 与 checkpoints 解读
xtrabackup_checkpoints 记录每份备份的 LSN 窗口(from/to/last),是增量链衔接与 PITR 定位的依据;backup_type 区分 full/inc。
备份文件加密(gpg/openssl/xtrabackup)
备份携带全量数据,落盘即加密:mysqldump 管道 gpg 对称加密、openssl enc 通用方案、xtrabackup 原生 AES;密钥独立管理。
mysqldump 重建表保护(--add-drop-table)
默认每个表前带 DROP TABLE IF EXISTS,保证恢复时结构干净重建;--skip-add-drop-table 用于把数据追加进已有表或合并多份备份。
XtraBackup 备份账号权限
8.0 最小权限:BACKUP_ADMIN;老式权限组合 PROCESS/RELOAD/LOCK TABLES/REPLICATION CLIENT;账号限制来源主机并单独管理密码。
备份保留与轮转管理
保留策略要写进脚本:按天/周/月分级保留、自动清理老文件、保留清单可审计;清理逻辑必须精确匹配备份目录避免误删。
mysqldump 建库语句控制(-n / -B)
-B(--databases)生成 CREATE DATABASE IF NOT EXISTS 与 USE;-n(--no-create-db)则抑制建库语句,用于恢复到指定库名或合并到已有库。
mysqldump 二进制安全(--hex-blob)
BLOB/BINARY/BIT 等二进制列默认按原始字节输出,遇到非常规字符可能破坏文件;--hex-blob 用十六进制字面量导出,二进制安全。
XtraBackup 8.0 与 2.4 的能力差异
8.0 工具链面向 MySQL 8.0(支持 redo 新格式、加密增强);2.4 适配 5.7,且对 8.0 支持不完整;跨版本恢复(8.0 备 → 5.7 恢复)不受支持。
mariadb-backup(MariaDB 物理备份)
MariaDB 对应的物理热备工具:命令与 XtraBackup 同源(--backup/--prepare/--copy-back),不支持跨家族用于 MySQL。
主从复制与高可用
复制配置、延迟排查与切换
MySQL 复制原理(三线程模型)热门
主从复制由三类线程协作:主库 dump 线程持续推送 binlog,从库 IO 线程写入 relay log,SQL(applier)线程重放。理解线程职责是排查一切复制问题的起点。
SHOW REPLICA STATUS 关键字段详解
复制体检表:线程状态、位点(Read/Exec_Master_Log_Pos)、GTID 集、延迟、错误五大块;出问题先看 Last_IO_Error / Last_SQL_Error 与落后字节数。
CHANGE REPLICATION SOURCE TO 配置复制
8.0 配置复制的主入口:指定源地址与账号,二选一给定位方式(位点 SOURCE_LOG_FILE/POS 或 GTID 的 SOURCE_AUTO_POSITION=1)。
START REPLICA 与首启检查
配好后 START REPLICA:立即检查 IO/SQL 线程是否双 Yes、Seconds 是否收敛、有无报错;首次同步大位点差会跑一段时间属正常。
Seconds_Behind_Source 的真实含义
延迟指标最容易被误读:它只是「SQL 线程当前事件时间戳 - IO 线程最新事件时间戳」,空闲、大事务中途、时钟不同步时都会失真。
计划内主从切换(Switchover)标准流程
计划切换要「先停写、追平、再切」:旧主设为只读停业务写入,等从库完全追平(GTID 集对齐),再把从库提升为主并切换应用连接。
主库复制配置(server_id / log_bin)
主库三件套:全局唯一 server_id、开启 log_bin、binlog_format=ROW;GTID 环境再加 gtid_mode=ON 与 enforce_gtid_consistency=ON。
GTID 配置(gtid_mode 渐进切换)
开启 GTID 不能一步到位:按 OFF → OFF_PERMISSIVE → ON_PERMISSIVE → ON 四步逐级切换,每步确认复制与业务无异常;同时强制 enforce_gtid_consistency=ON。
故障切换(Failover)手动流程
主库宕机时的手动切换:确认故障不可恢复 → 评估可接受的数据丢失窗口 → 提升数据最新的从库 → 隔离旧主(fencing)→ 重建拓扑。
复制故障排查清单(从症状到根因)
复制异常按清单推进:先看 SHOW REPLICA STATUS 两线程与错误码,再查网络/账号/位点/数据冲突,最后才是参数与性能。
Clone 插件快速建从库
8.0.17+ 内置 Clone 插件:从库一键克隆主库的物理数据(含字典与 GTID 状态),不需要停业务、不需要手工 prepare,是最省事的建从库方式。
主从延迟的常见原因清单
延迟排查按五层走:从库硬件(IO/CPU)、大事务、单线程重放 vs 并行、锁竞争(MDL/行锁)、网络与 relay 写入;ROW 格式下重放开销通常是主因。
从库复制配置(relay_log / read_only)
从库同样要唯一 server_id;建议独立 relay log 路径与 log_replica_updates(级联复制需要);read_only + super_read_only 防止业务误写。
GTID 自动定位(SOURCE_AUTO_POSITION)
AUTO_POSITION=1 让从库用 GTID 差集自动找起点:不再依赖手工位点,换源/切换/重建从库都不需要担心字节偏移。
复制跳错事务(GTID 与其他方式)
跳过事务是危险但必要的能力:GTID 模式用空事务占位(SET GTID_NEXT + BEGIN/COMMIT),非 GTID 用 sql_replica_skip_counter(8.0.23+ 名),跳过要限一次一事务。
从库提升为主库的完整命令
提升动作清单:停复制、清元数据、关只读、确认服务端元信息(server_uuid 保留即可)、对外开放前做最后验证。
用 XtraBackup 备份建从库(GTID 版)
标准建从库路径:源端 xtrabackup 全备 → 拷贝到新实例 → prepare + copy-back → 依据 xtrabackup_binlog_info 设置 gtid_purged → AUTO_POSITION 拉起复制。
复制账号创建(REPLICATION SLAVE)
复制专用账号最小权限:REPLICATION SLAVE(拉取 binlog)即可;GTID 环境再加 REPLICATION CLIENT 便于查位点;限制来源主机与独立密码。
gtid_executed 与 gtid_purged 语义
gtid_executed:本实例已执行的全部 GTID 集;gtid_purged:已被 binlog 清理但仍需声明的 GTID 集(新从库的起点)。两者配合决定「谁还缺什么事务」。
SQL 线程报 1062(主键/唯一键冲突)
重放时插入撞唯一键:多因从库被写入、双向复制冲突或人工拼接数据;处理先定位冲突行判断保留哪份,再决定跳过或用重复键策略重放。
复制监控指标与告警项
复制监控六个核心信号:双线程状态、延迟、relay 积压、错误日志、GTID 差距、心跳;接入 P_S 表或 exporter,做到「断了 1 分钟即告警」。
重建从库(损坏/漂移后的重挂)
从库数据漂移或落后太多时,「重建」比重放更省心:用备份恢复数据 → 设置 GTID 起点 → AUTO_POSITION 重挂 → 校验追平。
建从库:一致性快照与位点获取
建从库第一步:在主库拿到「一致性快照 + 对应位点」。经典做法 FTWRL 锁写 → 记位点 → 导数据/拍快照 → 解锁,保证快照与位点匹配。
从库延迟的处置手段
处置先止血后治本:临时提高重放并行度、错峰暂停从库大查询、必要时限流主库写;治理则从表结构、事务粒度与硬件下手。
半同步复制(Semi-Sync)
半同步保证「至少一个从库确认收到」事务才提交:降低故障丢失窗口;用 rpl_semi_sync_source/replica 插件,超时自动降级异步。
延迟从库(SOURCE_DELAY 误操作保护)
故意落后 N 秒的从库:误删/误改发生后,在延迟窗口内可从中捞回;配置 SOURCE_DELAY=3600(秒),配合 RELAY 观察 SQL_Delay 与剩余时间。
并行复制配置(WRITESET / LOGICAL_CLOCK)
提升 applier 吞吐:8.0 推荐源端 WRITESET 依赖跟踪 + 从库 LOGICAL_CLOCK 并行,worker 数按 CPU 核数配置,保持 commit order 保证一致性。
复制线程状态解读(IO / SQL)
线程状态是诊断语言:Waiting for source to send event(正常空闲)、Connecting(重连中)、Queueing(拉取中);SQL 侧 Reading event(重放中)、Waiting for handler(等锁)。
IO 线程故障排查(网络/认证/位点)
IO 线程断 = 拉不到 binlog:常见于网络不通、认证失败、binlog 被清理(1236)、源端账号变更;看 Last_IO_Error 报错码定位。
MGR(组复制)核心概念
MySQL Group Replication:基于 Paxos 的一致性复制,节点自动选主、多数派确认提交;单主模式最常用,多主模式冲突需应用侧规避。
大事务对复制的冲击与治理
大事务(批量 DELETE/UPDATE、大 LOAD)在从库单线程重放成分钟级延迟,且放大 relay 与锁等待;治理核心是业务侧拆批与限流。
用 mysqldump 建从库(小库实操)
小数据量最简路径:mysqldump --source-data=2 导出一致性快照+位点 → 新实例导入 → 按注释里的位点(或 GTID)配置复制。
读写分离的收益与坑
读写分离的核心风险是延迟读:写完立刻读可能读到旧数据;套路有「写后读主库」「强制主库标记」「会话粘连」三招,按业务容忍度选。
SQL 线程报 1032(行不存在)
删除/更新找不到目标行:通常因为从库缺行(跳事务遗毒、数据被清理)或主从未严格一致;修复要么补齐数据,要么按 GTID 跳过后记入核查清单。
STOP/START 与 RESET REPLICA 使用场景
STOP REPLICA 只暂停;RESET REPLICA ALL 清空复制元数据(重配/重建用);RESET MASTER 清空本机 binlog(会破坏下游,慎用)。分清三者再动手。
DDL 对复制链路的影响
DDL 在复制中始终按语句重放:从库执行期间拿独占 MDL,同名表上的长查询会把 applier 卡住;在线 DDL(INPLACE)也会在收尾阶段等锁。
复制心跳与仲裁检测
故障检测要独立于复制本身:pt-heartbeat 写心跳表量测真实延迟;仲裁侧用「多数派探测」避免单点误判(监控节点视角交叉验证)。
切换前检查清单(Go / No-Go)
切换前逐项打钩:新主数据完整、应用连接可控、旧主写入已停、DNS/VIP/代理就绪、回退路径文档化;任何一项未过即 No-Go。
复制过滤规则(replicate-do-db 等)
复制过滤在从库侧生效:库级(replicate-do-db / replicate-ignore-db)基于默认库判断,表级(replicate-wild-do-table)更精确;生产尽量不用过滤。
复制版本兼容规则
复制方向有硬约束:从库版本必须 ≥ 源端(5.7 → 8.0 可行;8.0 → 5.7 不可行);升级顺序先升从库后升主库,保持复制可回退。
复制监控工具链选型
从轻到重三档:P_S 表 + 自研脚本 → mysqld_exporter + Prometheus/Grafana → Orchestrator/云监控;统一落到「双线程状态 + 延迟 + 错误」三组告警。
MHA 与 Orchestrator 高可用工具取舍
MHA:经典主从自动切换工具(半自动、脚本化),已停止活跃维护;Orchestrator:拓扑管理与可视化切换,支持故障检测与自动/手动切换,社区活跃。
relay log 管理与清理
relay log 是复制暂存区:重放后自动清理(relay_log_purge=ON 默认);空间异常时先查 SQL 线程卡点,而不是手工删文件。
并行复制的提交顺序保护
replica_preserve_commit_order=ON 保证并行 applier 按源端顺序提交:这是「从库可随时提升」的前提,8.0 默认即为 ON。
故障切换预案文档要素
预案要能「交给没参与过的人执行」:决策树(何时切)、角色与联系方式、每一步命令、验证点、回退与上报路径。
多源复制(Multi-Source)
一个从库同时拉多个源:用于数据汇总、分库聚合场景;8.0 用 FOR CHANNEL 显式命名通道,通道级管理(START/STOP/状态分开看)。
复制链路加密(SOURCE_SSL 系列)
跨公网/跨安全域复制必须加密:CHANGE REPLICATION SOURCE TO 里配 SOURCE_SSL=1 与 CA 校验(SOURCE_SSL_VERIFY_SERVER_CERT),或用私有 CA 双向验证。
ProxySQL 中间件概念与用途
高性能 MySQL 代理:读写分离、连接池、查询路由与规则、故障自动摘除;以「后端主机组 + 查询规则」模型工作,配置落在自身库中。
复制节点更换服务器的迁移实操
换机器保角色的标准做法:新机按备份建库(或 clone)→ 追平后计划切换 → 老机下线;避免直接物理搬盘(硬件/内核差异)。
MySQL Router 概念与用途
官方轻量代理:为 InnoDB Cluster/MGR 提供读写端口与自动路由,主库切换时客户端无感(改的是 Router 的元数据视图)。
keepalived + VIP 漂移思路
传统高可用组合:VIP 跟随主库漂移,应用连 VIP 无需感知切换;keepalived 负责探测与让权,脚本负责库层切换动作。
Clone 与备份建从库的选型对比
建从库两条路:备份恢复(通用、依赖备份体系)vs Clone 插件(快、一步到位、8.0.17+);数据越大 Clone 优势越明显。
sys 视图速查复制状态
sys schema 提供开箱即用的复制视图:一眼看延迟与线程状态,不用记忆 SHOW REPLICA STATUS 的几十个字段。
性能与调优
慢查询、索引、锁与参数优化
EXPLAIN 输出列总览热门
EXPLAIN 是查询优化第一工具:输出 12 列覆盖访问路径(type/key/key_len)、行数估算(rows/filtered)与附加动作(Extra),读懂列即读懂计划。
慢查询日志配置(slow_query_log)热门
性能优化的入口:开启慢查询日志并设合理阈值(long_query_time),让「哪条 SQL 慢」先有证据,再谈优化。
InnoDB Buffer Pool 大小设置(innodb_buffer_pool_size)
InnoDB 最值钱的内存开关:缓存数据页与索引页,命中则免磁盘 IO;专用库一般取物理内存 50%-75%,在线可调但以小步调大为主。
type 访问类型分级(从好到坏)
type 直接决定性能档位:system/const/eq_ref/ref 优秀,range 尚可,index/ALL 需要警惕;优化目标是把关键路径推到 ref/range 以内。
慢 SQL 定位与优化全流程(场景)
真实排障顺序:慢日志/监控发现 → 聚合排序 → EXPLAIN 看计划 → EXPLAIN ANALYZE 验证 → 优化(改写/索引/结构)→ 回归对比 → 纳入巡检。
锁等待排查(sys.innodb_lock_waits)
锁等待诊断三板斧:谁在等(blocked)、谁挡着(blocking)、被什么锁(锁类型+索引);sys 视图已把三表联查封装好。
事务刷盘安全级(innodb_flush_log_at_trx_commit)
0/1/2 三档决定每次提交时 redo 的刷盘行为:1 最安全(默认,每次提交 fsync),0/2 快但可能丢最近 1 秒的事务。
EXPLAIN ANALYZE 实测执行
8.0.18+ 的 EXPLAIN ANALYZE 真正执行查询并回传每步实际行数与耗时(TREE 格式):估算与实测的差距一眼可见,会写库的语句慎用。
索引设计原则清单
索引设计五问:哪些查询是热点?条件列的选择性?排序/分组列能否顺带覆盖?写放大能接受吗?现有索引能否改造而非新增?
InnoDB 锁类型总览(行锁/表锁/意向锁/MDL)
锁家谱:行级(记录锁/间隙锁/临键锁)、表级(意向锁 IS/IX、AUTO-INC)、元数据锁(MDL);业务感知的锁等待 90% 来自行锁与 MDL。
Binlog 同步刷盘(sync_binlog)与崩溃安全组合
双 1 配置(innodb_flush_log_at_trx_commit=1 + sync_binlog=1)是崩溃不丢事务的标配;sync_binlog=0 交给 OS 刷盘,主库高并发时是隐藏瓶颈。
Redo Log 容量配置(8.0.30+ innodb_redo_log_capacity)
redo 是崩溃恢复与写入吞吐的关键:8.0.30 起用 innodb_redo_log_capacity 统一管理(默认 100M 偏小),旧版本用 log_file_size x files_in_group。
参数生效与持久化(SET GLOBAL / SET PERSIST / my.cnf)
三种改法三种命运:SET GLOBAL 重启即失、SET PERSIST 持久到 mysqld-auto.cnf、my.cnf 需要重启(动态参数也要 reload 才生效)。
联合索引列顺序(最左前缀与排序法则)
联合索引列序记忆法则:等值条件放前、范围条件放后、排序/分组列顺延;跳过最左列(如只用 b 查 (a,b))整个索引用不上。
sysbench 基准压测(OLTP)
业界通用的 MySQL 压测工具:造数、跑 OLTP 混合读写、观察 QPS/TPS 与延迟分布;压测必须固定数据量、并发与环境。
参数模板与调整流程(16C64G 示例)
一份可参考的起点而非答案:内存类参数先行、刷盘次之、连接类兜底;每次只动一组参数,压测对比后再上生产。
pt-query-digest 慢日志聚合分析
Percona 专业分析器:把慢日志聚合成「按总耗时排序」的报告,含响应时间分布、执行次数、样例 SQL 与 EXPLAIN 建议,是慢 SQL 治理的主力工具。
Extra 关键值解读(filesort / temporary)
Extra 藏关键信号:Using filesort=额外排序、Using temporary=中间表、Using index=覆盖索引、Using index condition=ICP、Using join buffer=无索引连表。
死锁日志解读(LATEST DETECTED DEADLOCK)
死锁是两个事务互相持有并等待:INNODB STATUS 的 LATEST DETECTED DEADLOCK 段给出两个事务的语句、持有锁与等待锁,按「改加锁顺序/缩短事务」治理。
MDL 元数据锁等待排查
DDL 等 MDL:长事务(哪怕只是 BEGIN 后没提交的读)会挡住 ALTER;DDL 又挡后面的 DML,形成雪崩队列。看 P_S.metadata_locks 定位。
Buffer Pool 命中率与状态解读
用 Innodb_buffer_pool_read_requests 与 Innodb_buffer_pool_reads 算命中率;但更该盯的是物理读增长与 free/young/old 页分布。
统计信息与 ANALYZE TABLE
优化器选索引靠统计信息:innodb_stats_persistent 让统计落盘稳定(8.0 默认开),大批量导入/删除后要主动 ANALYZE。
Buffer Pool 预热与持久化(dump/load)
重启后缓冲池是空的,冷启动性能低谷靠预热缓解:关闭时 dump 热点页列表,启动时 load,8.0 默认开启。
覆盖索引(Using index)
查询列全部命中索引列时无需回表:Extra 显示 Using index;把高频查询的返回列并入联合索引是常见提速手段,注意索引体积膨胀。
在线 DDL 与锁选项(ALGORITHM/LOCK)
8.0 在线 DDL 用 ALGORITHM=INPLACE/INSTANT 与 LOCK=NONE 声明要求:显式写出让「不锁表」成为可验证的承诺,执行前用 LOCK 子句探测是否可行。
排序与临时表内存(sort_buffer / tmp_table_size)
排序与临时表内存按会话分配:sort_buffer_size、join_buffer_size、tmp_table_size、max_heap_table_size;不是越大越快,是每连接都要吃的内存。
连接线程复用(thread_cache_size)
连接风暴的缓冲垫:断开后线程进缓存供复用,省去反复创建线程的开销;默认值偏低,高并发短连接场景容易被反复创建拖慢。
慢日志阅读与 mysqldumpslow
慢日志是文本流:每条含 Query_time/Lock_time/Rows_sent/Rows_examined 与 SQL;mysqldumpslow 按耗时/次数聚合是官方自带的入门分析器。
ORDER BY 与索引(消除 filesort)
排序列与条件列同属一个索引且顺序吻合时,B+ 树天然有序可免排序;升降序混用需 8.0 降序索引支持。
INNODB_TRX 长事务观测
INNODB_TRX 列出活跃事务:起始时间、状态、行数、等待情况;trx_started 最早的那个通常就是锁事故源头。
InnoDB 刷盘方式(innodb_flush_method)
决定数据文件读写是否绕过 OS page cache:Linux 常见 fsync(默认)与 O_DIRECT;O_DIRECT 减少双重缓存,但不同存储上表现差异大。
刷脏能力参数(innodb_io_capacity / io_capacity_max)
告诉 InnoDB 这块盘能干多少 IOPS:SSD 建议 2000-4000 起,NVMe 上万;设太小刷脏跟不上会导致 checkpoint 卡写。
索引基数(cardinality)与统计信息
cardinality 是索引列唯一值数量估算:越大选择性越好;SHOW INDEX 的 Card 值严重失实会导致优化器选错索引,用 ANALYZE TABLE 刷新。
死锁预防的工程手段
预防死锁四招:按固定顺序访问表/行、事务短小、更新前先 SELECT ... FOR UPDATE 定序、热点行拆散(如账户余额分桶)。
RC 与 RR 的锁行为差异与选型
READ COMMITTED 与 REPEATABLE READ 的核心差异在间隙锁:RC 基本不用 gap lock(减少锁冲突),RR(默认)用临键锁防幻读;互联网 OLTP 常用 RC。
表缓存与打开文件数(table_open_cache)
缓存已打开表定义与文件句柄;Opened_tables 持续快速增长说明缓存不够或存在大量临时表,配合 open_files_limit 一起调。
EXPLAIN FORMAT=TREE / JSON
8.0.16+ 提供树形格式(可读性好)、JSON 格式(含成本细节 query_cost);传统表格适合速览,树形适合理解执行流程。
连表顺序与驱动表选择
优化器按成本选驱动表:小结果集先驱动、被驱动表走索引是理想形;驱动表选错(统计失真)时可用 STRAIGHT_JOIN 临时纠偏并分析根因。
performance_schema.data_locks 解读
P_S 的 data_locks / data_lock_waits 是锁的原始现场:每行的 LOCK_TYPE/LOCK_MODE/LOCK_DATA 精确到索引与记录,比 SHOW 输出更细。
innodb_lock_wait_timeout 与 1205 错误
行锁等待超时参数:等待超过 innodb_lock_wait_timeout(默认 50s)报 1205 并回滚语句(非事务);调小能让失败更快暴露,调大不会解决根因。
临键锁与幻读防治(RR 语义)
RR 默认用临键锁(记录+间隙)把范围条件锁成区间,防止其他事务插入新行(幻读);等值唯一命中时退化为记录锁。
mysqlslap 自带压测工具
MySQL 官方自带并发压测:模拟多客户端执行同一批 SQL,快速得到并发-耗时曲线,适合验证参数调整前后的差异。
rows 与 filtered 解读
rows 是优化器估算的要扫描行数,filtered 是条件过后剩余百分比:rows × filtered% ≈ 实际参与后续处理的行数,两者决定计划成本的主体。
optimizer trace 查看优化器决策
为什么没走索引?optimizer trace 输出优化器逐步决策(候选索引、代价比较、被否决原因),是「计划为什么这样」的终极窗口。
应用侧锁错误处理(1213/1205 重试)
数据库锁错误要有明确应用策略:1213 死锁与 1205 超时均可安全重试(事务边界内重做),用有界退避+幂等保证正确性。
MVCC 与 purge 滞后(history list length)
MVCC 靠 undo 保留旧版本:长事务不结束则旧版本无法回收(purge 滞后),undo 表空间膨胀、查询变慢;看 History list length 与 undo 占用预警。
key_len 解读(联合索引用了几列)
key_len 是实际使用的索引字节数:可反推联合索引用到第几列;计算与字符集相关(utf8mb4 每字符 4 字节,varchar 另计长度字节)。
不可见索引(Invisible Index)
8.0 支持把索引设为 INVISIBLE:优化器视而不见但索引仍在维护,用于「下线前观察」——删索引前的安全气囊。
前缀索引(长字符串列)
长字符串(URL/邮箱)为省空间取前 N 字符建索引:选择性接近全列即可;LIKE 'abc%' 可用,ORDER BY 前缀列通常不可用。
函数索引(Functional Index,8.0.13+)
按表达式建索引:对列做函数/表达式查询可走索引(如 MONTH(col)、JSON 字段提取),语法是加括号的表达式。
gh-ost / pt-online-schema-change 概念
大表改结构的两大外部工具:pt-osc 用触发器同步增量,gh-ost 读 binlog 无触发器;均可限流、暂停、回滚,适合上亿行表的结构变更。
慢日志落库(log_output=TABLE)与轮转
log_output=TABLE 把慢日志写进 mysql.slow_log 表:可用 SQL 直接聚合;FILE 则要处理轮转(mv 后 FLUSH)。两种模式可兼得(TABLE,FILE)。
Hash Join(8.0.18+)与联合缓冲区
无索引连表时 8.0 用 Hash Join 替代 BNL:为小表建哈希表、扫描大表探测,内存不足时落盘分批;EXPLAIN 显示 Using join buffer (hash join)。
未走索引日志与节流(log_queries_not_using_indexes)
记录未用索引的查询能尽早发现隐患,但高并发下会写爆日志:必须配合 log_throttle_queries_not_using_indexes 节流,或仅短时开启排查。
降序索引(Descending Index,8.0)
8.0 真正支持 DESC 语义的索引:混合排序(a ASC, b DESC)场景下消除 filesort;5.7 的 DESC 只是语法糖实际仍升序存储。
查询缓存已退场(8.0 移除 Query Cache)
8.0 正式移除 Query Cache:历史上有全局互斥锁、写热点即失效的顽疾;缓存职责交给应用层/Redis/代理层,数据库侧专注执行。
SHOW PROFILE 退场与 8.0 替代方案
SHOW PROFILE 在 8.0 标记弃用:单条 SQL 的分阶段耗时改用 performance_schema(events_stages_*)或 EXPLAIN ANALYZE 分析。
Redis 命令
五大数据类型与通用命令
SET 设置键值(含过期与条件选项)
Redis 最核心的写命令:SET key value 支持 EX/PX 过期、NX/XX 条件、GET 返回旧值、KEEPTTL 保留原 TTL,是缓存写入与简易锁的基石。
GET 与 GETDEL/GETEX 取值
GET 读取字符串值(键不存在返回 nil,类型不对报 WRONGTYPE);GETDEL 读后即删、GETEX 读时顺手改过期,适合一次性令牌场景。
HSET / HMSET 设置哈希字段
Hash 是「键里套字段」结构:HSET 一次写一个或多个 field-value,返回新建字段数;HMSET 已被 HSET 取代(旧代码仍常见)。
ZADD 有序集合写入(NX/XX/GT/LT/CH/INCR)
ZSet 按 score 排序的去重集合:ZADD 支持 NX(只新增)、XX(只更新)、GT/LT(分数比较)、CH(返回变动数)、INCR(自增模式)。
EXISTS 键存在性判断
返回存在的键个数:单个键返回 0/1,多个键返回存在数量(同一个键写多次会重复计数);4.0 起语义从布尔改为计数。
INCR / DECR / INCRBY 原子计数
原子自增自减:计数、库存、限流、发号都能用;INCRBYFLOAT 支持小数(内部转科学计数,精度受浮点限制)。
LRANGE 区间读取列表
按下标区间读取:0 是左端,-1 是右端,LRANGE key 0 -1 即全量;列表长时全量读同样有阻塞风险。
SADD / SREM 集合增删
Set 是无序去重集合:SADD 添加成员(返回新增个数,已存在不计),SREM 删除成员(返回实际删除数)。
ZRANGE 按排名区间取值(含 REV/BYSCORE/BYLEX)
ZRANGE key start stop [WITHSCORES] 按排名取;6.2 起 REV 反转、BYSCORE/BYLEX 切换为按分数或字典序区间,统一了旧命令族。
EXPIRE 过期设置与 NX/XX/GT/LT 条件
给键设置生存时间:EXPIRE 秒/PEXPIRE 毫秒/EXPIREAT 时间戳;7.0 起支持 NX/XX/GT/LT 条件,用于精细控制续期。
SETNX / SET NX 的区别与用法
SETNX 是「不存在才设置」的历史命令:不能带过期,只能配合 EXPIRE;等价于 SET key value NX。锁与去重场景建议直接用 SET NX PX 一条原子完成。
LPUSH / RPUSH 列表入队
List 是双向链表语义(内存里是 quicklist):LPUSH 从左端插入、RPUSH 从右端插入,返回值是插入后列表长度;常用于队列与时间线。
DEL / UNLINK 删除键
DEL 同步删除并返回删除键数;UNLINK 异步回收内存(大 key 场景不阻塞主线程),删除效果相同但内存稍后释放。
TTL / PTTL / PERSIST 查询与移除过期
TTL 返回剩余秒数:-1 表示键存在但无过期、-2 表示键不存在;PERSIST 移除过期让键永久保存。
计数器场景:限流与库存扣减
固定窗口限流=INCR + 首次设过期;库存扣减=DECR 后判断是否 <0 再回补;更精细的窗口用 Lua 或 Redis Cell 模块。
LPOP / RPOP 弹出与 count 参数
从两端弹出并删除元素;Redis 6.2 起支持 count 一次弹多个,键被弹空后自动删除。
ZREVRANGE 倒序取值(排行榜标准姿势)
按分数从高到低取成员:ZREVRANGE key 0 9 WITHSCORES 就是 Top10;旧命令族仍广泛使用,新代码可用 ZRANGE REV 替代。
KEYS 与 SCAN 的取舍(禁止线上 KEYS)
KEYS pattern 全量匹配会阻塞 Redis(O(N) 且单线程),生产禁用;SCAN 游标渐进遍历,虽有重复返回但安全。
位图命令(SETBIT / GETBIT / BITCOUNT / BITOP)
字符串即位数组:按 bit 存布尔状态,1 亿用户签到只需 12.5MB;BITCOUNT 统计置位数、BITOP 做多键位运算(AND/OR/XOR)。
HGET / HMGET 读取字段
单字段用 HGET,多字段用 HMGET:不存在的字段返回 nil 且位置保留,便于按序对号入座;键整体不存在时 HMGET 全 nil。
INFO 命令与分节解读
INFO 输出服务器全貌:Server/Clients/Memory/Persistence/Stats/Replication/CPU/Keyspace 等分节;是监控与巡检的第一入口。
BLPOP / BRPOP 阻塞弹出(队列消费)
阻塞版弹出:列表空时挂起等待,元素到达立刻返回;timeout=0 永久阻塞。多消费者共享一个队列即竞争消费。
ZRANGEBYSCORE / ZCOUNT 分数区间与计数
按分数区间取成员:支持开区间标记(如 (100)、-inf/+inf、LIMIT 分页;ZCOUNT 快速统计区间内成员数。
排行榜场景(分页、并列与周期榜)
ZSet 是排行榜的标准实现:ZINCRBY 计分、ZREVRANGE 取 TopN、ZREVRANK 取我的名次;周期榜用独立键 + 定时合并。
MSET / MGET 批量读写
一次网络往返读写多键,降低 RTT;MGET 只支持字符串、不存在的位置返回 nil;MSET 原子性仅保证一起返回,不代表事务。
ZSCORE / ZMSCORE 读分数
读取成员分数:ZSCORE 单个(成员不存在返回 nil),ZMSCORE(6.2+)批量读取;分数以字符串返回,注意精度。
ZRANK / ZREVRANK 名次查询
查询成员排名:ZRANK 升序从 0 数,ZREVRANK 从高到低;7.2 起支持 WITHSCORE 一并返回分数。
HDEL 删除字段与空键自动清理
HDEL 删除一个或多个字段并返回实际删除数;Hash 最后一个字段被删后键自动消失,不会残留空 Hash。
SISMEMBER / SMISMEMBER 成员判断
判断成员是否存在:SISMEMBER 单个返回 1/0,SMISMEMBER(6.2+)一次判断多个,结果按序返回 0/1 数组。
ZINCRBY 分数原子增减
给成员分数原子加/减:成员不存在则相当于从 0 开始先增再加入;返回更新后的分数。
延时队列与到期扫描(ZSet 场景)
score 存到期时间戳:ZADD 入队、ZRANGEBYSCORE -inf now 扫到期、ZREM/Lua 原子领取;比轮询全部键高效得多。
HGETALL 全量读取哈希
一次取回所有 field-value;字段多时结果集会很大且阻塞单线程,生产建议用 HSCAN 分批或只取需要的字段。
LMOVE / RPOPLPUSH 可靠队列转移
原子地把元素从源列表弹出并推入目标列表(可跨两端指定方向);消费者崩溃前进程在,元素仍在备份列表里,可重放。
SPOP 随机弹出(抽奖/去重队列)
随机删除并返回成员:单成员或 count 个;抽奖、库存去重、随机派单都靠它保证「一个成员只会被弹出一次」。
ZREM 与区间删除(ZREMRANGEBYRANK / BYSCORE)
ZREM 按成员删,返回实际删除数;ZREMRANGEBYRANK/BYSCORE 按区间批量清理,是维护榜单与过期数据的主力。
TYPE 判断键类型
返回键的数据类型:string/list/set/zset/hash/stream;对不存在键返回 none。调试 WRONGTYPE 问题的第一步。
LTRIM 裁剪列表(固定长度场景)
只保留指定区间,其余全删;配合 LPUSH + LTRIM 0 N-1 可维护「只留最近 N 条」的时间线/日志。
ZCARD / ZCOUNT 规模统计
ZCARD 返回成员总数,ZCOUNT 返回分数区间内成员数;都是常用的监控与「是否存在」判断入口。
一次性取值模式(GETDEL / GETEX PERSIST)
短信验证码、单次 token 这类「读过即废」的语义用 GETDEL 原子完成;需要续期用 GETEX,避免 GET+EXPIRE 两条命令之间的竞态。
HINCRBY / HINCRBYFLOAT 字段级原子计数
在 Hash 字段上原子加减:适合按对象维度统计(用户积分、商品维度销量);字段不存在按 0 起算。
SMEMBERS 全量成员
返回集合所有成员(无序);集合大时全量返回同样是阻塞与带宽风险,遍历请用 SSCAN。
ZPOPMIN / ZPOPMAX 弹出极值(延时队列消费)
弹出分数最小/最大的成员(可选 count);是「到期任务」与「榜单淘汰」的原子消费方式。
CLIENT LIST / CLIENT KILL 连接管理
查看当前连接明细(地址、空闲时长、最近命令),定位连接泄漏与阻塞客户端;CLIENT KILL 可按条件断开异常连接。
INFO 分段解读与常用组合
INFO 按段输出运行指标:server/clients/memory/persistence/stats/replication/cpu/commandstats/keyspace;记住每段的关键字段,用 grep 组合快速定位问题。
Hash vs String 存对象:选型对照
存对象用 Hash 可部分字段读写、按字段增减省内存;用 String 存序列化 JSON 适合整体读写与跨语言简单。选型看访问模式与过期粒度。
SINTER / SINTERCARD 交集运算
求多个集合的交集:SINTER 直接返回结果,SINTERSTORE 存到目标键,SINTERCARD(7.0+)只要个数并支持 LIMIT 提前截断。
SETEX / PSETEX 设置带过期的值
设置值的同时指定秒/毫秒级过期:SETEX key seconds value、PSETEX key milliseconds value;等价于 SET key value EX/PX,历史 API 仍在广泛使用。
HSCAN 游标遍历大 Hash
渐进式遍历:HSCAN key cursor [MATCH pattern] [COUNT n],游标 0 开始、再次返回 0 表示结束;不会像 HGETALL 那样一次性阻塞。
LREM 按值删除(count 正负零的语义)
按值删除元素:count>0 从左删 count 个,count<0 从右删,count=0 删除全部匹配;返回实际删除数量。
去重与 UV 统计选型(Set / HyperLogLog)
Set 精确去重但内存随基数线性增长;HyperLogLog 固定约 12KB、误差 0.81%,适合海量 UV;两者都支持合并。
HyperLogLog 基数估算(PFADD/PFCOUNT/PFMERGE)
用约 12KB 内存估算集合基数(标准误差 0.81%):PFADD 添加、PFCOUNT 估算、PFMERGE 合并;适合 UV 等大基数近似统计。
HRANDFIELD 随机字段(抽奖/抽样)
从 Hash 随机取字段:无 count 返回单个字段;count 正数不重复、负数可重复;WITHVALUES 连值一起返回(6.2+)。
LLEN 列表长度
O(1) 返回列表元素个数,键不存在返回 0;常用于队列积压监控与限长判断。
SRANDMEMBER 随机读取(不删除)
随机取成员但保持集合完整:正数 count 去重、负数 count 可重复;适合「随机推荐」「随机抽样展示」。
SELECT / MOVE / SWAPDB 多库操作
Redis 默认 16 个逻辑库:SELECT 切换库(集群模式只有 DB 0);MOVE 把键移到另一库;SWAPDB 原子交换两库(FLUSHALL 之外的重置手段)。
APPEND / STRLEN 追加与长度
APPEND 在值尾部追加(键不存在相当于 SET),返回追加后的总长度;STRLEN 返回字节数而非字符数,中文按 UTF-8 占 3 字节。
HEXISTS / HLEN 存在性与字段数
HEXISTS 判断字段是否存在(1/0),HLEN 返回字段总数;两者都是 O(1),适合做前置校验与容量判断。
List 队列模式与 Stream 对比
List 队列适合轻量任务:LPUSH/BRPOP 或 LMOVE 可靠队列;需要消费组、ACK、回溯、多播时用 Stream。
SCARD 集合基数
O(1) 返回集合成员数;用作规模监控、限流判空与「UV 统计」的精确计数(与 HyperLogLog 的估算对比)。
SSCAN 游标遍历集合
渐进遍历集合成员:SSCAN key cursor [MATCH pattern] [COUNT n],游标归零表示结束;大集合的唯一安全遍历方式。
ZUNIONSTORE / ZINTERSTORE 带权合并
多 ZSet 合并计算:WEIGHTS 加权重、AGGREGATE SUM/MIN/MAX 指定聚合方式,结果存到目标键;适合周榜/月榜汇总。
RENAME / RENAMENX / COPY 键改名与复制
RENAME 直接改名(目标已存在会被覆盖);RENAMENX 目标存在则拒绝;COPY(6.2+)复制键值,支持跨库(REPLACE 可覆盖)。
BITOP 位运算与活跃统计
对多个字符串按位做 AND/OR/XOR/NOT,结果写进目标键;配合 bitmap 做留存/活跃统计:AND 求「都活跃」、OR 求「任一天活跃」。
String 的 512MB 上限与二进制安全
单个 String 最大 512MB;二进制安全意味着可存序列化对象、图片、压缩包,但大 value 会放大复制、持久化与迁移成本。
HSETNX 字段不存在才设置
单字段版的「不存在才写」:返回 1 表示设置成功,0 表示字段已存在;不会覆盖已有值,原子单命令。
SUNION / SDIFF 并集与差集
SUNION 合并去重、SDIFF 求「在第一个集合但不在后面集合」的差集;均有 STORE 变体可持久化结果。
GETRANGE / SETRANGE 子串操作
按字节下标截取与覆写字符串:GETRANGE 支持负下标(-1 为最后一个字节),SETRANGE 超长自动零字节填充,适合固定宽字段。
HKEYS / HVALS 取字段名与值
分别返回全部字段名或全部值;字段多时与大 Hash 全量读同样有阻塞风险,按需 HSCAN 或 HMGET 定向取。
LINDEX / LSET 按下标读写
LINDEX 按下标取元素(负数从右数),LSET 按下标改写;越界读取返回 nil,越界写入直接报错。
标签与共同关注场景(集合运算实战)
用 Set 实现标签系统:SADD 打标、SINTER 找同时命中多标签的对象;大规模标签建议按位图或搜索引擎承载。
OBJECT ENCODING / IDLETIME / FREQ 诊断
OBJECT 系列子命令看单键内部细节:ENCODING 编码、IDLETIME 空闲秒数(LRU)、FREQ 访问频率(LFU),是大 key 与访问模式分析利器。
GEO 地理位置命令(GEOADD/GEODIST/GEOSEARCH)
GEO 系列把经纬度存进 ZSet(score 为 geohash)并支持距离与范围检索:GEOADD 写入、GEODIST 测距、GEOSEARCH 找附近成员。
Hash 编码(listpack / hashtable)与内存优化
小 Hash 用 listpack(7.0 前叫 ziplist)紧凑存储,超阈值转 hashtable;阈值由 hash-max-listpack-entries(默认 128)与 hash-max-listpack-value(默认 64)控制。
String 编码(int / embstr / raw)
String 有三种内部编码:整数用 int(共享对象)、短字符串用 embstr(≤44 字节,一次分配)、长字符串用 raw;用 OBJECT ENCODING 查看。
SMOVE 原子移动成员
把成员从源集合原子移到目标集合:源中存在且移动成功返回 1,源中不存在返回 0;目标已存在该成员时源仍会删除它。
DUMP / RESTORE 序列化搬运
DUMP 导出键的序列化值(含校验与版本字节),RESTORE 反序列化写入目标键;用于跨实例搬键,配合 TTL 参数保留过期。
BITFIELD 位域读写(多字段紧凑存储)
在字符串上按任意位宽读写整数:一条命令里可组合多个 GET/SET/INCRBY,用 OVERFLOW 控制溢出策略;适合紧凑计数与协议字段。
CONFIG GET/SET/REWRITE 动态配置
CONFIG GET 查参数、CONFIG SET 热改(多数免重启)、CONFIG REWRITE 把当前生效值写回启动配置文件;只 SET 不 REWRITE,重启后配置丢失。
LINSERT 指定元素前后插入
在列表中「找到某个值」然后在其前/后插入新元素:LINSERT key BEFORE|AFTER pivot value;pivot 不存在返回 -1。
Hash 字段级过期(7.4+ HEXPIRE)与旧版本替代
Redis 7.4 起支持字段级过期:HEXPIRE key seconds FIELDS n field...;7.4 之前只能整键过期,或把字段拆成独立键。
Set 编码(intset / listpack / hashtable)
全整数且不超 set-max-intset-entries(默认 512)用 intset;7.2+ 小集合可用 listpack;否则 hashtable。转换同样单向不可逆。
SORT 排序(BY/GET/LIMIT 模式)
对 List/Set/ZSet 排序:数值默认、字符串要 ALPHA;BY 可按外部键权重排序、GET 取外部字段拼结果、LIMIT 分页;SORT_RO 是只读变体。
CLIENT KILL / NO-EVICT / SETNAME 连接治理
CLIENT 系列管理连接:KILL 按 ID/地址/类型踢连接、SETNAME 给连接贴标签、NO-EVICT 让当前连接豁免内存淘汰(7.0);排查「谁在连我」必用。
List 编码(listpack / quicklist)
小 List 用 listpack,超过 list-max-listpack-size(默认 128,正数=元素个数上限)后转为 quicklist 的多节点结构;7.2 起 quicklist 由 listpack 节点构成。
OBJECT 子命令(编码/引用/空闲/频率)
OBJECT 查看键的内部信息:ENCODING 看底层结构、REFCOUNT 引用计数、IDLETIME 空闲秒数、FREQ 访问频率(LFU);排查内存与淘汰行为时非常有用。
EXPIRE 条件选项 NX/XX/GT/LT(7.0)
EXPIRE 支持 NX/XX/GT/LT 条件设置与 EXPIRETIME/PEXPIRETIME 读取绝对过期时间:刷新 TTL 时不再盲目覆盖,避免把长 TTL 改短或反之。
DBSIZE 与 FLUSH/大键安全清理
库级操作:DBSIZE 看键数(O(1))、FLUSHDB/FLUSHALL 清库(ASYNC 后台释放)、SWAPDB 换库(非集群);大键删除优先 UNLINK 或渐进清理,避免阻塞。
RANDOMKEY 随机抽键
随机返回一个键名(不删除),空库返回 nil;可做键空间抽样巡检,但不适合统计用途(分布不均)。
MSETNX 全不存在才批量写入
原子地批量设置多个键:仅当所有键都不存在时才全部写入,任一键已存在则整批放弃(返回 0);适合「首次初始化」类场景。
ZSet 集合运算新版:ZUNION/ZINTER/ZDIFF
7.0 起 ZSet 集合运算可以不加 STORE 直接返回结果:ZUNION/ZINTER/ZDIFF 支持 WEIGHTS 与 AGGREGATE,落库变体 ZDIFFSTORE/ZINTERCARD 按需使用。
多键弹出:LMPOP / ZMPOP(7.0)
从多个列表/有序集合里挑第一个非空键弹出元素:LMPOP/ZMPOP 一次调用支持多键与 COUNT,BLMPOP/BZMPOP 可阻塞等待,比 BRPOP 更灵活。
FUNCTION 函数库(7.0,替代脚本管理)
Redis 7.0 的 FUNCTION 引擎:用 shebang 头加载命名 Lua 库,FCALL 调用;库随 RDB/AOF 持久化、可 LIST/DUMP/RESTORE,比易失的脚本缓存更适合多团队脚本治理。
LPOS 查找元素位置
按值查找下标:LPOS key element [RANK n] [COUNT m];RANK 指定第几个匹配(负数从右数),COUNT 0 返回全部位置(6.0.6+)。
GETSET 与 SET ... GET(旧值返回)
GETSET 设置新值并返回旧值(原子);自 Redis 6.2 起被标记废弃,推荐用 SET key value GET 达到同样效果并支持 NX/EX 等选项。
SINTERCARD 交集基数(不生成结果集)
SINTERCARD 直接返回多个集合交集的基数,不生成结果集,支持 LIMIT 提前终止;7.0 新增,替代「SINTERSTORE 后再 SCARD」的旧写法。
COMMAND 系列:命令元数据查询
程序化查询命令元数据:COMMAND COUNT 数量、COMMAND INFO 参数与 flags、COMMAND DOCS 文档、COMMAND GETKEYS 解析键位置;写客户端、代理或审计工具时常用。
Redis 运维与场景
持久化、主从、集群与缓存场景
分布式锁:SET NX PX 原子加锁
Redis 分布式锁的标准加锁方式:用一条 SET key value NX PX ms 同时完成「不存在才创建」与「过期自动释放」,value 用唯一 token 标识持有者,便于安全释放。
8 种淘汰策略(maxmemory-policy)
常用三条线:不淘汰(noeviction)、在所有键里淘汰(allkeys-*)、只在设过期的键里淘汰(volatile-*);LRU/LFU/random/ttl 决定选谁。
Pipeline 批量命令(一次往返)
把多条命令打包一次发送、一次收全部回复,把 N 次 RTT 压成 1 次;适合批量写入/读取,但它不是事务:不保证原子、出错不回滚。
REPLICAOF / SLAVEOF 配置主从
让当前实例成为指定主库的从库:REPLICAOF host port 动态生效(立即全量同步),REPLICAOF NO ONE 断开变回主库。
慢查询日志(SLOWLOG)配置与读取
慢日志记录超过阈值的命令:slowlog-log-slower-than 微秒阈值(10000=10ms)、slowlog-max-len 条数;排查性能问题第一站。
RDB 持久化:SAVE / BGSAVE / LASTSAVE
RDB 是某一时刻的全量快照:BGSAVE 派生(fork)子进程写盘不阻塞主线程;SAVE 同步阻塞主线程,生产禁用。
Sentinel 哨兵架构与职责
哨兵是独立进程集群:监控主从、判定故障(sdown/odown)、自动选举新主并通知客户端;至少 3 个节点才能容忍单点故障。
maxmemory 内存上限与 OOM 行为
maxmemory 是实例内存红线:达到上限后按策略淘汰;若无可淘汰键则写命令报 OOM,读与 DEL 仍可执行。
Cache Aside 缓存模式(旁路缓存)
最主流的缓存用法:读时先查缓存、未命中查库回填;写时先写库、再删除缓存。删除而非更新缓存是避免并发写覆盖的关键。
分布式锁:安全释放(Lua 比对后删除)
释放锁必须「先确认还是自己的锁、再删除」,且两步要原子;Lua 脚本把 GET 比对与 DEL 合成一次执行,避免两步之间锁过期被他人获得后误删。
EVAL 服务端脚本(原子复合操作)
EVAL 把 Lua 脚本发送到服务端原子执行:读-判断-写 一步完成,不需要 WATCH 重试;库存扣减、限流、锁释放都靠它。脚本内只用 KEYS/ARGV,别写慢逻辑。
RDB 与 AOF 选型对照(含两者同开策略)
RDB 适合备份与快速恢复,AOF 适合更低丢失窗口;生产常规做法是两者同开(AOF 承担恢复精度,RDB 承担冷备与迁移)。
Cluster 分片模型(16384 槽与主从组)
集群把键空间切成 16384 个槽分配给各主节点:key -> CRC16(key) mod 16384 -> 槽 -> 节点;每个主节点带若干从节点做故障转移,最少 3 主。
缓存雪崩(大面积同时失效/宕机)
两类雪崩:大批键同一时刻过期、缓存层整体不可用;前者用 TTL 抖动与分批预热,后者靠多级缓存、限流熔断与高可用架构。
AOF 开启与文件布局(7.0 多文件结构)
AOF 记录每条写命令:appendonly yes 开启;7.0 起 AOF 由 appendonlydir 下的 manifest + base + incr 文件组成,不再是单个 appendonly.aof。
INFO replication 字段解读
复制状态全看这张表:master_link_status、master_last_io_seconds_ago、slave_repl_offset 与主库 offset 差就是延迟的核心证据。
故障判定与自动切换流程(sdown/odown/选举)
流程:单哨兵主观判定 sdown -> 达到 quorum 后标记 odown -> 选举领头哨兵 -> 挑最优从库提升 -> 重配其它从库与旧主 -> 通知客户端。
缓存穿透(查不存在的数据)
请求查永远不存在的键:缓存不命中、每次打库,恶意流量下数据库被压垮;防控=空值缓存 + 布隆过滤器 + 参数校验。
复制延迟排查(网络/慢命令/大 key/重写)
从库延迟的排查顺序:先看 offset 差与主库写入速率,再看网络带宽、从库慢命令与磁盘、以及是否有重写/快照在抢资源。
缓存击穿(热点键瞬间失效)
某个热点键过期瞬间,大量并发同时查库重建:用互斥锁让一个请求重建、其余等待,或逻辑过期让旧值先顶上。
AOF 刷盘策略(appendfsync always/everysec/no)
三档同步策略决定 AOF 的丢失窗口与吞吐:always 最安全最慢、everysec 默认折中、no 完全交给 OS。
持久化卡顿排查(fork/重写/大 key)
周期性卡顿常见三源:fork 耗时、AOF 重写、磁盘慢;用 INFO 与延迟监控定位到具体环节再处理。
sentinel.conf 配置详解
核心就几条:monitor 定义被监控主库与判定票数、auth-pass 复制鉴权、down-after 与 failover-timeout 控制节奏、parallel-syncs 控制同时重同步的从库数。
CLUSTER INFO / NODES / SHARDS 解读
CLUSTER INFO 看集群状态与槽覆盖;CLUSTER NODES 看节点/角色/槽/连接;CLUSTER SHARDS(7.0+)看分片组的结构化视图。
安全基线(bind / requirepass / rename / 防火墙)
Redis 未授权访问是经典事故:绑定内网、强密码、必要时改危险命令名、防火墙白名单、专用低权限账号运行,五件套缺一不可。
缓存一致性(先写库还是先删缓存)
容忍短暂不一致的常规方案:更新数据库后删除缓存(Cache Aside);要求更强一致性时用延迟双删、订阅 binlog 或读主库策略。
MULTI/EXEC 事务(入队与执行)
MULTI 之后命令先入队,EXEC 时按顺序原子执行(执行期间不被其他客户端命令插入);DISCARD 放弃事务。注意:Redis 事务没有回滚,运行时错误不影响已执行部分。
Redis 使用高频误区清单
从「当数据库用」到「KEYS 扫全库」:这些误区的共同点是上线不炸、流量上来才炸;开发评审与上线检查时对照排查。
内存告警应急五步法
收到内存告警的处置顺序:看 used_memory/maxmemory 与淘汰 → 找大 key 与过期堆积 → 看碎片与 RSS → 短期止损(调参/清理)→ 长期根治(拆分/扩容/改设计)。
RDB 恢复流程与文件校验
恢复=把快照文件放回 dir 并启动:Redis 启动时自动加载 dump.rdb;文件损坏用 redis-check-rdb 校验,启动日志会提示加载结果。
复制相关配置(read-only / stale-data / auth)
从库默认只读、可在主从断开时继续服务旧数据;生产还需要 masterauth、replica-priority、min-replicas 系列保证一致与可用性。
手动切换主从(计划内切换流程)
计划内维护的手动切换:确认数据同步到位后,从库 REPLICAOF NO ONE 提升为主,其他从库改挂新主,旧主降级为从。
quorum 与「多数派」的区别
quorum=判定 odown 的票数;多数派(majority)=授权执行切换的票数(sentinel 总数/2+1)。两者不同:quorum 达到也不能必然切换。
槽迁移(--cluster reshard 实战)
在线搬槽:reshard 交互式指定目标节点与槽数,自动迁移并同步 → 用 --cluster check 验证;生产建议按节点规格比例分配。
重定向错误(MOVED / ASK / CROSSSLOT / CLUSTERDOWN)
集群客户端必须理解重定向:MOVED 永久归属、ASK 迁移中临时问询、CROSSSLOT 多键不同槽、CLUSTERDOWN 集群不可用。
大 key 排查(--bigkeys / --memkeys)
redis-cli --bigkeys 抽样扫描给出每类型最大键;--memkeys 按内存排序;生产扫描要限速,避免拖慢实例。
缓存 TTL 设计原则
TTL 是兜底也是治理工具:热点短、冷数据长、加随机防雪崩;无 TTL 的键(除非业务必需)迟早变成内存事故。
RDB 触发与相关配置(save / dbfilename)
save 行定义自动快照条件(如 900 秒内 1 个键变更);dbfilename/dir 决定落盘位置;7.0 起 save 支持单行多组配置。
AOF 重写(BGREWRITEAOF 与自动重写阈值)
AOF 会随写入不断膨胀,需要重写压缩:BGREWRITEAOF 手动触发;自动重写由百分比与最小体积双阈值控制。
查询哨兵状态(masters/replicas/sentinels)
SENTINEL masters 看主库状态与票数,SENTINEL replicas 看从库列表,SENTINEL get-master-addr-by-name 给客户端拿地址,SENTINEL sentinels 看其它哨兵。
哨兵常见问题与脑裂防护
哨兵体系最常见的四类问题:多哨兵配置漂移、少数派分区下双主(脑裂)、网络抖动误切、客户端不切地址;配套 min-replicas 与合理超时缓解。
创建集群(redis-cli --cluster create)
用 --cluster create 一次组建:列出节点 + --cluster-replicas N 自动分配主从;要求所有节点为空库(有数据需先 FLUSHALL 或手动方案)。
MEMORY USAGE / STATS 精确诊断
MEMORY USAGE 给单键真实内存(含开销),MEMORY STATS 给全局分布;排查大 key 与容量核算的正确工具。
延迟监控(LATENCY MONITOR / HISTORY / DOCTOR)
延迟监控记录事件时间线:必须在配置中开启 latency-monitor-threshold(毫秒),之后用 LATENCY LATEST/HISTORY/RESET 分析卡顿事件。
Streams 基础:XADD / XREAD / XRANGE
Stream 是 Redis 5 的追加式消息日志:XADD 追加(自动生成 时间戳-序号 ID),XRANGE 范围读,XREAD 阻塞读新消息,天然支持回溯与多消费者。
Pub/Sub 发布订阅(广播模式)
SUBSCRIBE/PSUBSCRIBE 订阅频道,PUBLISH 发布:消息即发即弃,不持久化、无 ACK、离线订阅者收不到;适合实时通知/配置广播,不适合可靠队列。
计数器限流(INCR + EXPIRE)
最简限流实现:INCR 计数 + EXPIRE 窗口过期;窗口键(如按分钟/用户)首次请求设置过期时间,超过阈值直接拒绝。
「Redis 变慢」排查路径
先定义「慢」(单命令 P99 / 整体超时 / 特定接口)再分层排查:慢命令 -> 大 key/热 key -> 持久化与 fork -> 延迟事件 -> 网络与客户端。
Redis 生产上线检查清单
上线前逐项过:网络安全、持久化与磁盘、内存与淘汰、监控告警、备份演练、高可用切换演练、客户端池与超时;每项都要有明确的「谁负责验证」。
磁盘满与 MISCONF 写入拒绝处置
RDB 保存失败(默认 stop-writes-on-bgsave-error yes)后,Redis 拒绝所有写并报 MISCONF 错误;AOF 写失败同样拒绝写入。
读写分离与从库角色
主库写、从库读的经典架构:需接受从库的复制延迟与数据旧读;强一致读必须回主库或使用 WAIT。
客户端接入哨兵(发现与重连)
客户端先询问哨兵当前主地址再建连,并订阅 +switch-master 或轮询探测;主流客户端库(Jedis/Lettuce/redis-py)均内置哨兵支持。
大 key 处置(拆分 / 渐进删除 / 压缩)
处置路径:能拆就拆(按 hash tag 分片)、删除用 UNLINK 或分批 HDEL/ZREM、value 压缩或改 BLOB 存储;先止血再重构。
连接数上限(maxclients 与文件句柄)
maxclients 决定最大连接数(默认 10000),受系统文件句柄限制:Redis 启动时会按 ulimit -n 自动调整并记录到日志。
BGSAVE 的 fork 与写时复制(COW)
BGSAVE 靠 fork 复制页表 + 写时复制:内存页被改写时才复制,所以写入量大时 COW 内存峰值会接近翻倍。
全量/部分同步与 repl-backlog 机制
首次复制或 offset 已滑出积压缓冲时走全量同步(生成 RDB 传输);否则走部分同步(PSYNC 续传 backlog 中的增量)。
哨兵日志解读(+sdown / +switch-master)
切换全过程都在日志里:+sdown 主观下线、+odown 客观下线、+try-failover 开始、+promoted-slave 提升、+switch-master 完成;排障先按时间线读日志。
Sentinel vs Cluster vs 云托管:选型对照
哨兵解决「自动切换」,Cluster 解决「分片+切换」;数据量单机放得下用哨兵,超单机内存/需要横向扩展用 Cluster。
Hash Tag 同槽技巧({} 包裹)
用 {} 指定哈希部分:只有花括号内参与 CRC16 计算,user:{88}:name 与 user:{88}:cart 一定同槽,从而支持 MGET/事务/Lua。
LRU 与 LFU 的选择(含调参)
LRU 按「最近一次访问时间」淘汰,LFU 按「访问频率」淘汰且频率会衰减;热点长期稳定选 LFU,访问模式无规律用 LRU。
过期删除策略(惰性 + 定期)与内存滞留
Redis 不实时删除到期键:访问时惰性删除 + 每秒若干次定期抽样删除;因此过期键可能短期滞留内存(从库更特殊:等主库 DEL)。
监控体系搭建(指标选型与采集)
最小可用监控:内存(used_memory/RSS)、连接(clients)、QPS、命中率、慢日志计数、持久化状态、复制状态、淘汰数;采集走 INFO + 专用 exporter。
布隆过滤器(RedisBloom)防穿透
用 BF.ADD 标记存在的元素,BF.EXISTS 判断:不存在一定为假(可放心拒绝)、存在可能误判;适合「先过滤再查库」的防穿透场景。
分布式锁续期与看门狗(watchdog)
业务执行时间可能超过锁 TTL,需要后台看门狗定期续期(仍是自己的锁才延长):Redisson 默认每 1/3 TTL 续一次;续期失败要尽快中止业务以免双写。
批量执行三件套:Pipeline / 事务 / Lua 选型
同样想减少往返或保证原子,三种机制语义完全不同:Pipeline 只是打包、MULTI/EXEC 是弱事务、Lua 是原子复合操作;按「是否要原子 + 是否有读判断写」来选。
排行榜运营细节(同分、分页、周期榜)
ZSet 做排行榜的实战要点:同分顺序由 member 字典序决定、分页用 ZREVRANGE 区间、周期榜按 key 生成或用 ZUNIONSTORE 合并。
连接故障排查:连不上与超时
「连不上 Redis」的排查顺序:网络与端口 -> 服务端进程/日志 -> 连接数与 maxclients -> 认证/TLS/保护模式 -> 客户端池与防火墙;错误信息先分类再动手。
主从部署安全清单(脑裂/内存/持久化)
主从不是自动高可用:需要固定的安全基线——从库只读、主库别关持久化、maxmemory 独立设置、min-replicas 防脑裂。
手动演练与运维命令(FAILOVER / RESET)
计划内演练用 SENTINEL FAILOVER 主动切换(无需等故障);配置漂移用 RESET 重新发现;flushconfig 把内存配置写回文件。
集群故障转移与 CLUSTER FAILOVER
主节点故障时其从节点经多数派授权自动提升;计划内维护用 CLUSTER FAILOVER(需在从节点执行)主动切换,TAKEOVER 为强切(危险)。
集群使用限制(DB0 / 多键 / Lua / 事务)
集群限制清单:只有 DB 0;多键操作要求同槽;Lua 脚本所有键须同槽且显式声明;事务/WATCH 同理;FLUSHALL 等命令需多节点执行。
热 key 排查(--hotkeys / MONITOR / 代理统计)
热 key 是流量焦点:redis-cli --hotkeys(需 LFU 策略)给访问频次榜;MONITOR 采样真机命令流;代理/客户端埋点统计真实分布。
THP 与 swap 的关闭要求
Redis 要求关闭透明大页(THP)与避免 swap:THP 让 fork/COW 放大数倍,swap 让内存换页导致延迟暴涨。
多级缓存(本地 + Redis)
本地缓存挡第一层(纳秒级、容量小)、Redis 做分布式第二层;一致性靠事件(Pub/Sub、键空间通知、专用失效通道)与短 TTL 兜底。
SHUTDOWN 保存语义与停机规范
SHUTDOWN [NOSAVE|SAVE]:默认在持久化开启时保存再退出;NOSAVE 跳过保存;从容停机还要看 AOF 缓冲区是否已刷盘。
WAIT 等待从库确认(半同步语义)
WAIT numreplicas timeout:等待至少 N 个从库确认收到此前所有写命令(毫秒超时),返回实际确认数——Redis 默认异步复制的补偿手段。
持久化与复制的监控要点
监控持久化不能只看「是否运行」:快照/重写状态、fork 耗时、磁盘余量、复制 offset 差与断连次数都要有指标与告警。
哨兵启动与运行方式
哨兵是特殊的 Redis 进程:以 sentinel 模式运行、只有 26379 端口,不存业务数据;systemd/容器化部署要挂对配置文件与目录。
槽位管理(ADDSLOTS / DELSLOTS / SLOTS)
手动指派槽:CLUSTER ADDSLOTS 把槽分给当前节点,DELSLOTS 取消;CLUSTER SLOTS 给客户端看槽-节点映射。建集群一般用 create 自动完成。
集群监控与巡检要点
集群监控三件套:cluster_state 与槽覆盖、节点连通(pfail/fail 计数)、迁移与重定向异常;再加上每节点常规 Redis 指标。
淘汰行为验证与监控(evicted_keys)
观察淘汰是否生效:INFO stats 的 evicted_keys 持续增长说明在淘汰;配合 key 的 IDLETIME/FREQ 验证策略选择是否符合预期。
热 key 处置(多副本 / 本地缓存 / 打散)
处置套路:读热点加本地缓存(进程内)与多副本 key 分流;写热点用队列/分片合并写;极端场景把热点数据前移到 CDN/网关。
MONITOR 实时命令流(慎用)
MONITOR 打印实例收到的每条命令:调试利器但开销大(吞吐与内存影响显著),只允许短时、低峰、带超时的采样。
ACL 账号与权限(6.0+)
ACL 支持多用户与命令/键模式级授权:ACL SETUSER 创建账号,ACL LIST/WHOAMI 查看,ACL LOG 审计被拒操作。
空值缓存与防穿透标记实践
空值缓存是把「不存在」也变成缓存内容:实现要点=固定标记值、短 TTL、与真实值同一读取路径、更新时同步失效。
分布式锁落地的六个高频坑
锁粒度、重入、误删、续期、集群槽位与 fencing 是自研 Redis 锁最常翻车的地方;加锁前先想清楚「锁谁、锁多久、失败怎么办」。
WATCH 乐观锁(CAS 与重试)
WATCH 监视若干 key;若在 EXEC 前任一 key 被其他客户端修改,EXEC 返回 nil 表示事务放弃,客户端需重读重试——即 CAS/乐观锁模式。
Streams 消费者组:XREADGROUP / XACK / PEL
消费者组把消息分发给多个消费者:XGROUP 建组,XREADGROUP 用 > 读新消息,XACK 确认;未确认消息进入 PEL(Pending Entries List),消费者宕机后用 XAUTOCLAIM/XCLAIM 转移重试。
会话共享(Session Store 场景)
把 Web 会话存 Redis 实现多实例共享登录态:session:<sid> 用 Hash 存字段、EXPIRE 做滑动过期;登录续期刷新 TTL,退出即 DEL。
消息方案对比(List / Pub/Sub / Streams)
三类方案的可靠性差别巨大:List 简单竞争消费但无 ACK、Pub/Sub 广播不持久、Streams 有消费组/PEL/回溯;按「消息能不能丢」选型。
CPU 飙高排查清单
CPU 高的四大来源:命令开销(热 key/大命令)、过期与淘汰集中、后台任务(fork/rewrite)、网络与加密(TLS/复制流);用 commandstats 与 persistence 段交叉定位。
全量重同步风暴与无盘同步(repl-diskless-sync)
多个从库同时全量同步会同时 fork 快照 + 传输:用 repl-diskless-sync 避免落盘、用延迟窗口合并传输、并错开从库上线时间。
哨兵部署要点(奇数、跨机、版本一致)
部署规范:哨兵数量为奇数(3/5)、分布在不同物理机/可用区、版本与配置一致、监控告警接入、定期演练切换。
扩容:加节点与接槽
加节点两步:--cluster add-node 加入集群,再 reshard 把槽迁过去;加从节点则 --cluster add-node --cluster-slave --cluster-master-id。
键空间通知(keyspace notifications)
订阅键事件(set/del/expired 等):需开启 notify-keyspace-events 掩码;可用于缓存失效、统计、轻量调度,但事件不保证不丢。
缓存故障降级(Redis 挂了业务怎么办)
缓存故障预案:本地兜底缓存、限流保护数据库、熔断与降级返回旧值/默认值;核心是「不让数据库被打穿」。
AOF 混合持久化(aof-use-rdb-preamble)
混合持久化让重写后的 AOF 以 RDB 格式打底(base),之后追加命令:加载更快、体积更小;5.0+ 默认开启。
实例迁移与 IP 变更(replica-announce-ip)
跨机迁移/换 IP:用 REPLICAOF 重新指向 + replica-announce-ip/port 让内网/容器/端口映射场景下的复制信息正确。
缩容:删节点与槽归还
删主节点前必须先把它的槽迁走并确认无数据;删从节点相对简单;最后用 CLUSTER FORGET 让残留节点忘记旧节点(必要时)。
碎片治理与 activedefrag
内存碎片高(RSS 远大于 used_memory)时开 activedefrag 在线整理;不支持的版本只能重启或迁移实例。
键与值的内存设计(省内存实战)
同样的数据不同的内存:短键名、整数编码、小哈希 listpack、分桶控制单键大小、压缩序列化——省下来的是真金白银。
告警阈值参考(内存/连接/延迟/复制)
阈值没有银弹,给一组起步参考值,再按实例基线收敛:内存水位、连接使用率、延迟分位、复制 offset 差、淘汰速率。
Redlock 算法与争议要点
Redlock 在 N 个相互独立的 Redis 主节点上依次用同一 key/token 加锁,多数(N/2+1)成功且总耗时小于 TTL 才算持锁;用于缓解单实例宕机导致锁服务不可用,但强一致场景存在争议。
滑动窗口与令牌桶限流(Lua 原子化)
更平滑的限流:滑动窗口用 ZSet 存请求时间戳,令牌桶用 Hash 存令牌数与上次填充时间;判断与写入必须放进 Lua 一次原子完成。
去重方案对比(Set/Bitmap/HLL/Bloom)
按「要不要判断单个元素存在 + 精度 + 内存」选去重结构:Set 精确但费内存、Bitmap 适合稠密整数 ID、HLL 近似基数、布隆过滤器可判定存在但有误判。
连接池配置与使用要点
客户端连接池要点:限最大连接数、设连接/读写超时、复用连接、监控活跃连接;阻塞命令(BLPOP/SUBSCRIBE)必须用独立连接或独立池。
冷备与灾难恢复(Backup & DR)
持久化文件不等于备份:定期把 RDB/AOF 冷备到异地并演练恢复;恢复流程=申请隔离实例→拷回文件→启动校验→切流量,跨机房与跨版本都要提前试。
哨兵事件订阅(+switch-master / +sdown)
哨兵通过 Pub/Sub 广播事件:PSUBSCRIBE 订阅 * 可拿到全部;运维系统可据此触发告警、刷新连接池、记录时间线。
集群再均衡(--cluster rebalance)
按节点权重自动移动槽使分布均衡:--cluster-weight 指定权重、--cluster-use-empty-masters 允许空主接收槽;用于扩容后容量对齐。
网络参数调优(tcp-backlog / timeout / keepalive)
连接层参数:tcp-backlog 应对连接风暴(需配合 somaxconn)、timeout 回收空闲连接、tcp-keepalive 探测死连接。
缓存预热(上线与重启后)
冷缓存=全部回源:上线、重启、扩容后先预热热点数据,控制回源速率,避免数据库被第一波流量打穿。
文件修复工具(redis-check-rdb / redis-check-aof)
持久化文件损坏时的官方工具:redis-check-rdb 校验快照;redis-check-aof --fix 可截断 AOF 尾部不完整命令(有数据取舍)。
复制健康巡检脚本(实战)
写一个 5 行的巡检脚本:对比主从 offset、检查链路状态、输出延迟字节数;可挂到 cron/监控系统做日常巡检。
MEMORY DOCTOR 与内存体检
MEMORY DOCTOR 给出一句人类可读的诊断(如碎片率过高、maxmemory 未设、峰值逼近上限),适合巡检与告警附言。
版本升级与滚动升级要点
升级路径:先读发行说明的破坏性变更,预发演练,再从从库开始滚动升级;主库最后升或用切换规避停机。
请求合并 / 单飞(singleflight)
同一键的并发回源合并为一个:进程内 singleflight 或分布式锁版本;是击穿与穿透场景之外的通用减负手段。
SCRIPT LOAD / EVALSHA 与脚本缓存管理
脚本先 SCRIPT LOAD 拿 sha1,后续用 EVALSHA 只发 40 字节哈希调用,省带宽;缓存不持久化,重启/FLUSH 后调用报 NOSCRIPT,客户端要自动回落 EVAL 并重新加载。
Key 命名规范与结构设计
统一的 Key 命名是运维与排障的地基:环境+业务+对象+ID 用冒号分隔,控制长度,集群下用 hash tag 控制同槽,规范写进团队文档。
容量规划与规格估算
容量=内存+连接+带宽三本账:内存≈键数×(数据+每键开销)×余量;连接=各客户端池+复制/监控;带宽按 QPS×平均报文;再给 fork 复制与缓冲区留空间。
集群故障排查(CLUSTERDOWN 等)
集群故障先看 CLUSTER INFO 的 cluster_state 与槽覆盖,再看 CLUSTER NODES 的节点状态与握手;CLUSTERDOWN 多为槽缺口或多数主节点失联,修复前先明确根因。
缓存序列化选型(JSON / MsgPack / Protobuf)
序列化决定体积与兼容性:JSON 可读通用、MsgPack 紧凑、Protobuf 最小最快但需 schema;带版本前缀便于演进。
TLS 加密连接配置要点
Redis 6+ 支持 TLS:配置 tls-port/tls-cert-file/tls-key-file/tls-ca-cert-file,客户端用 --tls 连接;证书与端口规划要提前定。
客户端缓存(CLIENT TRACKING)
Redis 6.0+ 的服务端辅助客户端缓存:开启后服务端记录客户端读过的 key,key 被修改时推送失效通知,客户端据此删本地缓存;BCAST 模式按前缀广播以省内存。
io-threads 多线程网络 IO 调优
Redis 6.0+ 支持多线程网络 IO:io-threads 并行处理 socket 读写与协议解析(命令执行仍单线程);写负载重时收益明显,读也并行需开 io-threads-do-reads。