测试面经

测试相关面试收集

    • 测试全覆盖
  • 测试方法理论
    • 软件测试的基本流程
    • 如何保证软件的质量
    • 什么是测试用例
    • 设计测试用例需要考虑的角度
    • BUG提交规范
    • 配置和兼容性测试的区别是什么?
    • 如何辨别前端和后端缺陷?
    • 请说一下手动测试与自动化测试的优缺点
  • 测试实例
    • 测试工程师应具备什么素质和技能
    • 用过的测试工具以及适用场合
    • 输入三个整数、组成一个三角形、设计测试用例
    • 在一个界面完成删除操作,界面上没有数据显示,是否代表删除成功
    • 测试界面功能,增删改查四个操作会按照什么顺序执行
    • 测试人员做到很牛的程度,那么他是什么
    • 安卓游戏开发测试
    • 评判代码质量用什么工具
    • 软件生命周期模型了解吗
  • 计算机基础
    • 数据库常见面试题
    • 索引为什么快
    • SQL常考
    • MVC框架模式
    • MVVM
    • 框架模式和设计模式的区别
    • CAP原理
    • ACID,范式
    • OpenCV
    • NoSQL
    • 互斥锁基本原理:

测试全覆盖

测试方法理论

软件测试的基本流程

需求分析阶段:阅读需求,理解需求,分析需求点,参与需求评审会议。

测试计划阶段:主要任务就是编写测试计划,参考软件需求规格说明书,项目总体计划,内容包括测试范围,进度安排,人力物力分配,整体测试策略的制定。

编写测试用例:适当的了解设计,搭建测试用例框架,根据需求和设计编写测试用例。

测试执行阶段:搭建环境准备数据,执行冒烟测试(预测试)然后进入正式测试(单元测试、集成测试、系统测试、回归测试、交叉测试、自由测试),bug管理直到测试结束。

输出测试报告:输出测试报告,确认是否可以上线。

如何保证软件的质量

1)需求分析
确保:
需求可行,客户了解需求含义,开发人员对需求无误解,按照需求实现的软件系统能满足客户需求。
2)规格定义
确保:
规格定义能完全符合、支持、覆盖所描述的系统需求
规格定义满足系统需求的性能、可维护性、灵活性的要求
3)设计
确保建立了设计的描述标准,并且按照设计标准进行设计
4)编码
确保建立了编码规范、文档格式标准,并且按照标准进行编码
5)测试
确保建立了测试计划,按照计划进行
确保测试计划覆盖了所有的系统规格定义和系统需求
6)维护
确保代码和文档同步更新,保持一致
确保建立了变更控制流程和版本控制流程
确保代码的更改符合编码规范和代码评审
<–
软件质量控制----对开发进程中软件产品(包括阶段性产品)的质量信息进行连续的收集和反馈。
一般方法有目标问题度量法,风险管理法,PDCA质量控制法

什么是测试用例

测试用列(Test Case)是为了实施测试而向被测试的系统提供的一组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素。

设计测试用例需要考虑的角度

测试用例需要考虑的四个基本要素是输入、输出、操作和测试环境;另外,测试用例需要考虑的是测试类型(功能、性能、安全……)

设计测试用例的方法
黑盒测试:

黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检测每个功能是否都能正常使用,在测试时,把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数锯而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。

“黑盒”法着眼于程序外部结构、不考虑内部逻辑结构、针对软件界面和软件功能进行测试。“黑盒”法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。实际上测试情况有无穷多个,因此不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测试。

常用的黑盒测试方法有:等价类划分法;边界值分析法;因果图法;场景法;正交实验设计法;判定表驱动分析法;错误推测法;功能图分析法。

白盒测试:

白盒测试也称为结构测试或逻辑驱动测试,是针对被测单元内部是如何进行工作的测试。它根据程序的控制结构设计测试用例,主要用于软件或程序验证。白盒测试法检查程序内部逻辑结构,对所有的逻辑路径进行测试,是一种穷举路径的测试方法,但即使每条路径都测试过了,但仍然有可能存在错误。因为:穷举路径测试无法检查出程序本身是否违反了设计规范,即程序是否是一个错误的程序;穷举路径测试不可能检查出程序因为遗漏路径而出错;穷举路径测试发现不了一些与数据相关的错误。

白盒测试需要遵循的原则有:1. 保证一个模块中的所有独立路径至少被测试一次;2. 所有逻辑值均需要测试真(true)和假(false);两种情况;3. 检查程序的内部数据结构,保证其结构的有效性;4. 在上下边界及可操作范围内运行所有循环。

常用白盒测试方法:

静态测试:不用运行程序的测试,包括代码检查、静态结构分析、代码质量度量、文档测试等等,它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具(Fxcop)自动进行。

动态测试:需要执行代码,通过运行程序找到问题,包括功能确认与接口测试、覆盖率分析、性能分析、内存分析等。

白盒测试中的逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。六种覆盖标准发现错误的能力呈由弱到强的变化:

1.语句覆盖每条语句至少执行一次。

2.判定覆盖每个判定的每个分支至少执行一次。

3.条件覆盖每个判定的每个条件应取到各种可能的值。

4.判定/条件覆盖同时满足判定覆盖条件覆盖。

5.条件组合覆盖每个判定中各条件的每一种组合至少出现一次。

6.路径覆盖使程序中每一条可能的路径至少执行一次。

BUG提交规范

【所属功能】bug出现的功能模块,比如个人中心。

【主题】一句话描述问题产生的模块、现象、错误现象及正确结果。比如个人中心上传头像照片不成功。

【复现率】bug重现的概率,可以用百分比形容,也可以用always、sometimes。

【平台】Android、iOS、H5、Web、PC

【问题类型】界面/功能/性能/兼容/安全/体验

【严重级别】可以用P0、P1、P2形容,也可以用高、中、低或者是严重、普通、低级。

【复现环境】DEV、TEST、LIVE

【测试机型】iPhone 6、Google Pixel

【系统版本】9.1.1

【测试版本】给出发现bug的版本号、构建号、tag即可

【研发分工】前端、后端

【前提条件】

【复现步骤】

1、XXX

2、XXXXX

【预期结果】预期的正确结果

【实际现象】实际看到的错误的现象

【其他补充】可以提供附件文档、日志、截图等一切可以协助开发分析问题的信息

配置和兼容性测试的区别是什么?

配置测试的目的是保证软件在其相关的硬件上能够正常运行,而兼容性测试主要是测试软件能否与不同的软件正确协作。

如何辨别前端和后端缺陷?

通常可以利用抓包工具来进行分析。可以从三个方面进行分析:请求接口,传参,响应。

  1. 请求接口url是否正确

如果请求的接口url错误,为前端的bug

  1. 传参是否正确

如果传参不正确,为前端的bug

  1. 请求接口url和传参都正确,查看响应是否正确

如果响应内容不正确,为后端bug

  1. 也可以在浏览器控制台输入js代码调试进行分析

如果定位为后端的bug,可以进一步通过以下方法精确定位是哪里出bug

  1. 查看报错日志,通过日志分析问题点

  2. 查看数据库确认数据的正确性

  3. 查看缓存是否正确

请说一下手动测试与自动化测试的优缺点

手工测试缺点:
1、重复的手工回归测试,代价昂贵、容易出错。

2、依赖于软件测试人员的能力。

手工测试优点:

1、测试人员具有经验和对错误的猜测能力。

2、测试人员具有审美能力和心理体验。

3、测试人员具有是非判断和逻辑推理能力。

自动化测试的优点:

1、对程序的回归测试更方便。这可能是自动化测试最主要的任务,特别是在程序修改比较频繁时,效果是非常明显的。由于回归测试的动作和用例是完全设计好的,测试期望的结果也是完全可以预料的,将回归测试自动运行,可以极大提高测试效率,缩短回归测试时间。

2、可以运行更多更繁琐的测试。自动化的一个明显的好处是可以在较少的时间内运行更多的测试。

3、可以执行一些手工测试困难或不可能进行的测试。比如,对于大量用户的测试,不可能同时让足够多的测试人员同时进行测试,但是却可以通过自动化测试模拟同时有许多用户,从而达到测试的目的。

4、更好地利用资源。将繁琐的任务自动化,可以提高准确性和测试人员的积极性,将测试技术人员解脱出来投入更多精力设计更好的测试用例。有些测试不适合于自动测试,仅适合于手工测试,将可自动测试的测试自动化后,可以让测试人员专注于手工测试部分,提高手工测试的效率。

5、测试具有一致性和可重复性。由于测试是自动执行的,每次测试的结果和执行的内容的一致性是可以得到保障的,从而达到测试的可重复的效果。

6、测试的复用性。由于自动测试通常采用脚本技术,这样就有可能只需要做少量的甚至不做修改,实现在不同的测试过程中使用相同的用例。

7、增加软件信任度。由于测试是自动执行的,所以不存在执行过程中的疏忽和错误,完全取决于测试的设计质量。一旦软件通过了强有力的自动测试后,软件的信任度自然会增加。

自动化测试的缺点:

1、不能取代手工测试

2、手工测试比自动测试发现的缺陷更多

3、对测试质量的依赖性极大

4、测试自动化不能提高有效性

5、测试自动化可能会制约软件开发。由于自动测试比手动测试更脆弱,所以维护会受到限制,从而制约软件的开发。

6、工具本身并无想像力

测试实例

测试工程师应具备什么素质和技能

需要的知识:
• 软件测试基础理论知识,如黑盒测试、白盒测试等;

• 编程语言基础,如C/C++、java、python等;

• 自动化测试工具,如Selenium、Appium、Robotium等;

• 计算机基础知识,如数据库、Linux、计算机网络等;

• 测试框架,如JUnit等。

需要具备的能力:

• 业务分析能力,分析整体业务流程、分析被测业务数据、分析被测系统架构、分析被测业务模块、分析测试所需资源、分析测试完成目标;

• 缺陷洞察能力,一般缺陷的发现能力、隐性问题的发现能力、发现连带问题的能力、发现问题隐患的能力、尽早发现问题的能力、发现问题根源的能力;

• 团队协作能力,合理进行人员分工、协助组员解决问题、配合完成测试任务、配合开发重现缺陷、督促项目整体进度、出现问题勇于承担;

• 专业技术能力,掌握测试基础知识、掌握计算机知识、熟练运用测试工具;

• 逻辑思考能力,判断逻辑的正确性、对可行性逻辑分析、站在客观角度思考;

• 问题解决能力,技术上的问题、工作中的问题、沟通问题;

• 沟通表达能力,和技术人员、产品人员、上下级的沟通;

• 宏观把控能力,有效控制测试时间、有效控制测试成本、有效制定测试计划、有效进行风险评估、有效控制测试方向。

用过的测试工具以及适用场合

常见自动化测试工具
Spoon
可用于 android 不同机型设备自动化测试,能将应用 apk 和测试 apk 运行在不同机器上并生成相应测试报告。
项目地址:https://github.com/square/spoon

Tencent APT
APT 是腾讯开源的一个 Android 平台高效性能测试组件,提供丰富实用的功能,适用于开发自测、定位性能瓶颈;测试人员完成性能基准测试、竞品对比测试
项目地址:https://github.com/stormzhang/APT

Emmagee
网易开源的性能测试工具,包括 CPU、内存、网络流量、启动时间、电池状态等
项目地址:https://github.com/NetEase/Emmagee

Android py-uiautomator
py-uiautomator 是一个对 Android uiautomator 用 python 进行封装的测试框架.
项目地址:https://github.com/xiaocong/uiautomator

Augmented Traffic Control
模拟网络状况,包括带宽、时延抖动、丢包率、错包率、包重排率
项目地址:https://github.com/facebook/augmented-traffic-control

stetho
强大的 Android Debug 工具。支持网络请求监控以及数据库查看,可以和 Chrome DevTools 结合或者命令行模式。
项目地址:https://github.com/facebook/stetho

输入三个整数、组成一个三角形、设计测试用例

在一个界面完成删除操作,界面上没有数据显示,是否代表删除成功

不一定代表删除成功,应查看数据库核查数据情况是否完成删除操作

测试界面功能,增删改查四个操作会按照什么顺序执行

先测试查询功能

测试人员做到很牛的程度,那么他是什么

1、管理能力。包括沟通交流,协调,人际关系等等,处理事情的快速,效率。2、掌握Linux系统。如果觉得windows掌握的差不多,多去学习学习Linux系统,趋势,应用越来越多,补充一下可以增加就业机会。3、了解网络知识。现在的软件产品,不论是商用软件还是其他领域的软件都设计到网络应用,再说,整个世界已经是个网络的世界,网络知识应用及各种协议必须清楚。
4、熟悉数据库。至少需要精通一种数据库产品及数据库语言技能,比如MSSQL,还有DB2, MySQL, Oracle, 有时间多去学习了解,软件项目产品离不开数据库。5、精通编程语言。至少要精通一门程序语言,比如现在主流的.NET 平台的C#等,J2EE平台的java开放语言各种架构,可以类比的去学习,有益无害。

1.学习java或python基本语法,如果你想要做中高级的测试,语言是必须要学的了。
2. python的一些第三方库需要了解一下,比如requests、appium-python-client,自带的库unittest等,不需要非常了解,但是需要你会用。
3. 学习python的另一个测试框架pytest,知道怎样用pytest和unittest进行测试,了解它们的不同。
4. 接口自动化测试目前已经是测试工程师的标配,所以你还需要使用requests和pytest结合写一个自动化测试框架,当然关键的是你重点需要理解如何设计。
5. 学习appium或selenium基于UI的自动化测试工具,虽然投入产出低,但是这个也已经是测试工程师的标配了。
6. PageObject模式的自动化测试框架,独立完成整个框架的开发,并能在项目中用起来。
7.学python或java的高级一点的语法。如装饰器,反射。设计自动化过程中又可以更加丰富。
8.jenkins的Pipeline的好处不用多说,它的使用也是测试工程师的标配。
9.git命令,不需要太复杂的命令,常用的命令使用需要会。
10.上面讲的这些好像是全栈测试才干的活啊?哈哈,你学会了你就是全栈。11.Linux常见命令要会。

安卓游戏开发测试

可以看看

评判代码质量用什么工具

代码质量批判工具

软件生命周期模型了解吗

软件生命周期&模型

计算机基础

数据库常见面试题

在这

索引为什么快

深入理解MySQL索引

SQL常考

MVC框架模式

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用于组织代码用一种业务逻辑和数据显示分离的方法,这个方法的假设前提是如果业务逻辑被聚集到一个部件里面,而且界面和用户围绕数据的交互能被改进和个性化定制而不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
MVC是一个框架模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。最典型的MVC就是JSP + servlet + javabean的模式。

  Model是指要处理的业务逻辑和数据操作,它接收视图请求的数据并返回最终的处理结果;View视图主要是指的跟用户打交道并且显示给用户看的,用户看到并与之交互的界面;Controller看成是Model和View的桥梁,枢纽,响应请求,处理跳转,使模型和视图保持一致。

特点

优点

耦合性低

视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。

模型是自包含的,并且与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。如果把数据库从MySQL移植到Oracle,或者改变基于RDBMS数据源到LDAP,只需改变模型即可。一旦正确的实现了模型,不管数据来自数据库或是LDAP服务器,视图将会正确的显示它们。由于运用MVC的应用程序的三个部件是相互独立,改变其中一个不会影响其它两个,所以依据这种设计思想能构造良好的松耦合的构件。

重用性高

随着技术的不断进步,需要用越来越多的方式来访问应用程序。MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。例如,很多数据可能用HTML来表示,但是也有可能用WAP来表示,而这些表示所需要的命令是改变视图层的实现方式,而控制层和模型层无需做任何改变。由于已经将数据和业务规则从表示层分开,所以可以最大化的重用代码了。模型也有状态管理和数据持久性处理的功能,例如,基于会话的购物车和电子商务过程也能被Flash网站或者无线联网的应用程序所重用。

生命周期成本低

MVC使开发和维护用户接口的技术含量降低。

部署快

使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。

可维护性高

分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。

有利软件工程化管理

由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。控制器也提供了一个好处,就是可以使用控制器来联接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提供强有力的手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择模型进行处理,然后选择视图将处理结果显示给用户。

缺点
没有明确的定义

完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。同时由于模型和视图要严格的分离,这样也给调试应用程序带来了一定的困难。每个构件在使用之前都需要经过彻底的测试。

不适合小型,中等规模的应用程序

花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。

增加系统结构和实现的复杂性

对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。

视图与控制器间的过于紧密的连接

视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。

视图对模型数据的低效率访问

依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。

一般高级的界面工具或构造器不支持模式

改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,会造成MVC使用的困难。

MVVM

MVVM框架与MVC框架的主要区别有两点:
1、实现数据与视图的分离
2、通过数据来驱动视图,开发者只需要关心数据变化,DOM操作被封装了。

可以看到MVVM分别指View,Model,View-Model,View通过View-Model的DOM Listeners将事件绑定到Model上,而Model则通过Data Bindings来管理View中的数据,View-Model从中起到一个连接桥的作用。
MVVM的实现原理:
MVVM的实现主要是三个核心点:
响应式:vue如何监听data的属性变化
模板解析:vue的模板是如何被解析的
渲染:vue模板是如何被渲染成HTML的

框架模式和设计模式的区别

有很多程序员往往把框架模式和设计模式混淆,认为MVC是一种设计模式。实际上它们完全是不同的概念。

框架、设计模式这两个概念总容易被混淆,其实它们之间还是有区别的。框架通常是代码重用,而设计模式是设计重用,架构则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。在软件生产中有三种级别的重用:内部重用,即在同一应用中能公共使用的抽象块;代码重用,即将通用模块组合成库或工具集,以便在多个应用和领域都能使用;应用框架的重用,即为专用领域提供通用的或现成的基础结构,以获得最高级别的重用性。

框架与设计模式虽然相似,但却有着根本的不同。设计模式是对在某种环境中反复出现的问题以及解决该问题的方案的描述,它比框架更抽象;框架可以用代码表示,也能直接执行或复用,而对模式而言只有实例才能用代码表示;设计模式是比框架更小的元素,一个框架中往往含有一个或多个设计模式,框架总是针对某一特定应用领域,但同一模式却可适用于各种应用。可以说,框架是软件,而设计模式是软件的知识。

框架模式有哪些?MVC、MTV、MVP、CBD、ORM等等;

框架有哪些?C++语言的QT、MFC、gtk,Java语言的SSH 、SSI,php语言的 smarty(MVC模式),python语言的django(MTV模式)等等

设计模式有哪些?工厂模式、适配器模式、策略模式等等

简而言之:设计模式是大智慧,用来对软件设计进行分工;框架模式是小技巧,对具体问题提出解决方案,以提高代码复用率,降低耦合度。

CAP原理

1.在分布式系统中,有一个基本原则叫做CAP,consistence,一致性,availability,可用性,partition
tolerance分区容错性。
2. 一致性,在这里指的是分布式系统的各个副本的值要保持同步,这里强的是空间上的一致,注意和数据库中ACID中的一致性相区分,那个一致性指的是事务执行前后的逻辑一致性,比如你转1000块给别人,不能你的账户少了1000块,对方的账户却没有多1000块。
3.可用性,指的是当client发出数据读写请求时,要在足够短的时间内做出响应。
4.分区容错性指的是,在不稳定和不可靠的网络环境下,节点可能出现失联或者荡机,网络可能出现分区子网,在这种情况下仍然能保证数据不出错。
5.所以,分区容错性是我们必须最终要保证的,但是一致性和可用性是一对矛盾的东西。所以在三者中,我们只能取两个。
为啥一致性和可用性是一对矛盾的东西呢?因为要实现一致性,在本质上都是进行副本之间的同步,而这个是需要花时间的,如果要保证强一致性,那么在同步的这一段时间中,是不可用的

ACID,范式

数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
ACID
所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。(执行单个逻辑功能的一组指令或操作称为事务)

范式

  1. 第一范式(1NF)-1NF的定义为:符合1NF的关系中的每个属性都不可再分。
  2. 第二范式(2NF)-2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖。
  3. 第三范式(3NF)-3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。

OpenCV

OpenCV
OpenCV概述

OpenCV是Intel开元计算机视觉库,它有一系列开源的C函数和少量C++类构成,实现了图像处理和计算机视觉很多通用的算法。

OpenCV特点:

1.拥有包括300多个C函数的跨平台的中、高层API;

2.跨平台:Windows/Linux;

3.Free:无论是对于商业还是非商业应用;

4.速度快;

5.使用方便。


CXCORE:包含数据结构、矩阵运算、数据变换、对象持久(Object Persistence)、内存管理、错误处理、动态连接、绘图、文本和基本的数学功能。

CV:包含图形处理、图像结构分析、运动描述和跟踪、模式识别和摄像机标定。

Machine Learning(ML):包含许多聚类,分类和数据分析函数。

HighGUI:包含图形用户界面和图像/视频的读/写。

CVCAM:摄像机接口,在OpenCV1.0以后的版本中被移除。

NoSQL

1.什么是NOSQL:
NoSQL(NoSQL=Not Only SQL):

意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。
2.为什么需要NOSQL
随着互联网的高速崛起,网站的用户群的增加,访问量的上升,传统数据库上都开始出现了性能瓶颈,web程序不再仅仅专注在功能上,同时也在追求性能。所以NOSQL数据库应运而上,具体表现为对如下三高问题的解决:
High performance - 对数据库高并发读写的需求 web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态
化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。其实对于普通的BBS网站,往往也存在对高并发写请求的需求,例如网站的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此这是一个相当普遍的需求。
Huge Storage - 对海量数据的高效率存储和访问的需求 类似Facebook,twitter,Friendfeed这样的SNS网站,每天用户产生海量的用户动态,以Friendfeed为例,一个月就达到了2.5亿条用户动态,对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统,例如腾讯,盛大,动辄数以亿计的帐号,关
系数据库也很难应付。

High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求
在基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,为什么数据库不能通过不断的添加服务器节点来实现扩展呢?

互斥锁基本原理:

 互斥锁是一个二元变量,其状态为开锁(允许0)和上锁(禁止1),将某个共享资源与某个特定互斥锁在逻辑上绑定(要申请该资源必须先获取锁)。(1)访问公共资源前,必须申请该互斥锁,若处于开锁状态,则申请到锁对象,并立即占有该锁,以防止其他线程访问该资源;如果该互斥锁处于锁定状态,则阻塞当前线程。(2)只有锁定该互斥锁的进程才能释放该互斥锁,其他线程试图释放无效。

本文链接:https://my.lmcjl.com/post/2415.html

展开阅读全文

4 评论

留下您的评论.