序言
现在在技术选型,尤其关注软件的能够提供的QPS,当然这也是必然的.所以整理下不同服务之间的应用级别
QPS
QPS(是每秒查询率) = 并发数 / 平均响应时间
例如:
- 如果一次性可以处理100个请求,每个请求耗时100毫秒,则qps = 1000
- 如果一次性可以处理50个请求,每个请求耗时200毫秒,则qps = 250
峰值QPS
公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS)
机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器
问:每天300w PV 的在单台机器上,这台机器需要多少QPS?
答:( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)
问:如果一台机器的QPS是58,需要几台机器来支持?
答:139 / 58 = 3
MQ服务
Kafka是高吞吐低延迟的高并发、高性能的消息中间件,在大数据领域有极为广泛的运用。配置良好的Kafka集群甚至可以做到每秒几十万、上百万的超高并发写入。
一般RabbitMQ的单机QPS在万级别之内,而Kafka的单机QPS可以维持在十万级别,甚至可以达到百万级。
很明显的看出kafka的性能远超rabbitmq。不过这也是理所当然的,毕竟2个消息队列实现的协议是不一样的,处理消息的场景也大有不同。rabbitmq适合处理一些数据严谨的消息,比如说支付消息,社交消息等不能丢失的数据。kafka是批量操作切不报证数据是否能完整的到达消费者端,所以适合一些大量的营销消息的场景。
NoSql数据库
redis单机的话能够提供5w左右的QPS,如果是服务器读写分离可以提供到10w. 关于redis-cluster 集群如果机器太多了会增加沟通交互的成本,所以集群的百万左右差不多可以了.Redis为内存型KV系统,处理的数据量要小于HBase与MongoDB
HBase基于列存储,提供<key, family:qualifier, timestamp>三项坐标方式定位数据,由于其qualifier的动态可扩展型(无需schema设计,可存储任意多的qualifier),特别适合存储稀疏表结构的数据(比如互联网网页类)。HBase不支持二级索引,读取数据方面只支持通过key或者key范围读取,或者全表扫描。
MongoDb在类SQL语句操作方面目前比HBase具备更多一些优势,有二级索引,支持相比于HBase更复杂的集合查找等。BSON的数据结构使得处理文档型数据更为直接。MongoDb也支持mapreduce,但由于HBase跟Hadoop的结合更为紧密,Mongo在数据分片等mapreduce必须的属性上不如HBase这么直接,需要额外处理。
HBase与Mongodb的读写性能正好相反,HBase写优于随机读,MongoDB似乎写性能不如读性能。hbase占用两台机器能完成的事情,mongodb要占用更多的机器,但是代价就是hbase记录下东西以后,只能事后通过全表检索或按照索引范围的方式进行整体分析,而不能对具体每个人的数据进行实时分析,更强调数据分析能力而不是实时数据查询能力
扩展性 | 表设计 | 负载均衡 | failover | 事务 | 适用数据量 | |
---|---|---|---|---|---|---|
RDBMS | 差 | 灵活性较弱 | 差 | 同步实现 | 支持 | 万级 |
HBase | 强 | 十亿级行,百万级列;动态列,每行列可不同。且引入列族和数据多版本概念。 | 强 | 各组件都支持HA | MVCC, Produce LOCK;行级事务 | 亿级 |
ORM
从 iBatis 到 MyBatis,不只是名称上的变化,MyBatis 提供了更为强大的功能,同时并没有损失其易用性,相反,在很多地方都借助于 JDK 的泛型和注解特性进行了简化.
在 iBatis 中,namespace 不是必需的,且它的存在没有实际的意义。在 MyBatis 中,namespace 终于派上用场了,它使得映射文件与接口绑定变得非常自然。MyBatis中一条sql结束后可以有“;”,而iBatis会报错,
时间复杂度
⑴ 找出算法中的基本语句;
算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。
⑵ 计算基本语句的执行次数的数量级;
只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。
⑶ 用大Ο记号表示算法的时间性能。
将基本语句执行次数的数量级放入大Ο记号中。
果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加。
用例
Temp=i; i=j; j=temp;
以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。注意:如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
sum=0; //(一次)
for(i=1;i<=n;i++) //(n+1次)
for(j=1;j<=n;j++) //(n2次)
sum++; //(n2次)
因为Θ(2n2+n+1)=n2(Θ即:去低阶项,去掉常数项,去掉高阶项的常参得到),所以T(n)= =O(n2);
a=0; //1
b=1; // 1
for (i=1;i<=n;i++) // n
{
s=a+b; // n-1
b=a; // n-1
a=s; // n-1
}
T(n)=2+n+3(n-1)=4n-1=O(n).
该算法程序的时间复杂度为 O(n)