0%

HTTP1.0和HTTP1.1的主要区别

区别一:短连接和长连接

一、HTTP1.0使用短连接

http1.0使用的是短连接,就是每进行一次http请求都要重新建立一次tcp连接。

短连接影响性能的最主要的两个原因

a. 每次都需要握手/挥手/慢启动

tcp连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大

b. tcp连接数过多而被阻塞

一般PC端浏览器会针对单个域名的server同时建立6~8个连接,手机端的连接数则一般控制在4~6个,因此,在短连接的场景下,频繁的建立TCP连接可能会因为无法创建新的连接而被阻塞住。

阅读全文 »

单机Redis的瓶颈

  • 容量瓶颈( 单台Redis提供的容量有限 )
  • QPS瓶颈( 单台Redis能提供的有限 )
  • 机械故障( 单台redis无法保证高可用 )

主从复制的约定

  • 一个master可以有多个slave
  • 一个slave只能用一个master
  • 数据流向是单向的,master到slave (所以要求一般slave是read-only的,不然就无法保证主从一致性了)
阅读全文 »

redis的数据结构以及使用场景分析

1. string

a. 底层结构

string的数据结构存储的是key-value类型, value不仅可以是string,也可以是数字。

redis中的String是可以修改的,称为动态字符串(SDS),其实就是维护了一个预分配的字节数组,如下

1
2
3
4
5
6
struct SDS{
T capacity; //数组容量
T len; //实际长度
byte flages; //标志位,低三位表示类型
byte[] content; //数组内容
}
阅读全文 »

  • 讲讲mysql有几个隔离级别?
  • mysql的默认隔离级别是哪个?
  • 你们项目中选了哪个隔离级别,为什么?

这上面三个问题是面美团的时候被问到的。。前两个还好。。第三个让我有点摸不着头脑。。查了些资料之后就记录一下这个问题吧

阅读全文 »

Q1: 进程间的通信方式

1. 匿名管道

管道是通过调用 pipe 函数创建的,fd[0] 用于读,fd[1] 用于写

1
int pipe(int fd[2]);

存在形式:
无名管道:只存在于内存中的文件

使用限制:

  • 只支持半双工(单向交替传输)
  • 只能在父子进程或兄弟进程中使用
    在这里插入图片描述
阅读全文 »

一、消息队列能用来干什么?

异步,解耦,削峰。

1. 异步:

比如在电商的业务场景下,下单成功后要调用短信模块,邮件模块提醒买家下单成功的信息,而下单和发短信,发邮件使用消息队列来异步执行可以提高响应速度,增强用户体验。

2. 解耦

如果不用消息队列的话,对不同功能模块的调用是要写死在业务代码里的,也就是调用方在调用逻辑还耦合了”调用哪一个服务”这一层逻辑在里面逻辑,日后增加功能或删掉功能的时候,修改业务代码成本会比较大… 而使用消息队列的topic在中间进行一层解耦就能减轻这种问题,发送方只负责发送消息,消费方只负责消费消息,服务的类型被抽象成topic,由消息队列来管理。

3. 削峰

如果上游请求规模超出了下游服务的负载的话,使用消息队列可以起到一个缓冲的作用,即将请求先存起来然后让下游服务尽自己所能的去消费,保护了下游服务系统。

阅读全文 »

JMM

java内存模型(Java Memory Model,JMM)是java虚拟机规范定义的,用来屏蔽掉java程序在各种不同的硬件和操作系统对内存的访问的差异,这样就可以实现java程序在各种不同的平台上都能达到内存访问的一致性。为了实现了JVM的跨平台性,在向上提供了一系列的指令的同时,也提供了一些编程规则需要理解和遵守,比如Happens-Before原则,as-if-serial原则,主内存工作内存的概念等等。

阅读全文 »

什么是AQS

我们常用的j.u.c包里,提供了许多强大的同步工具,例如ReentrantLock,Semphore,ReentrantReadWriteLock等,但当这些工具难以满足某个场景的需求时,我们就需要定制化我们自己的同步器,这时,我们可能会想,如果能有一个像Servlet这种只要重写某几个方法就能完成一把定制锁的实现的就好了!! 没错,AQS就是提供了这样一种功能,它如果要实现一个同步器的大部分通用功能都帮我们实现好了,然后提供出抽象函数供我们重写来定制化自己想要的同步器。 实际上,上面所说的ReentrantLock,Semphore,ReentrantReadWriteLock等juc包中同步工具的实现,也都是在AQS的辅助下进行的“二次开发”。 例如在ReentrantLock继承了Lock接口,然后利用定制化了的继承了AQS的类,来去实现Lock接口。

阅读全文 »