1. 我现在和你进行视频通话,这个是怎么做的?
视频通话通常基于实时通信技术(RTC),如WebRTC。它利用现代浏览器的API来实现视频、音频和数据的直接P2P(点对点)通信,或通过服务器中转。视频通话涉及信号的协商、媒体流的编码、传输和解码等多个步骤。
2. 推流会怎么推呢?
推流是将音视频数据实时传输到服务器或接收端的过程。在直播或视频会议中,推流通常使用RTMP(Real Time Messaging Protocol)、HLS(HTTP Live Streaming)或WebSocket等协议。推流前,音视频数据会被编码压缩,然后通过选定的协议发送到服务器,服务器再分发给其他客户端。
3. 视频通话和你打开一个url网页有什么不同吗?
视频通话是实时交互的,涉及音视频数据的实时传输和处理,对延迟和带宽要求较高。而打开一个URL网页主要是从服务器获取HTML、CSS、JavaScript等资源,并在客户端渲染,不涉及实时音视频传输,对延迟的要求相对较低。
4. TCP是什么协议?RTC又是什么协议?
TCP(Transmission Control Protocol):一种面向连接的、可靠的、基于字节流的传输层通信协议。它提供全双工通信,即数据可以在两个方向上同时传输。TCP通过确认应答、数据重传、滑动窗口等机制来保证数据的可靠传输。
RTC(Real-Time Communication):不是一种具体的协议,而是一种技术的总称,用于实现实时音视频通信。RTC可以基于多种协议和技术实现,如WebRTC、RTMP等。
5. 为什么音视频用UDP协议传输呢?实时性体现在哪里?
音视频传输对实时性要求很高,而UDP(User Datagram Protocol)是一种无连接的、不可靠的传输层协议,它传输数据时不建立连接,也不保证数据的可靠传输,但具有较低的延迟和较高的传输效率,因此常用于音视频传输。实时性体现在数据的快速传输和较小的延迟上。
6. 你从网站上下载一个很大的,1个G的文件,这个文件途中有没有可能被损坏?
在TCP协议下,文件在传输过程中是有可能被损坏的,但由于TCP的可靠性保证机制(如确认应答、数据重传),即使数据在传输过程中损坏,TCP也会通过重传机制确保数据的完整性和正确性。因此,在TCP协议下下载的文件,理论上应该是完整的。
7. 需要对文件的完整性进行一个校验吗?为什么需要校验?TCP 不是可靠的吗?
虽然TCP协议本身具有可靠性保证,但在实际应用中,由于网络环境的复杂性,仍然可能存在一些不可预见的问题(如硬盘故障、内存错误等)导致文件损坏。因此,对文件的完整性进行校验是必要的。常见的校验方式有MD5、SHA-1等哈希算法。
8. 怎么对文件进行一个完整性的校验?
可以使用哈希算法(如MD5、SHA-1、SHA-256等)对文件进行校验。具体做法是,在文件传输前后,分别在发送端和接收端计算文件的哈希值,然后比较这两个哈希值是否一致。如果一致,说明文件在传输过程中没有被损坏;如果不一致,则说明文件可能已被损坏。
9. 为什么redis 查询会比数据库更快?
Redis 是一种基于内存的数据库,它将数据存储在内存中,因此访问速度非常快。相比之下,传统的关系型数据库(如MySQL)将数据存储在硬盘上,虽然硬盘的容量远大于内存,但访问速度却远低于内存。因此,Redis 的查询速度通常会比关系型数据库快很多。
10. redis 单线程模型为什么会比较快呢?
Redis 采用单线程模型,但这并不意味着它不能处理高并发。Redis 的单线程主要指的是它处理网络请求和命令执行是在一个主线程中完成的。这种设计简化了数据一致性和并发控制的问题,避免了多线程竞争和锁的开销。同时,Redis 的IO操作(如网络请求和磁盘写入)是异步的,不会阻塞主线程的执行。因此,Redis 能够在单线程下保持较高的性能。
11. 为什么要引入MQ呢?我直接发送给下游不行吗?
引入消息队列(MQ)主要有以下几个原因:
解耦:系统间的直接调用会增加耦合度,而MQ可以作为一个中间层,降低系统间的耦合度。
异步:MQ可以实现异步处理,提高系统的响应速度和处理能力。
流量削峰:在系统面临高并发请求时,MQ可以暂存请求,起到流量削峰的作用。
数据一致性:通过事务消息等机制,MQ可以保证数据的一致性。
12. 说一下volatile
volatile 是Java中的一个关键字,它用于修饰变量,确保变量的可见性和禁止指令重排序。当一个变量被声明为 volatile 后,它告诉编译器这个变量的值可能会被意外地改变,因此编译器在生成代码时不会对这个变量进行缓存优化。同时,它还会确保每次读取这个变量时都会直接从主内存中读取,而不是从线程的本地缓存中读取,从而保证了变量的可见性。
13. 什么是可见性?我不用volatile就是永远见不到了?如果我有一万个线程,那就是有一万个copy?
可见性 是指当一个线程修改了某个共享变量的值后,其他线程能够立即看到这个修改后的值。如果不使用 volatile 关键字,由于缓存一致性问题,其他线程可能无法立即看到修改后的值。但这并不意味着永远看不到,只是存在延迟。
对于“如果我有一万个线程,那就是有一万个copy?”的疑问,这种理解是不准确的。在Java中,共享变量通常存储在主内存中,而不是每个线程都有自己的copy。但是,由于缓存机制的存在,每个线程可能会有该变量的一个本地缓存副本。使用 volatile 可以确保当变量值被修改后,所有线程的本地缓存副本都会被更新为最新的值。
14. 你刚刚说的禁止指令重排序,指令为什么会重排序?为了优化什么对它进行重排序?
指令重排序是编译器和处理器为了优化程序性能而采取的一种策略。在不改变程序单线程语义的前提下,编译器和处理器可以重新安排指令的执行顺序,以提高程序的执行效率。但是,这种重排序可能会导致多线程程序出现不可预见的行为,特别是当涉及到共享变量时。
为了解决这个问题,Java内存模型(JMM)规定了在多线程环境下哪些指令不能重排序,并提供了 volatile、synchronized 等关键字来确保程序的正确执行顺序。volatile 关键字可以禁止指令重排序,确保在 volatile 变量之前的指令不会在其之后的指令之后执行,从而保证了变量的可见性和有序性。
(os:说实话问的不难..但是给我们的机会太少了😭,全是92的大军冲刺)