海量数据和高并发解决方案

ps :读书笔记css

海量数据解决方案

缓存和页面静态化

  缓存就是把从数据库中的数据暂时存起来,下次使用时无需在查询数据库。缓存分为程序直接保存到内存和框架框架2种。程序缓存通常使用currentHashMap直接保存到内存。框架缓存的话有redis,memcache等。
  ps:空数据值问题。
  缓存建立的时候把没有数据的缓存用特定的符号来表示。由于这种模式下若是从缓存中获取不到数据,就会查询数据库,可是其自己就没有数据的话。那么每次都要查询一次数据库,不合理。
  页面静态化:是将程序生成的页面保存起来。这样下次调用直接就使用。连程序这一关也过了。更加快速。能够在程序中使用velocity等技术来生成静态页面,也能够经过上层缓存Nginx来生成。前端

数据库优化

  1.表结构优化:设计合理的符合规范的表。
  2.sql优化:根据日志以及其余工具分析那条sql语句最耗时,在针对性的有的放矢的优化,要统筹好,不能只针对一条语句,优化时要考虑到表上的其余语句综合考虑。
  3.分区:一个表中数据量太大时,那么分区就可使用了。分区是将数据按照必定规则把数据分到不一样区来保存,这样子操做数据时,数据量更少。查询数据时只在必定区间进行。且这种操做时对程序透明的。程序无需修改。
  4.分表:分表就是把表横向切分为几个表。第一种方式就是为了减小数据,好比一张表里面某个字段是分类。能够更具这个分类来分为多个表。以此来减小每一个表的数据量。第二种方式是因为某个表某些字段常常被查,可是不修改,某些字段须要进场修改,那么分表是个不错的选择,由于对于mysql之类的表来讲,增删改操做时要加锁的,不管是什么隔离级别。,这样子加锁范围就减小了。对于mysql来讲不是问题,可是对于其余数据库来讲就不知道了。对于mysql来讲能够照样读取数据,对于某些数据库或者se隔离级别的mysql,这条记录也是不可读的。须要等待数据库释放这条记录的锁。
  5.索引优化:对于mysql的innodb来讲,我上篇博客已经说过了。这里简单说下,最左匹配原则,综合全部查询语句,找出,最佳的索引建立原则和最佳的查询语句,好比,你有联合索引(a,b,c)。你的查询语句为b=1 and c=1 那么要么调整查询语句让其条件多个a=?要么联合索引(a,b,c)调整为(b,c,a)。其次对于mysql来讲。一条语句有且只用一个表有且只用一条索引。至于多表查询时连表的语句也会加入到索引里面。
  6.存储过程:对于复杂的sql来讲来讲,直接使用存储过程来调用,能够有效提升效率。mysql

活跃数据分离

  一个数据量很大的表,只有一小部分数据是活跃数据,常常被查询,更多的数据则是惰性数据,偶尔被调用一下。那么咱们能够用2个表来保存,第一个表是活跃数据保存,第二个表是惰性数据保存。这样子能够有效提升效率。至因而否活跃数据,怎么分配就要看本身方业务逻辑怎么实现的了。ajax

批量读取和延迟修改

  1.批量读取:故名思议,把一堆查询结合成一条查询,好比。有的业务是要查询一次作个操做,那么能够把这些查询放在一个in()语句里面。又或者高并发下,把几秒的异步请求统一查询处理。
  2.延迟修改:就是把一些频繁修改的数据放到一个缓存里面去,而后定时把缓存的数据刷到数据库里面,这个缓存和普通缓存不同,这个缓存的数据库不是完整的。程序查询时同时读取数据库和缓存的数据,综合读取之。redis

读写分离

  aaa

  先上一张图,这个图是书里面的,提及来很简单就是把读取数据和增删改数据分离到不一样数据库里面。增删改放到主数据库里面,读取数据则是放到从数据库里面。主数据的数据经过底层同步到从数据库里面。sql

分布式数据库

  分布式数据库是将不一样的表放到不一样的数据库里面,而后再放到不一样的服务器里面,这样子查询时可使用多台服务器来运行,能够有效提升效率,主要用于超复杂耗时的查询。这个能够和读写分离一块儿使用,搭配使用。另外一种状况是不一样业务的表放在不一样数据库里面,能够起到分流的做用数据库

NoSql和Hadoop

  NoSql和sql比起来就是非结构化的,就是没有定义好的字段,类型啊之类的,可是NOsql是经过多个块存储数据,所以效率速度很快,被普遍应用于大数据
  Hadoop:Hadoop是针对大数据处理的一套框架。浏览器

aaa

  这个是Hadoop存储图,就是把表的数据块分为多个节点保存。这样子能够并发处理而且能够保存数据的稳定性。Hadoop是对每个数据块找到的节点并处理,而后在统一处理,获得最终结果(这块不熟)缓存

高并发处理方案

静态资源分离

  就是将图片,视频,css,等文件保存到另一个服务器中,使用2级域名,经过不一样域名,可让浏览器迅速获取到资源而不用访问应用服务器。服务器

aaa

页面缓存

  就是将程序生成的页面缓存保存下来,下次访问时就不用再用cpu来生成数据了。浪费其资源。可使用Nginx服务器自带的缓存机制,也可使用专门的squid来处理。(ps:对于一些页面某些数据常常变化,可是总体不变,那么咱们可使用ajax来请求从新获取数据来更新界面)

集群和分布式

  集群就是相同的程序放到多个服务器里面,主要起到分流的做用。分布式就是更具业务逻辑将程序拆分到不一样服务器上。这2个能够一块儿使用。(至于集群致使的session和token问题,下一章会有篇关于session和token)。不用业务之间的联系能够经过RPC来处理,咱们这边业务较为复杂,将大量的程序拆分红一个个的微服务。每一个微服务之间经过dubbo来传递消息。

反向代理

aaa

  反向代理:就是客户端访问的服务器不直接提供资源,该服务器从别的服务器获取资源并返回给用户主要由3个做用
  1.能够负载均衡
  2.能够转发请求
  3.能够做为前端服务器和实际请求服务器集成。
  ps:反向代理和代理服务器不同。反向代理是用户不知道这个事,一切都是透明的。代理服务器则是用于代替用户获取资源在返回给用户,须要用户手动设置。

CDN

aaa

  CDN是个特殊的页面缓存服务器,和普通的服务器相比,CDN服务器遍及全国各地,当接受到用户请求时,会将其分配到对应的最合适节点,根据地域等信息来分配,如图所示为其中一个实现方式。

相关文章
相关标签/搜索