当前游戏开发所用数据库的常用类型就是:缓存类的和非缓存类的,关系型的和非关系型的。什么情况下用哪种数据库呢?使用数据库的时候会有哪些问题呢?
关键词:
数据库,SQL,MongoDB,Redis,缓存数据库,关系数据库,非关系数据库,文档数据库,连接池,读写分离,事务,CRUD,增删改查,异步处理,数据回滚,备份与恢复,并发问题,更新丢失,错误求和,重复读取,事务排队处理,集群,主键,索引,查询,select,order by,where,as,group by,join,存储过程,SQL优化,MySQL,MSSQL,Schema更新,持久化,算法复杂度,单线程限制,性能优化,AI Coding
标签:
等级: 中级, 阶段: 学习|开发, 分类: 技术能力, 角色: 服务端开发|运维
💡 AI Coding 总览(为何要掌握知识才能更好操作 AI、指南的三类内容等)见 阅读说明 - AI Coding 总览。
🏥 实战案例: 排行榜查询超时 — 全表扫描 5s 到 8ms 的优化之路
- 通用考虑
- CRUD(增删改查)
- 设计考虑
- 维护考虑
- 并发问题
- 更新丢失
- 错误求和
- 重复读取
- 解决
- 集群
- 关系数据库
- SQL语言
- 数据表
- 查询
- 存储过程
- 事务
- SQL优化
- 候选
- 应用
- MongoDB
- 特性
- 应用
- 考虑问题
- 缓存数据库
- 作用
- 应用
- 候选
- 功能
- 解决问题
- 性能问题
- 性能与优化
- 连接池
- 读写分离
- 更多资料
- 在线文章
- 视频资料
- 问答资料
是什么?在哪用?
- 作用:数据库使用中的通用考虑事项
- 应用场景:
- 数据库设计
- 数据库使用
- 数据库维护
是什么?在哪用?
- 作用:数据库的基本操作,创建(Create)、读取(Read)、更新(Update)、删除(Delete)
- 应用场景:
- 所有数据库操作
- 数据管理
- 操作:
- Create:创建新数据
- Read:读取数据
- Update:更新数据
- Delete:删除数据
要点和思考方向
- CRUD是数据库的基本操作
- 所有数据库都支持CRUD操作
- 注意操作的性能和安全性
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明 CRUD 场景、性能;如「批量插入」「条件更新」「软删除」 |
| 方法 | 批量操作;异步 API;参数化防注入 |
| 应用 | 数据操作 |
| 提示词范例 | 「游戏需批量插入 1000 条日志,请说明 MySQL INSERT 批量、事务、以及 C# Dapper 或 EF 的批量插入优化」 |
是什么?在哪用?
- 作用:数据库设计时需要考虑的因素
- 应用场景:
- 数据库设计
- 系统架构
会遇到哪些问题?用什么解决?
-
异步处理
- 问题:数据库都是通过网络进行IO操作,所以都是异步处理。这样在使用的时候就要考虑操作的并发和异步问题
- 解决方向:
- 合理设计异步操作流程,处理并发访问
- 使用异步API
- 处理回调或Promise
- 避免阻塞操作
-
数据模型设计
- 问题:数据模型设计不当影响性能和扩展性
- 解决方向:
- 合理设计表结构
- 考虑查询模式
- 避免过度规范化
- 预留扩展空间
要点和思考方向
- 数据库操作是异步的
- 注意并发访问的处理
- 合理设计数据模型
- 考虑性能和扩展性
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明异步、并发、模型;如「异步 IO」「表结构」「查询模式」 |
| 方法 | 异步 API;Promise/async;避免过度规范化 |
| 应用 | 数据模型设计 |
| 提示词范例 | 「Node.js 连接 MySQL,请说明连接池、async/await、以及避免 N+1 查询的 JOIN 或批量查询」 |
是什么?在哪用?
-
作用:数据库维护时需要考虑的事项
-
应用场景:
- 数据库运维
- 数据管理
-
数据回滚:在出现错误时能够回滚到之前的状态
- 应用:事务回滚、数据恢复
-
备份与恢复:定期备份数据,确保数据安全
- 应用:数据保护、灾难恢复
会遇到哪些问题?用什么解决?
-
备份策略
- 问题:备份策略不当可能导致数据丢失
- 解决方向:
- 制定备份计划
- 定期备份
- 测试恢复流程
- 多地备份
-
数据恢复
- 问题:数据恢复可能耗时较长
- 解决方向:
- 优化恢复流程
- 使用增量备份
- 准备恢复脚本
- 测试恢复时间
要点和思考方向
- 数据回滚和备份很重要
- 制定合理的备份策略
- 定期测试恢复流程
- 准备灾难恢复方案
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明备份、恢复需求;如「全量/增量」「RTO」「多地备份」 |
| 方法 | 备份计划;增量备份;恢复测试 |
| 应用 | 备份恢复 |
| 提示词范例 | 「MySQL 需每日备份,请说明 mysqldump、binlog 增量、以及恢复流程和 RTO 估算」 |
是什么?在哪用?
- 作用:处理并发访问时的数据一致性问题
- 应用场景:
- 高并发场景
- 多用户访问
会遇到哪些问题?用什么解决?
是什么?在哪用?
- 作用:说明更新丢失问题
- 应用场景:
- 并发更新场景
- 情景:
- B读取数据
- A读取数据
- A回写数据
- B回写数据
- 结果:A的回写就丢了
要点和思考方向
- 更新丢失是常见的并发问题
- 使用锁或事务可以解决
- 注意锁的粒度和性能
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明并发更新场景;如「库存扣减」「余额更新」「乐观锁」 |
| 方法 | 事务;乐观锁;版本号;SELECT FOR UPDATE |
| 应用 | 并发更新 |
| 提示词范例 | 「库存扣减可能超卖,请用 MySQL 事务和 SELECT FOR UPDATE 或乐观锁(version 字段)实现,并说明两者取舍」 |
是什么?在哪用?
- 作用:说明错误求和问题
- 应用场景:
- 并发读取和更新场景
- 情景:
- A先读取一个数据
- B改写了下一个数据
- A读取了这个改写后的数据
- 结果:A在求和的时候一部分是老数据、一部分是新数据
要点和思考方向
- 错误求和是并发读取的问题
- 使用事务隔离级别可以解决
- 注意事务的性能影响
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明脏读、不可重复读;如「统计求和」「隔离级别」 |
| 方法 | 事务;REPEATABLE READ;快照 |
| 应用 | 一致性读取 |
| 提示词范例 | 「统计玩家总金币时可能读到部分已提交的中间状态,请说明 MySQL 事务隔离级别、REPEATABLE READ、以及快照读」 |
是什么?在哪用?
- 作用:说明重复读取问题
- 应用场景:
- 并发读取和更新场景
- 情景:
- A先读取一个数据
- B改了这个数据
- A再读这个数据
- 结果:A在两次使用一个数据的时候不一致了
要点和思考方向
- 重复读取是并发一致性问题
- 使用事务隔离级别可以解决
- 注意隔离级别对性能的影响
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明幻读、隔离级别;如「同一事务两次读结果不同」 |
| 方法 | SERIALIZABLE;间隙锁;MVCC |
| 应用 | 幻读解决 |
| 提示词范例 | 「事务内两次 SELECT 结果行数不同(幻读),请说明 MySQL 隔离级别、间隙锁、以及何时需要 SERIALIZABLE」 |
是什么?在哪用?
- 作用:解决并发问题的方法
- 应用场景:
- 并发控制
- 事务排队处理:一个完成了再做下一个
- 应用:使用事务保证操作的原子性
- 其他方法:
- 使用锁机制
- 使用乐观锁
- 使用版本号
- 使用事务隔离级别
要点和思考方向
- 事务是解决并发问题的常用方法
- 注意事务的性能影响
- 根据场景选择合适的并发控制方法
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明并发控制场景;如「事务」「乐观锁」「版本号」 |
| 方法 | 事务;乐观锁;悲观锁;隔离级别 |
| 应用 | 并发控制 |
| 提示词范例 | 「高并发下悲观锁性能差,请说明乐观锁实现(version+WHERE)、重试策略、以及与悲观锁的适用场景」 |
是什么?在哪用?
- 作用:通过集群提高数据库的可用性和性能
- 应用场景:
- 高可用性需求
- 高性能需求
- 扩展性需求
- 类型:
- 主从复制:读写分离
- 主主复制:双主模式
- 分片集群:水平扩展
会遇到哪些问题?用什么解决?
-
集群管理
- 问题:集群管理复杂
- 解决方向:
- 使用集群管理工具
- 监控集群状态
- 自动化运维
- 准备故障切换
-
数据一致性
- 问题:集群中数据可能不一致
- 解决方向:
- 使用强一致性协议
- 处理最终一致性
- 监控数据同步
- 处理冲突
要点和思考方向
- 集群提高可用性和性能
- 注意集群管理的复杂性
- 处理数据一致性问题
- 准备故障切换方案
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明集群需求;如「主从」「分片」「故障切换」 |
| 方法 | 主从复制;分片;监控;自动化切换 |
| 应用 | 高可用 |
| 提示词范例 | 「MySQL 主从延迟导致读从库拿到旧数据,请说明半同步复制、关键读走主库、以及如何监控 slave 延迟」 |
是什么?在哪用?
- 作用:使用关系模型组织数据的数据库
- 应用场景:
- 需要强一致性的数据
- 结构化数据存储
- 复杂查询需求
- 特点:
- 使用表结构
- 支持ACID特性
- 支持复杂查询
- 数据一致性高
是什么?在哪用?
- 作用:关系数据库的标准查询语言
- 应用场景:
- 数据查询
- 数据操作
- 数据库管理
是什么?在哪用?
- 作用:关系数据库的基本存储单位
- 应用场景:
- 数据组织
- 数据存储
- 主键:唯一标识表中的每一行
- 应用:确保数据唯一性
- 索引:提高查询性能
- 应用:加速查询,但会增加写入开销
会遇到哪些问题?用什么解决?
- 表设计
- 问题:表设计不当影响性能和扩展性
- 解决方向:
- 合理设计表结构
- 使用合适的数据类型
- 避免过度规范化
- 考虑查询模式
要点和思考方向
- 主键确保数据唯一性
- 索引提高查询性能但增加写入开销
- 合理设计表结构很重要
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明表设计、索引;如「主键」「索引」「查询模式」 |
| 方法 | 主键设计;复合索引;避免过度规范化 |
| 应用 | 表设计 |
| 提示词范例 | 「玩家表需按 uid 和 区服 查询,请设计主键(单列/复合)、索引、以及分表策略(按区服)」 |
是什么?在哪用?
- 作用:从数据库中检索数据
- 应用场景:
- 数据检索
- 数据分析
- select from:从哪里查询
- 应用:指定查询的表
- order by:按什么排序
- 应用:结果排序
- where:什么查询条件
- 应用:过滤数据
- as:别名
- 应用:简化查询
- group by:基于什么分组
- 应用:数据分组统计
- join:联合查询
- 应用:多表关联查询
会遇到哪些问题?用什么解决?
- 查询性能
- 问题:复杂查询可能性能不佳
- 解决方向:
- 使用索引
- 优化查询语句
- 避免全表扫描
- 使用EXPLAIN分析
要点和思考方向
- SQL查询是关系数据库的核心
- 注意查询性能优化
- 使用索引提高查询速度
- 避免复杂的JOIN操作
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明查询性能、慢查询;如「全表扫描」「EXPLAIN」「索引」 |
| 方法 | EXPLAIN;索引优化;避免 SELECT *;LIMIT |
| 应用 | 查询优化 |
| 提示词范例 | 「查询玩家列表慢,请用 EXPLAIN 分析、说明索引覆盖、以及 N+1 查询改为 JOIN 或 IN 的优化」 |
是什么?在哪用?
- 作用:
- 通常是在应用端通过sql语句来操作数据,如果要执行一段业务逻辑,这样来来回回的发语句、执行、返回结果,效率会比较低
- 存储过程是在数据库的后端执行代码,直接发送一个指令(过程名)和参数到数据库后端,之后由数据库后端来执行这段代码
- 应用场景:
- 业务逻辑比较封闭
- SQL操作比较多
- 需要提高性能
- 应用场景:如果业务逻辑比较封闭、sql操作比较多,就可以考虑建立一个存储过程
会遇到哪些问题?用什么解决?
- 维护困难
- 问题:存储过程维护和调试困难
- 解决方向:
- 使用版本控制
- 文档化存储过程
- 避免复杂逻辑
- 使用测试工具
要点和思考方向
- 存储过程可以提高性能
- 但维护和调试较困难
- 适合封闭的业务逻辑
- 注意版本控制
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明存储过程场景;如「复杂逻辑」「多 SQL」「性能」 |
| 方法 | 存储过程;版本控制;避免复杂逻辑 |
| 应用 | 数据库端逻辑 |
| 提示词范例 | 「扣金币+加道具需原子性,请比较存储过程与应用层事务的优缺点,以及 MySQL 存储过程的 C# 调用」 |
是什么?在哪用?
- 作用:保证一系列操作的原子性,要么全部成功,要么全部失败
- 应用场景:
- 需要原子性的操作
- 数据一致性要求高
- 并发控制
- 特性(ACID):
- 原子性:全部成功或全部失败
- 一致性:数据保持一致
- 隔离性:事务之间隔离
- 持久性:提交后持久化
会遇到哪些问题?用什么解决?
-
事务性能
- 问题:事务可能影响性能
- 解决方向:
- 缩短事务时间
- 选择合适的隔离级别
- 避免长事务
- 使用乐观锁
-
死锁
- 问题:事务可能发生死锁
- 解决方向:
- 避免循环等待
- 统一锁顺序
- 设置超时
- 监控死锁
要点和思考方向
- 事务保证数据一致性
- 注意事务的性能影响
- 避免长事务和死锁
- 选择合适的隔离级别
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明事务问题;如「死锁」「长事务」「隔离级别」 |
| 方法 | 缩短事务;统一锁顺序;超时;监控 |
| 应用 | 事务管理 |
| 提示词范例 | 「MySQL 报死锁,请说明死锁原因、如何用 SHOW ENGINE INNODB STATUS 分析、以及避免循环等待的锁顺序」 |
是什么?在哪用?
- 作用:提高SQL查询的性能
- 应用场景:
- 性能优化
- 查询优化
会遇到哪些问题?用什么解决?
- 性能问题
- 问题:SQL查询可能性能不佳
- 解决方向:
- 优化SQL语句,使用索引,分析执行计划
- 使用EXPLAIN分析查询
- 优化JOIN操作
- 避免SELECT *
- 使用LIMIT限制结果
要点和思考方向
- SQL优化是性能优化的关键
- 使用索引提高查询速度
- 分析执行计划找出瓶颈
- 避免全表扫描
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明 SQL 优化、慢查询;如「EXPLAIN」「索引」「JOIN」 |
| 方法 | 执行计划;索引;避免 SELECT *;分页 |
| 应用 | SQL 优化 |
| 提示词范例 | 「分页 SELECT * FROM user LIMIT 100000, 10 很慢,请说明延迟关联、游标分页、以及覆盖索引的优化」 |
是什么?在哪用?
-
作用:常用的关系数据库实现
-
应用场景:
- 数据库选择
- 技术选型
-
MySQL:开源的关系型数据库
- 特点:开源、流行、性能好
- 应用:Web应用、游戏服务器
-
MSSQL:微软的关系型数据库
- 特点:功能丰富、Windows平台
- 应用:企业应用、.NET应用
会遇到哪些问题?用什么解决?
- 数据库选择
- 问题:如何选择合适的数据库
- 解决方向:
- 根据项目需求选择
- 考虑性能和成本
- 考虑团队熟悉度
- 测试不同数据库
要点和思考方向
- MySQL是流行的开源数据库
- MSSQL适合Windows和.NET环境
- 根据项目需求选择合适的数据库
- 考虑性能和成本
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明数据库选型;如「MySQL vs MSSQL」「游戏服」「.NET」 |
| 方法 | 按需求选型;团队熟悉度;成本 |
| 应用 | 数据库选型 |
| 提示词范例 | 「游戏服用 MySQL 还是 MongoDB?请比较关系型与文档型在玩家数据、复杂查询、事务上的取舍」 |
是什么?在哪用?
-
作用:关系数据库的应用场景
-
应用场景:
- 游戏数据存储
- 平台服务
-
支撑平台服务场景:
- 账户数据
- 支付数据
- 统计数据
-
后台运营场景:运营后台的数据管理
要点和思考方向
- 关系数据库适合结构化数据
- 适合需要强一致性的场景
- 适合复杂查询需求
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明关系库场景;如「账户」「支付」「统计」 |
| 方法 | 结构化数据;ACID;复杂查询 |
| 应用 | 平台服务 |
| 提示词范例 | 「玩家账户、支付记录、登录日志用什么库?请说明 MySQL 表设计、分表策略、以及敏感数据的加密存储」 |
是什么?在哪用?
- 作用:非关系型文档数据库,以文档形式存储数据
- 应用场景:
- 非结构化数据
- 灵活的数据结构
- 游戏数据存储
- 特点:
- 文档数据库
- 灵活的数据结构
- 水平扩展
- JSON格式存储
是什么?在哪用?
- 作用:MongoDB的核心特性
- 应用场景:
- 数据存储设计
- 技术选型
- 非关系型数据库/文档数据库:以文档形式存储数据
- 应用:不需要固定的表结构
- 数据操作灵活:不需要固定的表结构
- 应用:适合数据结构经常变化的场景
要点和思考方向
- MongoDB是文档数据库
- 数据结构灵活
- 适合非结构化数据
- 支持水平扩展
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明 MongoDB 场景;如「玩家数据」「灵活 Schema」「游戏服」 |
| 方法 | 文档模型;水平扩展;索引 |
| 应用 | 游戏数据 |
| 提示词范例 | 「玩家背包、技能、任务数据结构常变,请说明 MongoDB 文档设计、嵌入 vs 引用、以及 Mongoose Schema 的版本管理」 |
是什么?在哪用?
- 作用:MongoDB的应用场景
- 应用场景:
- 游戏数据存储
- 日志存储
- 游戏服场景:游戏内的数据,比如角色/玩家在游戏内的数据
- 应用:玩家数据、游戏状态等
要点和思考方向
- MongoDB适合游戏数据存储
- 数据结构灵活,适合游戏需求
- 支持水平扩展
- 注意数据一致性
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明 MongoDB 应用;如「角色数据」「游戏状态」 |
| 方法 | 灵活 Schema;副本集;事务 |
| 应用 | 游戏服数据 |
| 提示词范例 | 「MongoDB 存玩家数据,请说明副本集、读写偏好、以及强一致性读的 readPreference primary」 |
是什么?在哪用?
- 作用:使用MongoDB时需要考虑的问题
- 应用场景:
- MongoDB使用
- 数据迁移
会遇到哪些问题?用什么解决?
-
Schema更新问题
- 问题:当Schema更新了,玩家数据要如何更新?
- 解决方向:
- 实现一个mongoose的upsert扩展插件,遍历数据key,按新的数据结构补齐并更新文档。细节查看markdowns文档中的更多资料
- 实现数据迁移脚本
- 使用版本号管理Schema
- 测试数据迁移
-
数据一致性
- 问题:MongoDB是最终一致性,可能数据不一致
- 解决方向:
- 使用副本集
- 处理最终一致性
- 监控数据同步
- 使用事务(如果支持)
-
查询性能
- 问题:复杂查询可能性能不佳
- 解决方向:
- 创建合适的索引
- 优化查询语句
- 使用聚合管道
- 分析查询性能
要点和思考方向
- Schema更新是MongoDB的常见问题
- 注意数据一致性
- 优化查询性能
- 使用索引提高查询速度
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明 Schema 更新、迁移;如「新增字段」「数据迁移」「版本」 |
| 方法 | 迁移脚本;版本号;upsert 补齐 |
| 应用 | Schema 迁移 |
| 提示词范例 | 「MongoDB 玩家文档新增字段,旧数据需补齐,请用 Mongoose 或原生实现迁移脚本:遍历、按新 Schema 更新」 |
是什么?在哪用?
- 作用:将数据存储在内存中,提供快速访问
- 应用场景:
- 频繁访问的数据
- 热点数据
- 临时数据
- 特点:
- 读写速度快
- 数据存储在内存
- 通常有过期机制
是什么?在哪用?
- 作用:缓存数据库的核心作用
- 应用场景:
- 性能优化
- 数据访问加速
- 说明:其它数据区是从文件访问数据,虽然也有一定的缓存规则,但速度还是很慢。有了缓存数据库,直接将数据放到内存进行操作访问,处理速度就会快很多
- 用于数据的频繁、快速访问
- 应用:热点数据、会话数据等
要点和思考方向
- 缓存数据库提供快速访问
- 适合频繁访问的数据
- 注意内存限制
- 需要持久化策略
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明缓存场景;如「热点数据」「会话」「排行榜」 |
| 方法 | 内存存储;过期;持久化 |
| 应用 | 缓存加速 |
| 提示词范例 | 「玩家在线状态、会话用 Redis,请说明 String/Hash 选择、过期时间、以及 RDB/AOF 持久化配置」 |
是什么?在哪用?
- 作用:缓存数据库的应用场景
- 应用场景:
- 游戏数据缓存
- 会话存储
- 游戏服场景:需要快速访问的游戏数据
- 应用:玩家状态、排行榜、会话等
要点和思考方向
- 缓存数据库适合快速访问场景
- 适合热点数据
- 注意数据一致性
- 需要缓存更新策略
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明缓存应用;如「排行榜」「会话」「玩家状态」 |
| 方法 | 缓存更新;失效策略;双写 |
| 应用 | 游戏缓存 |
| 提示词范例 | 「排行榜用 Redis Sorted Set,请说明 ZADD、ZRANGE、以及分数相同时按时间排序的实现」 |
是什么?在哪用?
- 作用:常用的缓存数据库实现
- 应用场景:
- 缓存数据库选择
- 技术选型
- Redis
- 特性:
- 单线程响应
- 网络 I/O 多路复用
- 非阻塞的执行方式
- 特点:功能丰富、性能好、支持多种数据结构
- 应用:缓存、会话存储、消息队列等
- 特性:
会遇到哪些问题?用什么解决?
- 缓存数据库选择
- 问题:如何选择合适的缓存数据库
- 解决方向:
- 根据需求选择
- 考虑功能和性能
- 考虑团队熟悉度
- 测试不同方案
要点和思考方向
- Redis是流行的缓存数据库
- 功能丰富,支持多种数据结构
- 单线程模型性能好
- 注意内存限制
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明 Redis 选型、场景;如「缓存」「会话」「消息队列」 |
| 方法 | String/Hash/List/Set/ZSet;Pub/Sub |
| 应用 | Redis 选型 |
| 提示词范例 | 「游戏需缓存、排行榜、消息队列,请说明 Redis 各数据结构适用场景、以及 List 与 Stream 做消息队列的差异」 |
是什么?在哪用?
- 作用:缓存数据库的核心功能
- 应用场景:
- 缓存管理
- 数据存储
- 缓存过期:设置缓存数据的过期时间
- 应用:自动清理过期数据
- 其他功能:
- 数据结构支持(String、List、Set、Hash等)
- 发布订阅
- 事务支持
- Lua脚本
要点和思考方向
- 缓存过期是重要功能
- 支持多种数据结构
- 注意过期策略
- 合理设置过期时间
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明 Redis 功能;如「过期」「TTL」「淘汰策略」 |
| 方法 | EXPIRE;淘汰策略;maxmemory |
| 应用 | 缓存管理 |
| 提示词范例 | 「Redis 内存满,请说明 maxmemory-policy(LRU/LFU)、过期键删除、以及 allkeys-lru 与 volatile-lru 的区别」 |
是什么?在哪用?
- 作用:缓存数据库解决的问题
- 应用场景:
- 性能优化
- 数据访问加速
会遇到哪些问题?用什么解决?
-
持久化
- 问题:由于缓存数据库都是存储在内存中,所以要考虑这些数据的持久化方法,防止数据丢失
- 解决方向:
- 配置持久化策略,选择合适的持久化时机
- 使用RDB快照
- 使用AOF日志
- 配置持久化频率
- 测试恢复流程
-
异常处理:处理缓存数据库的异常情况
- 问题:缓存数据库可能故障
- 解决方向:
- 实现降级策略
- 使用主从复制
- 监控缓存状态
- 处理缓存穿透
-
缓存一致性
- 问题:缓存和数据库数据可能不一致
- 解决方向:
- 使用缓存更新策略
- 使用缓存失效
- 使用双写
- 处理缓存穿透和击穿
要点和思考方向
- 持久化防止数据丢失
- 注意异常处理
- 处理缓存一致性问题
- 实现降级策略
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明缓存问题;如「持久化」「穿透」「击穿」「一致性」 |
| 方法 | RDB/AOF;布隆过滤;双写;降级 |
| 应用 | 缓存可靠性 |
| 提示词范例 | 「Redis 与 MySQL 数据不一致,请说明 Cache Aside、先更新库再删缓存、以及缓存穿透用布隆过滤器的方案」 |
是什么?在哪用?
- 作用:缓存数据库的性能考虑
- 应用场景:
- 性能优化
- 容量规划
会遇到哪些问题?用什么解决?
-
算法复杂度
- 问题:注意查看每种数据结构的操作算法复杂度
- 解决方向:
- 选择合适的数据结构,了解其性能特征
- 了解各操作的复杂度
- 避免高复杂度操作
- 测试性能
-
单线程限制
- 问题:因为是单线程,一个Redis进程主要占用一个CPU内核
- 解决方向:
- 如果在同一台主机想要获得更大的处理能力,可以考虑使用多个Redis进程
- 使用Redis集群
- 使用分片
- 优化数据结构
-
内存限制
- 问题:内存容量有限
- 解决方向:
- 使用内存淘汰策略
- 限制数据大小
- 使用压缩
- 监控内存使用
要点和思考方向
- 注意数据结构的算法复杂度
- 单线程模型有性能限制
- 注意内存限制
- 使用集群扩展性能
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明 Redis 性能;如「KEYS 慢」「大 key」「集群」 |
| 方法 | SCAN 替代 KEYS;避免大 key;集群;Pipeline |
| 应用 | Redis 优化 |
| 提示词范例 | 「Redis KEYS * 阻塞,请说明 SCAN 迭代、大 key 拆分、以及 Pipeline 批量操作的用法」 |
是什么?在哪用?
- 作用:提高数据库系统的性能和可用性
- 应用场景:
- 性能优化
- 高并发场景
- 系统扩展
是什么?在哪用?
- 作用:管理数据库连接,复用连接提高性能
- 应用场景:
- 频繁数据库访问
- 高并发场景
- 优点:
- 减少连接创建开销
- 复用连接
- 控制连接数量
会遇到哪些问题?用什么解决?
-
游戏中会频繁的访问操作数据,如何合理的建立数据库链接?
- 注意:
- 数量不要太少:太少解决不了数据访问拥挤、阻塞的问题
- 数量也不要太多:太多了访问量上来了会把系统资源占满,影响其它业务
- 解决方向:
- 根据并发量设置连接数
- 监控连接使用情况
- 动态调整连接数
- 使用连接池管理工具
- 注意:
-
连接泄漏
- 问题:连接未正确释放导致连接泄漏
- 解决方向:
- 确保连接正确释放
- 使用try-finally或using
- 监控连接数
- 设置连接超时
要点和思考方向
- 连接池提高性能
- 合理设置连接数很重要
- 注意连接泄漏
- 监控连接使用情况
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明连接池问题;如「连接数」「泄漏」「高并发」 |
| 方法 | 连接池大小;using/try-finally;监控 |
| 应用 | 连接管理 |
| 提示词范例 | 「游戏服 1000 并发访问 MySQL,请说明连接池大小设置、C# SqlConnection 连接池、以及连接泄漏的排查」 |
是什么?在哪用?
- 作用:可以有效提高数据库系统的性能、可用性、容错性和负载均衡能力
- 应用场景:
- 读多写少场景
- 高并发读取
- 提高可用性
- 应用:将读操作和写操作分离到不同的数据库实例
- 实现:
- 主库处理写操作
- 从库处理读操作
- 主从数据同步
会遇到哪些问题?用什么解决?
-
数据延迟
- 问题:主从同步可能有延迟
- 解决方向:
- 处理最终一致性
- 关键读操作走主库
- 监控同步延迟
- 使用半同步复制
-
路由问题
- 问题:如何路由读写请求
- 解决方向:
- 使用中间件路由
- 应用层路由
- 使用数据库代理
- 处理路由失败
要点和思考方向
- 读写分离提高性能和可用性
- 注意数据同步延迟
- 合理路由读写请求
- 监控主从同步状态
| 类型 | AI Coding 指南 |
|---|---|
| 交互提示 | 说明读写分离、延迟;如「主从」「读从库」「延迟」 |
| 方法 | 主从路由;关键读走主库;监控延迟 |
| 应用 | 读写分离 |
| 提示词范例 | 「读写分离后,刚写入的数据读不到,请说明主从延迟、强制读主库、以及 C# 或 Node.js 的读写分离路由实现」 |
| 类型 | 链接 |
|---|---|
| 🏥 相关案例 | 排行榜查询超时 |
| 🤖 AI 对话 | 用 ChatGPT 设计排行榜缓存 |
- MongoDB 全方位知识图谱 - 本文既有 MongoDB 基础知识也有相对深入的进阶知识,同时适用于对 MonogDB 感兴趣的初学者或者希望对 MongoDB 有更深入了解的业务开发者。
- 面试官:你确定 Redis 是单线程的进程吗?
- Redis 是单线程的正确理解