博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
应用服务器优化技术
阅读量:6069 次
发布时间:2019-06-20

本文共 1058 字,大约阅读时间需要 3 分钟。

① 分布式缓存:缓存的本质就是内存中的哈希表,如果设计一个优质的哈希函数,那么理论上哈希表读写的渐近时间复杂度为O(1)。缓存主要用来存放那些读写比很高、变化很少的数据,这样应用程序读取数据时先到缓存中读取,如果没有或者数据已经失效再去访问数据库或文件系统,并根据拟定的规则将数据写入缓存。对网站数据的访问也符合二八定律(Pareto分布,幂律分布),即80%的访问都集中在20%的数据上,如果能够将这20%的数据缓存起来,那么系统的性能将得到显著的改善。当然,使用缓存需要解决以下几个问题:

- 频繁修改的数据;

- 数据不一致与脏读;

- 缓存雪崩(可以采用分布式缓存服务器集群加以解决,memcached是广泛采用的解决方案);

- 缓存预热;

- 缓存穿透(恶意持续请求不存在的数据)。

② 异步操作:可以使用消息队列将调用异步化,通过异步处理将短时间高并发产生的事件消息存储在消息队列中,从而起到削峰作用。电商网站在进行促销活动时,可以将用户的订单请求存入消息队列,这样可以抵御大量的并发订单请求对系统和数据库的冲击。目前,绝大多数的电商网站即便不进行促销活动,订单系统都采用了消息队列来处理。

③ 使用集群。

④ 代码优化:

- 多线程:基于Java的Web开发基本上都通过多线程的方式响应用户的并发请求,使用多线程技术在编程上要解决线程安全问题,主要可以考虑以下几个方面:A. 将对象设计为无状态对象(这和面向对象的编程观点是矛盾的,在面向对象的世界中被视为不良设计),这样就不会存在并发访问时对象状态不一致的问题。B. 在方法内部创建对象,这样对象由进入方法的线程创建,不会出现多个线程访问同一对象的问题。使用ThreadLocal将对象与线程绑定也是很好的做法,这一点在前面已经探讨过了。C. 对资源进行并发访问时应当使用合理的锁机制。

- 非阻塞I/O: 使用单线程和非阻塞I/O是目前公认的比多线程的方式更能充分发挥服务器性能的应用模式,基于Node.js构建的服务器就采用了这样的方式。Java在JDK 1.4中就引入了NIO(Non-blocking I/O),在Servlet 3规范中又引入了异步Servlet的概念,这些都为在服务器端采用非阻塞I/O提供了必要的基础。

- 资源复用:资源复用主要有两种方式,一是单例,二是对象池,我们使用的数据库连接池、线程池都是对象池化技术,这是典型的用空间换取时间的策略,另一方面也实现对资源的复用,从而避免了不必要的创建和释放资源所带来的开销。

 

转载地址:http://mhfgx.baihongyu.com/

你可能感兴趣的文章
Laravel-Action 对代码的改造
查看>>
联调环境快速部署——基于docker-compose的CI/CD实践
查看>>
【跃迁之路】【498天】刻意练习系列257(2018.06.18)
查看>>
vue 解决addRoutes动态添加路由后,刷新失效问题
查看>>
Java多线程基础(十一)——Future模式
查看>>
解决Retrofit多BaseUrl及运行时动态改变BaseUrl(二)
查看>>
【深入浅出MyBatis笔记】插件
查看>>
sublime常用基础插件合集
查看>>
React 重温之Render Props
查看>>
聊聊JerseyEurekaHttpClient的参数
查看>>
js 粘贴图片的应用(clipboardData)
查看>>
5分钟解决小程序的微信支付
查看>>
SpringBoot里的@Import使用
查看>>
Mac 配置Apache服务器详解
查看>>
从Rancher 1.6到2.0:术语及概念变化对比
查看>>
一次线上问题的排查解决过程
查看>>
ES5与ES6字符串方法总结
查看>>
基于Django开发的简洁博客系统
查看>>
Lintcode187 solution 题解
查看>>
nadejs进程管理小记
查看>>