脉冲式
数据库刷盘,Nacos心跳包
为了减少交互,采用先保存到缓存,然后定期打包发送的方式。
搭便车式
MySql修改缓存,TCP的确认标识符ack
由于信息太少,不值得单独发送,等待其他数据一起打包发送。
上面两个经常一起用,像地铁一样。
清单式
就像外出旅行不带行李,只带清单到站了再买一样。
Http/2压缩表头,JVM栈的动态链接(指向JVM的常量池)
一些常用的数据,使用静态表的方式保存,交流的时候传递id,然后自己去查找。
二分查找式
MySql的B+Tree,MongoDB的B-Tree,HashMap的红黑树,Redis的跳表
由于数组需要申请连续空间,而且扩容不灵活,所以数据库大多使用链表;但是链表不能随机查找,只能从头遍历,查找效率底下。
数据库为了提高查找效率,把链表改进成树(现在有点网的趋势,比如跳表)。
预加载
先将数据注入内存。
数据库的热库,Spring的IOC
计算机的操作就是从内存中取值去CPU运算,再把结果存到另一块内存上;现在内存越来越大,预先把可能要用到的东西存到内存里,可以大大提高效率。
顺序头式
TCP头,Http/2二进制分帧
通过管道传输信息虽然快,但很可能会顺序错乱,有一个标记信息顺序的头就很重要了。
日志控制式
各种数据库恢复和同步;好处是日志可以随时记录,而存储数据需要排列,压缩,申请连续空间等复杂操作,耗时更久。所以日志先行,刷盘在后。
权力反转式
公共消息通知,消息队列(kafka)的某些实现(另一些是脉冲式),AIO
平时都是A向B发送消息,但是有时B忙不过来或者B根本就不在,这时候可以换成B向A请求。
就向候诊室一样,医生一次只能看一个病人,但是病人不会一个一个的生病;所以需要候诊室来等待叫号。
轮询式
进程,线程,NIO,springMVC,vue的双向绑定
实际上管事的只有一个人,但是他不停的运行,可以管理好几条线。
多个进程是一个CPU在管,多个线程是一个进程在管,多个controller层方法是DispatchServlet在管,vue监听器监听所有属性。
临时空间式
消息队列,GC的幸存者区,GC的复制法
虽然用法不一样,但都是用来整理数据;一个缓冲区,内存也是一个这种临时空间,有的硬件I/O速度快,有的慢,那么都预先复制到内存,然后由内存传输,大家都不耽误事。
所谓优化,就是空间和时间的平衡
内存够大就多放一点到内存里,内存不够大就懒加载。
类加载是异步的,但是spring容器变成了启动时就加载;
堆内存是可变的,但是内存足够大的情况下会将最小值和最大值设成一样,防止它动态变化影响性能;
链表只能从头开始一个一个查询(比如1-100),但是跳表在链表的基础上新增了一级表(1,3,5,7),二级表(1,10,20)等,间隔越来越大,通过增加链表来达到加快查找的效果。(从高级表开始快速定位)