1.数据库优化方案
硬件层面:升级机器配置,初期性能提升效果较明显,但是成本高,不作为优先方案
软件层面:(按优先级)sql调优、表结构优化、读写分离、数据库集群、分库分表
sql调优
简化代码的嵌套或者关联join等操作,根据需要的情况尽可能的命中索引,让数据变化少的字段、有优化添加索引的字段、主键等优先被判断
表结构优化
添加冗余字段
架构优化
增加集群、访问数据库前加入redis减少访问压力,读多于写时,可使主实例负责写,反之亦可
分库分表
业界流传标准,数据量达到500万可考虑分表,而系统发展到一定规模,必然需要分库操作,单数据库是有性能瓶颈的。
拆分表有垂直切分和水平切分,垂直切分切分字段,细分类别。水分切分可根据数据类型,数据入库时间等进行划分
最后分库分表带来了复杂性,比如跨库关联查询、分布式事务
、排序分页函数计算问题、分布式id、多数据源等
解决方案有如下可参考
2.缓存一致性问题解决方案
对于缓存和数据库的一致性来说
1.先删缓存在更新数据库
保证一致性,可采用延迟双删,更新完数据库后,在slepp一段时间,再次删除缓存,sleep的时间要大于读写缓存的时间
2.先更新数据库在删除缓存
可采用消息队列,更新完成后往队列发消息,消费到消息在删除缓存,借住了消息队列的重试机制,但实际上这样依旧不能保证缓存一致性,引入了消息队列后怎么保证消息不丢失不说,消息队列响应的这段时间依旧会有短暂的不一致
还可采用进阶版消息队列,借助监听binlog消息队列来做删除缓存操作
如果对一致性要求不是很高,也可以采用设置缓存的过期时间来保证数据的一致性
对于分布式系统中缓存的一致性
用的是hash算法计算出放在哪一台服务器,但扩容时数据重新分布,需要变动的数据多,影响性能,进而采取了hash环,依靠虚拟节点对应真实节点来实现负载均衡的情况下尽可能的减少服务器扩容带来的数据迁移问题
3.分布式算法
四大理论基础:
1.拜占庭将军问题
2.CAP理论
3.ACID理论
4.BASE理论
八大分布式协议和算法:
1.Paxos算法
2.Raft算法
3.一致性Hash算法
4.Gossip协议算法
5.Quorum NWR算法
6.FBFT算法 7.POW算法 8.ZAB协议
拜占庭问题的解法
4.设计模式
工厂模式
工厂封装好了客户想要的产品,客户对象只需要根据需求去申请即可
单例模式
在全局中保证某一类只有一个实例,比如在spring中的类就使用注入的方式注入全局的单例
适配器模式
把一个类的接口变换为客户端所期待的另一种接口,中间多一层处理,我的理解像dto实体就可以用来处理一些数据合并、数据转换,最后返回客户端想要的数据集合对象
门面模式
提供了一个高层次的接口作为一个系统的入口,使得系统易于使用,一个系统应只有一个门面类,此类是一个单例模式
代理模式
给某一个对象提供一个代理对象,并由其对源对象进行引用,客户端分辨不出代理对象和真实对象
策略模式
在不影响客户端的情况下,根据不同的环境和行为进行算法的变换,提供所谓不同的策略
模板方法模式
相当于写一个抽象类,实现或构造了部分逻辑,也声明了一些抽象方法
访问者模式
访问者模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易,就是增加一个新的访问者类。