Skip to content

Latest commit

 

History

History
1043 lines (878 loc) · 33.7 KB

File metadata and controls

1043 lines (878 loc) · 33.7 KB

数据库

当前游戏开发所用数据库的常用类型就是:缓存类的和非缓存类的,关系型的和非关系型的。什么情况下用哪种数据库呢?使用数据库的时候会有哪些问题呢?

关键词:
数据库,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(增删改查)

是什么?在哪用?

  • 作用:数据库的基本操作,创建(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特性
    • 支持复杂查询
    • 数据一致性高

SQL语言

是什么?在哪用?

  • 作用:关系数据库的标准查询语言
  • 应用场景
    • 数据查询
    • 数据操作
    • 数据库管理

数据表

是什么?在哪用?

  • 作用:关系数据库的基本存储单位
  • 应用场景
    • 数据组织
    • 数据存储
  • 主键:唯一标识表中的每一行
    • 应用:确保数据唯一性
  • 索引:提高查询性能
    • 应用:加速查询,但会增加写入开销

会遇到哪些问题?用什么解决?

  • 表设计
    • 问题:表设计不当影响性能和扩展性
    • 解决方向
      • 合理设计表结构
      • 使用合适的数据类型
      • 避免过度规范化
      • 考虑查询模式

要点和思考方向

  • 主键确保数据唯一性
  • 索引提高查询性能但增加写入开销
  • 合理设计表结构很重要
类型 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查询可能性能不佳
    • 解决方向
      • 优化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 表设计、分表策略、以及敏感数据的加密存储」

MongoDB

是什么?在哪用?

  • 作用:非关系型文档数据库,以文档形式存储数据
  • 应用场景
    • 非结构化数据
    • 灵活的数据结构
    • 游戏数据存储
  • 特点
    • 文档数据库
    • 灵活的数据结构
    • 水平扩展
    • 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 设计排行榜缓存

更多资料

在线文章

视频资料

问答资料