这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
今天学习了数据库相关知识以及在高并发场景下相关注意事项
数据库相关总结
存储系统简介
-
存储系统: 一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称为存储系统
-
存储系统特点:
- 作为后端软件的底座,性能敏感
- 存储系统软件架构,容易受硬件影响
- 存储系统代码,既“简单”又“复杂
-
数据库和存储系统不同,数据库分为关系型数据库和非关系型数据库
-
关系型数据库和非关系型数据库区别:
- 关系型数据库特点:结构化数据友好,支持事务 (ACID),支持复杂查询语言
- 非关系型数据库:半结构化数据友好,可能支持事务 (ACID),可能支持复杂查询语言
主流数据库简介
单机存储产品
- 单机文件系统
- 单机key-value存储
分布式存储产品:相比于单机存储实现分布式协议,涉及大量网络交互
- HDFS
- Ceph
单机数据库产品
- 关系型数据库 —— PG、MySQL
- 非关系型数据库 —— ES、MongoDB、Redis
- Elasticsearch使用案例
分布式数据库产品
-
问题与挑战
- 容量,弹性,性价比问题
-
解决方案
数据库技术演进
-
数据库未来的发展
- 数据库的并发写,从磁盘弹性到内存弹性,分布式事物优化
-
新技术演进
-
总结思考题
- 写入存储系统的粒度太大,会不会导致数据原子性问题?例如一次性写100MB,如果系统突然crash,会不会只有一部分数据持久化了,另一部分丢失了?如果要解决原子性问题,一般会设计什么机制?
- 在从应用程序到存储介质的链路上,无论读还是写,数据可能要被拷贝好几次,这几次拷贝能不能去掉?如果我们去掉大部分拷贝操作,会有什么副作用,要怎么缓解副作用?
- 一个关系型数据库大概率是会被并发访问的,如果要保证并发安全,除了在行数据上加悲观锁还有其他方式吗?
- 在数据库领域,把数据按行存和按列存各有好处,你能从性能优先的角度设计出一种混合存储格式吗?
高并发场景的注意事项
-
使用静态页面减少并发
- 只在请求秒杀的时候才获取请求,减少请求量
- 使用CDN,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
-
秒杀按钮限制
- 静态页面中的动态按钮:当秒杀开始的时候系统会生成一个新的js文件,此时标志为true,并且随机参数生成一个新值,然后同步给CDN。由于有了这个随机参数,CDN不会缓存数据,每次都能从CDN中获取最新的js代码。
-
使用集群部署Redis等高效中间件
- 秒杀场景读多写少
-
缓存相关问题
- 缓存击穿:预热,避免穿透
- 缓存穿透:使用布隆过滤器来快速得知是否存在数据(更新频率高的数据不适合)
-
超卖问题
- 使用Redis+lua实现
-
分布式锁
- 使用Redis实现分布式锁
-
消息队列异步处理
- 使用消息队列将秒杀过程和付款等流程解耦
-
限流策略
- 同一用户,ip限流
- 提高门槛:验证码,身份认证等