如何解决数据库高并发?

发生数据库高并发问题主要在用户访问量增加,例如以下场景:定时秒杀活动,大范围的同一时间段的抢红包活动(支付宝的新年集字领红包等)

数据库高并发的问题本质在于:一个是慢,一个是等

而要解决可以从以下几个方面着手解决

  • 短是指路径要短

    典型的mvc架构请求是->controller-->model-->dao(数据层)-->view,然后把页面返回给用户

    缩小解决范围:

    1. 页面静态化:将一些不常用或者更新间隔时间长的页面实行静态化,例如https://vip.taobao.com/vip_home_new2.htm,这是一个淘宝办理VIP的页面,如果要我实现的话,第一步:导航条去掉因为购物车内商品数量的显示;第二步:页面底部的二维码去掉;第三步将页面独立出来,让用户即使不登录也可以直接访问"VIP.html"这个页面

    2. 使用缓存:主要针对于数据与用户无直接关联,写少读多的数据,使用缓存来减少数据库的压力

      第一获取数据从数据库中提取,然后保存在缓存中,以后就可以直接从缓存中加载数据,需要有机制维持缓存和数据库的一致性.

      不过在我们平时写代码的时候也可以稍微注意一下这个问题例如:

      在进行ORM映射查询数据的时候,尽量使用filter()方法,因为filter()方法具有缓存的功能,而且在查询关联表的时候,无论关联多少数据都不会报错

    3. 使用储存过程 那些处理一次请求需要多次访问数据库的操作,可以把操作整合到储存过程,这样只要一次数据库访问就可以了

    4. 批量读取 高并发情况下,可以把多个请求的查询合并到一次进行,以减少数据库的访问次数

    5. 延迟修改 高并发情况下,可以把多次修改请求,先保存在缓存中,然后定时将缓存中的数据保存到数据库中,风险是可能会断电丢失缓存中的数据

  • 少是指查询的数据要少:

    1. 分表 意思就是将本来一张表的内容,再次细分一下,但是要尽量避免分出来的多表关联查询

    2. 分离活跃数据 例如登录用户业务,注册用户很多,可以将活跃用户专门保存一张表,查询时可先查询活跃用户,没有的话在查询总表

  • 分流

    1. 集群 将并发请求分配到不同的服务器上

    2. 分布式 将单次请求的多项业务逻辑分配到多个服务器上

    3. CDN 域名解析层面的分流,也就是将华南地区的用户请求配给给华南,华中给华中

对于"6.18"等这种特殊时间,可以使用消息队列来削峰异步处理

你可能感兴趣的:(数据库高并发)