消息队列原型及选型
什么是消息队列
消息队列是一种进程间通信或同一进程的不同线程间的通信方式
什么时候需要消息队列
1、异步处理:就是有些业务不需要立即处理,可以放入队列,有需要的时候再处理 2、数据同步:业务数据推送同步 3、重试补偿:记账失败重试 4、系统解耦:通讯上下行,终端异常监控、分布式时间中心 5、流量消峰:在访问量剧增的情况下,使用消息队列能够顶住访问压力,不会因为突发的超负荷请求而完全崩溃。 6、发布订阅:HSF(HOOPS Stream Format)的服务状态变化通知、分布式事件中心 7、数据流处理:日志服务,监控上报 8、分布式事务 9、RPC(远程过程调用)调用
消息队列的介绍
在比较常见的消息队列产品主要有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、RocketMQ等。
软件测试的分类
单元测试>集成测试>系统测试>验收测试
单元测试
对软件中最小可测试单元进行检查和验证 单元测试的原则: 1、尽可能保证哥哥测试用例是相互独立的 2、一般由代码的开发人员来做
集成测试
是在单元测试的基础上,测试软件单元组装成的模块、子系统或系统的过程中各部分 需要自顶向下,自底向上的测试,并且要高频测试
系统测试
是将经过集成测试的软件,作为计算机系统的一个部分,与系统中其他部分结合起来,在实际运行环境下对计算机系统进行的一系列严格有效地测试,以发现软件潜在的问题,保证系统的正常运行。 关注点:关注系统本身的使用 关注系统与其他相关系统间的连通 关注系统在不同使用压力下的表现 关注系统在真实使用环境下的表现
验收测试
也称交付测试。针对用户需求、业务流程的正式的测试,确定系统是否满足验收标准,由用户、客户或其他授权机构决定是否接受系统。 总结 单元测试:是各个阶段测试的基础,测试的对象是最小的可测试单元 集成测试:关注的是各个最小单元模块之间的接口,和子系统的集成 系统测试:把整个系统整装以后,置于真实的运行环境,进行全面的评估 验收测试:从用户的角度,对系统软件的认可验收
入栈与出栈顺序
栈中的数据只有一种方式出栈,即先进后出,所以出栈的可能数目跟入栈的可能排列数目是一致的。
例题
技术之瞳 阿里巴巴技术笔试心得习题2.65: 一个栈的入栈序列为ABCDEF,则不可能的出栈序列是(D) A、DEFCBA B、DCEFBA C、FEDCBA D、FECDBA E、ABCDEF F、ADCBFE
分析: 该题主要是考虑栈的核心思想是先进后出,并且需要注意入栈和出栈的顺序是未知的,例如你可以先入栈ABCD,然后出栈D,然后入栈E,出栈E,入栈F,出栈F,然后CBA依次出栈,也就是A选项的情况。 这里有一规律可记 任何出栈的元素后面出栈的元素必须满足以下三点: 1、在原序列中相对位置比它小的,必须是逆序; 2、在原序列中相对位置比它大的,顺序没有要求; 3、以上两点可以间插进行。
我们再看选项D的出栈顺序FECDBA,明显出栈元素F后面的元素C和D不满足上面规律1,所以选项D是错误的,其它答案都是满足的。
递归问题
设有一个递归算法如下 int fact(intn)//n 大于等于0 if (n<=0)return 1; else return n* fact(n–); 则计算fact (n)需要调用该函数的次数为()次。 应该为n+1次
public class Test {
public static void main(String arg[]) {
System.out.println(fact(5,0));
}
public static int fact(int n,int num) {
num ++;
if (n <= 0) {
System.out.println(num);
return 1;
} else {
return n * fact(n - 1,num);
}
}
}
注意之前学的一个套一个,最后才乘所以返回值是120
进程的基本状态
进程有三种基本状态: (1)就绪状态:进程已获得除CPU外所有必要资源,只等待CPU时的状态。一个系统会将多个处于就绪状态的进程排成一个就绪队列 (2)执行状态:进程已获CPU,正在执行。 (3)阻塞状态:正在执行的进程由于某种原因而暂时无法继续执行,便放弃处理机。而处于暂停状态,即进程执行受阻。 在一些系统中还有一种很重要的状态是:挂起状态 在实际系统中,为了管理需要,存在创建状态和终止状态。
SQL中查找
查找有abc的字符,并且计算个数用 SELECT SUM(salary) FROM payslip WHERE name LIKE “abc%”
CAN总线
CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。 具有实时性强、传输距离较远、抗电磁干扰能力强、成本低等优点。 可以点对点,一对多及广播集中方式传送和接受数据。 CAN是目前为止唯一有国际标准的现场总线 CAN为多主工作方式,而且不分主从 CAN的直接通信距离可达10Km
软件首要满足的条件
功能要求
Linux系统上用来编辑文件内容的命令
vim又叫vi nano 这两种是自带的编辑命令 使用nano编辑文件: nano 文件名 点击Ctrl-X可以退出编辑,选择是否保存对文件的改动。 使用vi编辑文件: vi 文件名 vi有两个模式:一个是编辑模式一个是命令模式。点击i可以从命令模式进入编辑模式,在点击esc键可以重新进入命令模式。我们一般进入编辑模式,来进行添加,修改,删除。但是当我们删除和修改的内容过多的时候,我们使用命令行模式,进行修改,这样方便,快捷,而命令行中,最常用到的是x,dd,u,p这四个命令:x:删除当前字符;dd:删除当前行;u:恢复前一步操作;p:复制之前删除的行。
HTTP
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。 HTTP使用SSL(安全套接字)用来保证信息安全 SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。 SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。
进程通信
进程通信是指在进程间传输数据(交换信息)。 根据交换信息量的多少和效率的高低,进程通信分为如下低级通信和高级通信。 提高信号通信的效率,传递大量数据,减轻程序编制的复杂度。 提供三种方式: 1.共享内存模式 2.消息传递模式 3.共享文件模式 基本进程通讯方法 共享存储 消息传递 管道通信
链表
链表的特点
插入删除不需要移动元素 所需空间与线性表长度成正比 不必事先估计存储空间
可随机访问任一个元素(这个是顺序表的特点)
Python中的列表
d1=[3,6,4];
d2=d1;
d2[2]=8;
sum=d1+d2;
sum=[3,6,4,3,6,8];
python中的+是直接在后面续上代码
HTTP返回状态码
1xx 处理信息,服务器收到请求,需要请求者继续执行操作; 2xx 请求成功,操作被成功接收并处理; 3xx 重定向,需要进一步的操作以完成请求; 4xx 客户端错误,请求包含语法错误或无法完成请求; 5xx 服务器错误,服务器在处理请求的过程中发生了错误; 200 - OK 正常; 对GET和POST请求的应答文档跟在后面。 201 - Created 已创建; 服务器已经创建了文档,Location头给出了它的URL。 301 - Moved Permanently 永久移动; 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。 307 - Temporary Redirect 临时跳转; 许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因,HTTP许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。(HTTP 1.1新) 403 - Forbidden 禁止访问; 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。禁止访问:IIS资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。禁止访问:IIS 定义了许多不同的 403 错误,它们指明更为具体的错误原因:
可读可写
chmod 命令来对目录设置权限: chmod 可以用3个数字来表达 用户,用户组,其他用户: 如 chmod 777/test (数字的第一个7代表的是用户权限 数字的第二个7代表的是用户组的权限 数字的第三个7代表的是其他用户的权限) 而数字7是特定用户的读,写, 执行权限: [读取–用数字4表示] [写–用数字2表示] [执行–用数字1表示] 用这些数字相加得到权限: 如你想设置/test目录的权限为: 对用户可读可写, 4(读取)+2(写入)=6 对用户组可读可执行, 4(读取)+1(执行)=5 对其他用户仅仅可读; 4(读取) 这样就可以用命令:chmod 654 /test 来设置权限~ !!!提示如果是设置目录,没有执行权限是不可以读取目录的。
IP地址
IP地址表示方法不同:
一个A类IP地址是指, 在IP地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码。如果用二进制表示IP地址的话,A类IP地址就由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”。A类IP地址中网络的标识长度为8位,主机标识的长度为24位。
一个B类IP地址是指,在IP地址的四段号码中,前两段号码为网络号码。如果用二进制表示IP地址的话,B类IP地址就由2字节的网络地址和2字节主机地址组成,网络地址的最高位必须是“10”。B类IP地址中网络的标识长度为16位,主机标识的长度为16位。
一个C类IP地址是指,在IP地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。如果用二进制表示IP地址的话,C类IP地址就由3字节的网络地址和1字节主机地址组成,网络地址的最高位必须是“110”。C类IP地址中网络的标识长度为24位,主机标识的长度为8位。
一些知识
IP协议利用服务类型,控制数据传输的时延 HTTP的长链接不能一直保存 交换机可以提供更大的带宽和数据转发功能
继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。 子类变化,而父类不变化
线程和进程
linux系统中调度的基本单位是线程 线程的粒度小于进程, 进程是最小的资源分配单位。 同一进程中的各个线程拥有共同的共享地址空间。 线程是独立调度和分派的基本单位。它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程并行执行不同的任务。 线程与进程的主要区别可以归纳为: 1、地址空间和其它资源: 进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。 2、通信: 进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信—需要进程同步和互斥手段的辅助,以保证数据的一致性。 3、调度和切换: 线程上下文切换比进程上下文切换要快得多。 4、在多线程OS中,线程不是一个可执行的实体
Linux下查看内存使用率
1、Top命令 top命令可以看到总体的系统运行状态和cpu的使用率 。 2、free命令 free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。在Linux系统监控的工具中,free命令是最经常使用的命令之一。 3、df命令 查看磁盘使用率
软件验收合格的准则
1、软件需求分析说明书中定义的所有功能已全部实现,性能指标全部达到要求。 2、所有测试项没有残余的一级二级三级的错误。 3、立项审批表、需求分析文档、设计文档和编码实现一致。 4、验收测试工件齐全(测试计划,测试用例,测试日志,测试通知单,测试分析报告)
排序算法的时间复杂度
1、冒泡排序 时间复杂度O(n2)O(n2)空间复杂度O(1)O(1) 稳定性 稳定 复杂性 简单 2、归并排序 时间复杂度O(nlog2n)O(nlog2n)空间复杂度O(n)O(n) 稳定性 稳定 复杂性 较复杂 3、堆排序 时间复杂度O(nlog2n)O(nlog2n)空间复杂度O(1)O(1) 稳定性 不稳定 复杂性 较复杂 4、快速排序 时间复杂度O(nlog2n)O(nlog2n)空间复杂度O(nlog2n)O(nlog2n) 稳定性 不稳定 复杂性 较复杂
关系数据库
关系数据库,是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据,同时也是一个被组织成一组拥有正式描述性的表格,该形式的表格作用的实质是装载着数据项的特殊收集体,这些表格中的数据能以许多不同的方式被存取或重新召集而不需要重新组织数据库表格。 数据库系统必须维护事务的以下特性(简称ACID): 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability)
Python中可迭代对象
可作用于for循环的对象叫可迭代对象 故有字符串、列表、元祖、文件
LIN帧的分类
LIN总线是目前常见的一种A类网络协议。LIN的全称为Local Interconnect Network。LIN主要功能是为CAN总线网络提供辅助功能,应用场合有智能传感节点、自动车窗节点等。 LIN帧按照帧类型来分类可以分为普通帧、事件触发帧、零星帧、诊断帧、用户自定义帧和保留帧。
正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。 例如 runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。
runoob,可以匹配 runob、runoob、runoooooob 等, 号代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)。
python中支持的数据类型
Python3 中有六个标准的数据类型: Number(数字) String(字符串) List(列表) Tuple(元组) Set(集合) Dictionary(字典) Python3 的六个标准数据类型中: 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组); 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
Python 中的__new__和__init__的区别
同 二者均是Python面向对象语言中的函数,__new__比较少用,__init__则用的比较多。 异 __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是个静态方法。 __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,通常用在初始化一个类实例的时候。是一个实例方法。 也就是: __new__先被调用,__init__后被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。
故_new_是一个静态方法,而_init_是一个实例方法
|