目录
1、 批量操作数据库
我们在使用 MyBatis 或者是 MyBatisPlus中自带的 batch 方法或 saveBatch 方法进行批量添加数据的时候,是有限制的,条数在1000[SQLServerException],参数在2100[PacketTooBigException],这个时候我们可以采用多线程的方式进行分段插入---SQL循环那样写
2、 耗时操作,异步执行
异步处理[使用线程池 或者是 mq],这样可以降低接口耗时
(1)使用消息队列:
比如秒杀活动下单的时候,将订单信息放入mq中,然后在添加到数据库,可能会造成消息堆积的问题,给消费者建集群,批量消费数据
(2)使用多线程
在处理请求时,可以创建多个线程来同时处理多个请求。这样可以充分利用 CPU 资源,提高处理效率。
3、 利用空间来换取时间:缓存
对于一些需要频繁访问的数据,可以使用缓存来避免每次请求都需要从数据库中读取。这样可以大大减少 IO 操作,提高接口的响应速度。
将自己要查询的数据,提前放在缓存中,需要时,直接查缓存,避免去数据库查询
可以使用redis,虽然它占用了内存,但是访问的速度快了,将数据存入redis中,用户直接从内存中取出。如果数据量过大,一定要用关系型数据库存储的话,就可以分库分表。但是有时候,我们也可以使用`NoSQL,如Elasticsearch、Hbase`等。
4、 锁粒度避免过粗
加锁粒度:就是你要锁住的范围
比如你在家上卫生间,你只要锁住卫生间就可以了吧,不需要将整个家都锁起来不让家人进门吧,卫生间就是你的加锁粒度
在做秒杀活动的时候,为了避免超卖的问题,我们一般会加上Redission锁,这个时候你如果是刚进入方法就加锁,上锁之后开始执行各种业务逻辑,这个时候锁粒度比较粗,整体效率会降低,我们之后又做了改善,因为线程不安全的地方只是发生在预减库存的时候,这个时候只在减库存的时候加锁的话,锁粒度就不会太粗了,还可以用信号量来解决
5、 对数据库字段建立索引
注意:要求字段重复率不要太高,需要考虑------->什么时候索引不生效、深度分页的问题
6、CDN
使用静态资源服务器,也就是第三方,将自己所有的静态资源压缩后放[缓存]在cdn中,这样用户进行访问的时候会从最近的节点取出数据提供给用户,这样减少了网络传输的延迟和带宽消耗,提高了用户访问网站的速度和性能
CDN还能通过负载均衡和智能路由等技术,将用户请求分发到最优的服务器节点上,进一步提高了接口的性能和稳定性。
7、FullGc
减少了Full GC的次数可以减少应用程序的停顿时间,提高应用程序的响应速度和吞吐量,从而提高接口的性能。
Full GC是一种比较耗时的操作,会导致应用程序的停顿时间变长,对于需要高并发、低延迟的接口来说,这种停顿时间会导致接口响应变慢,甚至超时,影响接口的性能。
具体来说,减少Full GC的次数可以通过以下几种方式实现:
(1)优化代码,减少对象的创建和销毁,避免产生大量的垃圾对象,从而减少Full GC的触发次数。
(2)调整JVM的参数,如调整堆大小、调整垃圾回收器的类型和参数等,使得垃圾回收更加高效,减少Full GC的触发次数。
(3)使用对象池技术,对于一些需要频繁创建和销毁的对象,可以使用对象池技术,将这些对象缓存起来,避免频繁的创建和销毁操作,从而减少Full GC的触发次数。
也可以换一个大一点的内存