网站首页 文章专栏 处理高并发业务思路
给出鄙人的三点愚见:
1.代码部分 尽量减少与数据库交互
1>.页面静态化- 用户可以直接获取页面,不用走那么多流程,比较适用于页面不频繁更新
2>.接口静态化- 部分请求接口数据不需要频繁变动的
3.>页面静态化+接口动态化 - 有些页面,整体结构是一样的,但是有个别数据是要实时变化的
4.>使用缓存- 第一次获取数据从数据库准提取,然后保存在缓存中,以后就可以直接从缓存提取数据。不过需要有机制维持缓存和数据库的一致性,设置一个合理的过期时间
5.>延迟修改 - 高并发情况下,可以把多次修改请求,先保存在缓存中,然后定时将缓存中的数据保存到数据库中(队列的思想),风险是可能会断电丢失缓存中的数据,
6.>尽可能的用带有索引的数据去取数据,然后用代码逻辑去转变成自己想要的数据,尽可能避免多表联查
2.服务器层面 分发处理请求
1>.nginx反向代理 - 将并发请求分配到不同的服务器上,可以是业务服务器,也可以是数据库服务器。
2>.分布式 - 分布式是把单次请求的多项业务逻辑分配到多个服务器上,这样可以同步处理很多逻辑,一般使用与特别复杂的业务请求。
3.>CDN - 在域名解析层面的分流,例如将华南地区的用户请求分配到华南的服务器,华中地区的用户请求分配到华中的服务器。
3.数据库层面 各种方法拆
1>.水平分表 - 对于访问极为频繁且数据量巨大的单表来说,首先要做的是减少单表的记录条数,以便减少数据查询所需的时间,提高数据库的吞吐,这就是所谓的分表【水平拆分】
2>.垂直分表 - 根据数据库字段的特效,拆成多张数据表,降低业务耦合性
3>.垂直分库- 是根据业务耦合性,将关联度低的不同表存储在不同的数据库上,对数据库进行拆分,从而提高数据库写入能力,即分库【垂直拆分】
4>.建立主从 读写分离- 只在主服务器上写,只在从服务器上读.基本原理是让主数据库处理事务性查询,而从数据库处理select查询,数据库复制被用于把事务性查询(增删改)导致的改变更新同步到集群中的从数据库。
其他特殊场景:
1.某一业务请求特别高,需要经常访问后端服务器
办法:
1>.在域名解析层面的分流,走不同的服务器
2>.将这个业务的逻辑处理服务分布到多台服务器上,在入口机根据ip 做一次服务器层面的分流
3>.根据用户ID,将其业务相关的用户数据表分成多张数据表
4>.分离活跃数据,例如登录用户业务,注册用户很多,但是活跃的登录用户很少,可以把活跃用户专门保存一张表,查询是先查询活跃表,没有的话再查总表
2.秒杀活动:
办法:详见我之前的一篇文章《利用redis实现 限时秒杀》
转载请注明出处