软件开发工程师的进阶之路

服务器方面:
1、web服务器nginx和apache的对比分析
①nginx相对于apache的优点:
轻量级,同样起web 服务,比apache 占用更少的内存及资源 ,抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能,高度模块化的设计,编写模块相对简单。
apache相对于nginx 的优点:a.rewrite ,比nginx 的rewrite 强大;b.动态页面,模块超多,基本想到的都可以找到;c.少bug ,nginx 的bug 相对较多;d.超稳定。
一般来说,需要性能的web 服务,用nginx 。如果不需要性能只求稳定,那就apache.
②作为 web 服务器:相比 apache,nginx 使用更少的资源,支持更多的并发连接,体现更高的效率。nginx采用c进行编写, 不论是系统资源开销还是cpu使用效率都比 perlbal 要好很多。
③nginx 配置简洁,apache 复杂。nginx 静态处理性能比 apache 高 3倍以上,apache 对 php 支持比较简单,nginx 需要配合其他后端用。apache 的组件比 nginx 多,现在 nginx 才是web 服务器的首选。
④最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程。
⑤nginx处理静态文件好,耗费内存少。但无疑apache仍然是目前的主流,有很多丰富的特性。所以还需要搭配着来。当然如果能确定nginx就适合需求,那么使用nginx会是更经济的方式。
⑥nginx处理动态请求是鸡肋,一般动态请求要apache去做,nginx只适合静态和反向。
⑦nginx优于apache的主要两点:a.nginx本身就是一个反向代理服务器 b.nginx支持7层负载均衡;其他的当然,nginx可能会比 apache支持更高的并发。
数据库方面:
1、数据库优化:
①方法:mysql可以建分表,读写分离,建索引,一般经常更新的字段不适合建索引,建索引会降低数据非查询操作的效率。主键是一种特殊的索引。
②导致索引失效的情况:
a、如果条件中有or,即使其中有条件带索引也不会使用到。
b、对于多列索引,不是使用的第一部分,则不会使用索引。
c、like查询是以%开头,而不是以%结尾的。
d、如果索引列类型是字符串,一定要在条件中将数据使用引号引用起来,否则不使用索引。
e、如果mysql估计使用全表扫描要比使用索引快,则不使用索引。
2、mysql引擎的种类和区别
①种类:myisam、innodb、memory、merge、archive、blackhole、csv、federate、merge、ndb集群引擎,第三方引擎:oltp类引擎、面向列的存储引擎、社区存储引擎。
②区别:
a、myisam是mysql5.1及之前的默认存储引擎。myisam不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求。myisam表还支持3中不同的存储格式:
1 静态表
2 动态表
3 压缩表
b、innodb存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起myisam存储引擎,innodb写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。 innodb存储方式为两种:1 使用共享表空间存储 2 使用多表空间
c、memory存储引擎使用存在内存中的内容来创建表。每个memory表只实际对应一个磁盘文件。memory类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用hash索引。但是一旦服务关闭,表中的数据就会丢失掉。
d、merge存储引擎是一组myisam表的组合,这些myisam表必须结构完全相同。merge表本身没有数据,对merge类型的表进行查询、更新、删除的操作,就是对内部的myisam表进行的。
3、数据库事务
(1)四个特性:acid,原子性,一致性,隔离性,持久性。
(2)四个隔离级别:
read uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(dirty read)。
read committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是mysql默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(nonrepeatable read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
repeatable read(可重读)
这是mysql的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (phantom read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。innodb和falcon存储引擎通过多版本并发控制(mvcc,multiversion concurrency control)机制解决了该问题。
serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如:
i. 脏读(drity read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个rollback了操作,则后一个事务所读取的数据就会是不正确的。
ii. 不可重复读(non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
iii. 幻读(phantom read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
(3)一致性处理:
a、开启事务。b、申请写权限,也就是给对象(表或记录)加锁。c、假如失败,则结束事务,过一会重试。d、假如成功,也就是给对象加锁成功,防止其他用户再用同样的方式打开。e、进行编辑操作。f、写入所进行的编辑结果。g、假如写入成功,则提交事务,完成操作。 h、假如写入失败,则回滚事务,取消提交。i、(g、h)两步操作已释放了锁定的对象,恢复到操作前的状态。
(4)基于事务的数据库引擎的选型:如果考虑到事务,推荐选用mysql innodb引擎;如果考虑速度,建议考虑mysql myisam引擎,并且需要在代码层面做比较复杂的处理,如通过多线程、异步、非阻塞等方式对数据库进行清理,同时需要信号量、栏栅、数据库标志位等工具保证数据一致性。
4、海量数据处理
(1)数据库扩展:
①纵向扩展:基于业务的高度隔离性和数据的安全性,对业务和数据进行合理的切分,进行主-备机分离,主-主同步,主-从同步(对于mysql数据库是单向异步同步机制),主-从热备等操作。
②横向扩展:对数据表进行横向切分,按一定的规则(hash取模分、user_id尾数、自定义算法等)对数据表进行横向切分。
关于数据库架构和扩展方面的文章请见:mysql在大型网站的应用架构演变。
(2)分布式数据方案:
①提供分库规则和路由规则(routerule简称rr),将上面的说明中提到的三中切分规则直接内嵌入本系统,具体的嵌入方式在接下来的内容中进行详细的说明和论述;
②引入集群(group)的概念,保证数据的高可用性;
③引入负载均衡策略(loadbalancepolicy简称lb);
④引入集群节点可用性探测机制,对单点机器的可用性进行定时的侦测,以保证lb策略的正确实施,以确保系统的高度稳定性;
⑤引入读/写分离,提高数据的查询速度。
具体描述请参见博文:mysql 海量数据的存储和访问解决方案。
(3)数据库切分策略介绍,请见博文:数据库sharding的基本思想和切分策略。
(4)随着数据量随着业务的发展不断增大,传统的关系型数据库rdb已经无法满足需要,这时需要引入新的海量数据处理解决方案:apache hbase。
框架方面:
spring原理(建议读一下框架核心源码)
①ioc(inversion of control): 控制反转,依赖注入
1)ioc:
概念:控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系
2)依赖ioc容器负责管理bean,有两种,一种是beanfactory,另一种是applicationcontext,但是applicationcontext继承与beanfactory。
核心:bean工厂;在spring中,bean工厂创建的各个实例称作bean
②aop(aspect-oriented programming): 面向方面编程
1)代理的两种方式:
静态代理:
 针对每个具体类分别编写代理类;
 针对一个接口编写一个代理类;
动态代理:
针对一个方面编写一个invocationhandler,然后借用jdk反射包中的proxy类为各种接口动态生成相应的代理类
2) aop的主要原理:动态代理
实现:有两种:jdk proxy和cglib,spring规定对于有接口的类用jdk proxy,对于无接口和抽象类用cglib,虽然cglib均可以代理,但是cglib复杂,效率低。但是cglib有例外,就是代理的类中不能是final修饰的类或者类中有final方法。
3、spring、struts2、servlet对比
①servlet原理:tomcat 的容器等级中,context 容器是直接管理 servlet 在容器中的包装类 wrapper,所以 context 容器如何运行将直接影响 servlet 的工作方式。
a、servlet生命周期详解
servlet的生命周期可以分为四个阶段,即装载类及创建实例阶段、初始化阶段、服务阶段和实例销毁阶段。下面针对每个阶段的编程任务及注意事项进行详细的说明。
b、servlet创建过程
在默认情况下servlet实例是在第一个请求到来的时候创建,以后复用。一旦servlet实例被创建,web服务器会自动调用init(servletconfig config)方法来初始化该servlet。其中方法参数config中包含了servlet的配置信息,比如初始化参数,该对象由服务器创建。init方法在servlet生命周期中只执行一次,而且该方法执行在单线程的环境下,因此开发者不用考虑线程安全的问题。
c、服务
一旦servlet实例成功创建及初始化,该servlet实例就可以被服务器用来服务于客户端的请求并生成响应。在服务阶段web服务器会调用该实例的service(servletrequest request,servletresponse response)方法,request对象和response对象有服务器创建并传给servlet实例。request对象封装了客户端发往服务器端的信息,response对象封装了服务器发往客户端的信息。
为了提高效率,servlet规范要求一个servlet实例必须能够同时服务于多个客户端请求,即service()方法运行在多线程的环境下,servlet开发者必须保证该方法的线程安全性。
serlvet接口只定义了一个服务方法就是service,而httpservlet类实现了该方法并且要求调用下列的方法之一:
doget:处理get请求
dopost:处理post请求
当发出客户端请求的时候,调用service 方法并传递一个请求和响应对象。servlet首先判断该请求是get 操作还是post 操作。然后它调用下面的一个方法:doget 或 dopost。如果请求是get就调用doget方法,如果请求是post就调用dopost方法。
②对比:spring主要有ioc和aop,spring中ioc管理的bean为单例模式的,可以配置成原型模式。如果用spring管理struts2的bean,必须要设置成原型模式,因为struts2封装来了servlet,隔离了servlet的特性,action不同于spring,已经是原型模式了。

三星note8什么时候上市?三星note8最新消息:note8即将问世,三星note8概念设计图曝光!大号的Galaxy 8?
数字信号控制器提供实时控制功能
学生党有什么游戏蓝牙耳机推荐?百元起低延迟游戏蓝牙耳机推荐
NV020C语音芯片在坐姿提示器的应用方案
Proximities RFID系统的腕带提升游客体验度
软件开发工程师的进阶之路
华硕GT-AC2900路由器体验 更有针对性的游戏加速及专属的绚丽电竞风格
乐视网IPO造假,被查实将面临退市
比亚迪半导体携明星产品亮相Demo Day
OPPO正式公布“3+N+X”的科技跃迁战略
发动机研发与制造企业全柴动力发布2022第一季度报告
国外80后牛人DIY创意便携式3D打印机(图文)
2016腾讯WE大会:AR、VR改变未来学习方式
日光灯常见故障的维修
状态机该怎么监控
RS485接口芯片
知名展商再聚一堂,谱写科技盛事
美国实行霸权主义将限制华为在美国销售设备
美国高防云服务器的硬件防御和软件防御的区别是什么
关于蚂蚁金服副总裁胡喜对自主研发的一些思考