并发、并行及高并发
并发:同一时刻中,只有一个线程在执行,交替执行不同的任务。
并发时如果操作了公用资源,可能产生线程安全问题。
线程安全:多个线程操作公用资源,有可能产生安全问题。
并行:在同一时间内,有个多线程在执行。同一个时间点上有多少个任务在执行,这个执行的数量叫做并发度。
高并发:在同一时间,有大量用户同时访问同一个URL,容易导致服务器和数据库资源被占满崩溃,数据库的存储和更新结果跟理想不一致,例如出现重复的数据记录,多次添加记录等数据错乱问题。
多线程:多线程是Java的特性,因为现在cpu都是多核多线程的,可以同时执行几个任务,为了提高jvm的执行效率,Java提供了这种多线程的机制,以增强数据处理效率。多线程对应的是cpu,高并发对应的是访问请求,可以用单线程处理所有访问请求,也可以用多线程同时处理访问请求。
在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。
后来发展到多线程技术,使得在一个程序内部能拥有多个线程并行执行。一个线程的执行可以被认为是一个CPU在执行该程序。当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序。
总之,多线程即可以这么理解:多线程只是在同/异步角度上解决高并发问题的其中的一个方法手段,是在同一时刻利用计算机闲置资源的一种方式。多线程在高并发问题中的作用就是充分利用计算机资源,使计算机的资源在每一时刻都能达到最大的利用率,不至于浪费计算机资源使其闲置。
如果要想系统能够适应高并发状态,则需要从各个方面进行系统优化,包括,硬件、网络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化等……而多线程只是其中解决方法之一。
高并发的处理策略
流量优化
- 防盗链处理
前端优化
- 减少HTTP请求(例如精灵图)
- 添加异步请求
- 启用浏览器缓存和文件压缩
- CDN加速(CDN是一种特殊的集群页面缓存服务器)
- 建立独立图片服务器
服务端优化
- 页面静态化
- 页面缓存(将应用生成的页面缓存起来,这样就不需要每次都生成页面了,从而可以节省大量的CPU资源,如果将缓存的页面放到内存中速度就更快了)
- 应用程序和静态资源分离
- 反向代理
- 并发处理
- 队列处理
数据库优化
- 数据库缓存(将数据存到redis缓存)
- 分库分表、分区操作(表设计成分库分表,分库减少单一数据库的负担,分表防止因数据量增多而降低数据库的性能)
- 读写分离
- 负载均衡
- 数据库集群
Web服务器优化
- 增加web服务器数量,也就是做集群,做负载均衡集群,分摊系统的工作,减少单一服务器的资源负担
程序设计
- 同步机制
- 事物+锁,防止并发数据错乱
- 数据缓存,加快响应速度