数据库高并发的问题本质在于:一个是慢,一个是等
而要解决慢和等可以从以下几个方面着手解决
短是指路径要短
典型的mvc架构请求是->controller-->model-->dao(数据层)-->view,然后把页面返回给用户
缩小解决范围:
页面静态化:将一些不常用或者更新间隔时间长的页面实行静态化,例如https://vip.taobao.com/vip_home_new2.htm,这是一个淘宝办理VIP的页面,如果要我实现的话,第一步:导航条去掉因为购物车内商品数量的显示;第二步:页面底部的二维码去掉;第三步将页面独立出来,让用户即使不登录也可以直接访问"VIP.html"这个页面
使用缓存:主要针对于数据与用户无直接关联,写少读多的数据,使用缓存来减少数据库的压力
第一获取数据从数据库中提取,然后保存在缓存中,以后就可以直接从缓存中加载数据,需要有机制维持缓存和数据库的一致性.
不过在我们平时写代码的时候也可以稍微注意一下这个问题例如:
在进行ORM映射查询数据的时候,尽量使用
filter()
方法,因为filter()
方法具有缓存的功能,而且在查询关联表的时候,无论关联多少数据都不会报错使用储存过程 那些处理一次请求需要多次访问数据库的操作,可以把操作整合到储存过程,这样只要一次数据库访问就可以了
批量读取 高并发情况下,可以把多个请求的查询合并到一次进行,以减少数据库的访问次数
延迟修改 高并发情况下,可以把多次修改请求,先保存在缓存中,然后定时将缓存中的数据保存到数据库中,风险是可能会断电丢失缓存中的数据
少是指查询的数据要少:
分表 意思就是将本来一张表的内容,再次细分一下,但是要尽量避免分出来的多表关联查询
分离活跃数据 例如登录用户业务,注册用户很多,可以将活跃用户专门保存一张表,查询时可先查询活跃用户,没有的话在查询总表
分流
集群 将并发请求分配到不同的服务器上
分布式 将单次请求的多项业务逻辑分配到多个服务器上
CDN 域名解析层面的分流,也就是将华南地区的用户请求配给给华南,华中给华中
对于"6.18"等这种特殊时间,可以使用消息队列来削峰异步处理