高可用会遇到的问题:
缓存雪崩:大量key设置相同过期时间,导致缓存在同一时刻同时失效,导致所有请求直接访问数据库,压力骤大,引起雪崩。
解决办法:给每个缓存时间加上一个随机时间,使得每个key的过期时间不同。
缓存穿透:访问一个不存在的key,导致缓存不起作用,直接访问数据库,流量大时,数据库挂掉。
解决方法:访问key未在DB查询到值,也将空值写进缓存,但可以设置较短过期时间
缓存击穿:访问一个存在的key,在key过期的那一刻,大量请求涌入,直接访问数据库,导致数据库挂掉
解决办法:在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。
熔断器:当微服务的运行质量低于某个临界值时,启动熔断机制,暂停微服务调用一段时间,以保障后端的微服务不会因为持续过负荷而宕机
A服务需要调用B服务,但是B服务会出现一些小问题,如数据库变慢,网络延迟等问题,假设不用处理,则会导致涌入的进程越来越多,可能会需要用户重试。如果用了熔断器,断路器被设计为在不等待TCP连接超时的情况下快速而优雅地处理错误。这种快速失败机制将保护下游服务
sql优化问题
考虑在where后面的字段加入索引
避免在where语句的字段中对null进行判断,否则会放弃索引查询,启动全局搜索
尽量避免使用*,用字段代替
尽量避免用or来连接where查询语句的字段,尽量使用union all连接两个sql语句
尽量避免使用in,因为会放弃索引查询,启动全局搜索,用between来代替
尽量避免在where语句后对字段进行函数操作
尽量使用varchar来代替char
数据库创建的三大范式
1.保证字段的原子性
2.满足第一条的情况下,要求表中的列,都依赖主键,而不能有任一一列和主键没有关系,即一个表只描述一件事情
3.曼度第二个的条件下,任意一列只与主键直接相关,不能间接相关
基本表的性质
(1) 原子性。基本表中的字段是不可再分解的。
(2) 原始性。基本表中的记录是原始数据(基础数据)的记录。
(3) 演绎性。由基本表与代码表中的数据,可以派生出所有的输出数据。
(4) 稳定性。基本表的结构是相对稳定的,表中的记录是要长期保存的。
注册的时序图
感谢几位老铁的分享:
https://www.jianshu.com/p/b57d0773ee96
http://www.jintiankansha.me/t/Pt5PeHTR3b
https://blog.csdn.net/jie_liang/article/details/77340905
https://blog.csdn.net/qq_33862644/article/details/79692652
https://www.cnblogs.com/rick168/p/4674731.html