测开常见的状态码
HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。它由 RFC2616 规范定义的 ,并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等规范扩展。
1xx(信息性状态码):表示请求已被接受,需要继续处理。
2xx(成功状态码):表示请求已成功被服务器接收、理解、接受。
3xx(重定向状态码):表示需要客户端采取进一步的操作才能完成请求。
4xx(客户端错误状态码):表示客户端发送的请求有错误。
5xx(服务器错误状态码):表示服务器无法完成明显有效的请求。
- 100 Continue:服务器已接收到请求的初始部分,客户端应继续请求。
- 200 OK(成功):服务器成功处理了客户端的请求,并返回了请求的内容。这是最常见的成功响应状态码。
- 201 Created(资源创建成功):表示服务器已成功创建了新资源。通常在创建新用户账户或上传文件等情况下使用。
- 202 Accepted:表示服务器已接受了请求,但尚未完成处理。通常在异步处理场景中使用,客户端可以稍后通过其他方式获取结果。
- 204 No Content(没有内容返回,用于删除操作):表示服务器已成功处理了请求,但没有返回任何内容。通常用于表示删除操作成功完成,因为删除操作不需要返回任何额外的数据。
- 206 Partial Content:部分内容请求成功
- 301 Moved Permanently:表示请求的资源已被永久移动到新的位置,客户端应更新其链接到新的 URL。
- 302 Found:表示请求的资源暂时被移动到另一个位置。客户端应继续使用原有的 URL。
- 304 Not Modified:资源自上次请求后未发生变化
- 307 Temporary Redirect:临时重定向
- 400 Bad Request:表示客户端发送的请求无效,服务器无法理解或处理该请求。
- 401 Unauthorized:表示客户端未经身份验证,需要提供有效的身份验证凭证才能访问资源。
- 403 Forbidden:表示服务器理解请求,但拒绝访问。客户端没有权限访问该资源。
- 404 Not Found:表示请求的资源不存在,服务器未找到与请求的 URL 相对应的资源。
- 405 Method Not Allowed:表示服务器不支持请求中指定的方法(HTTP 方法),例如客户端尝试使用 POST 请求一个只允许 GET 的资源。
- 406 Not Acceptable:服务器无法根据客户端请求提供可接受的响应
- 409 Conflict:请求与服务器的当前状态冲突
- 411 Length Required:服务器要求请求中包含 Content-Length
- 412 Precondition Failed:服务器未满足请求头中的前提条件
- 413 Payload Too Large:请求实体过大
- 414 URI Too Long:请求的 URI 过长
- 415 Unsupported Media Type:请求的媒体类型不受支持
- 416 Range Not Satisfiable:请求范围无法满足
- 500 Internal Server Error:表示服务器遇到了意外的错误,无法完成请求。
- 501 Not Implemented:服务器不支持请案穿表屡榜革稠盅唉隘辩蹈扳
- 502 Bad Gateway:服务器作为网关或代理,从上游服务器收到无效响应
- 503 Service Unavailable:表示服务器暂时无法处理请求,通常是因为服务器过载或维护中。客户端应稍后重试请求,以便在服务器恢复正常后获取响应。
- 504 Gateway Timeout:服务器作为网关或代理,未及时从上游服务器接收请求
- 505 HTTP Version Not Supported:服务器不支持请求中的HTTP版本
Docker和k8s
docker入门,这一篇就够了:Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器完全使用沙盒机制,相互之间不会存在任何接口。几乎没有性能开销,可以很容易的在机器和数据中心运行。
k8s教程----零基础快速入门:K8s是一个可移植的、用于自动化部署、扩展和管理容器化应用的开源容器编排技术。K8s使部署和管理微服务架构应用程序变得很简单。它通过在集群之上形成一个抽象层来实现这一点,允许开发团队平滑地部署应用程序
k8s和docker区别:Docker是应用最广泛的容器技术,它通过打包镜像、启动容器来创建服务。然而,随着应用的日益复杂,容器的数量也不断增加,由此衍生出管理运维容器这一重要问题。随着云计算的发展,容器的漂移也是云端最大的挑战。k8s正是在这种业务的驱动下,提出了一套全新的基于容器技术的分布式架构领先方案,这是容器技术领域中一个重大突破和创新。
五分钟搞懂 Docker 与 Kubernetes 的关系与区别
io流和序列化
序列化(Serialization)是将对象转换为字节流的过程,可以将对象保存到文件中或通过网络传输,而序列化是用来将字节流转换为对象的过程。Java的IO流中经常用到,在Java中,可以通过实现Serializable接口来实现序列化。
//序列化是将对象转换为字节流的过程,可以将对象后续保存到文件中或通过网络传输
FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(person);
out.close();
fileOut.close();
//反序列化是将字节流转换为对象
FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
person = (Person) in.readObject();
in.close();
fileIn.close();
从System.in
输入的数据序列化到文件中(序列化->反序列化)
import java.io.*;
import java.util.Scanner;
public class SerializationDemo {
public static void main(String[] args) {
try {
// 使用Scanner从System.in读取用户输入的数据
Scanner scanner = new Scanner(System.in);
String inputData = scanner.nextLine();
// 将序列化后的数据写入到dat二进制文件
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("serialized_data.dat"));
outputStream.writeObject(inputData);
outputStream.close();
System.out.println("Data has been serialized to file");
// 将序列化后的数据写入到txt文本文件
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(inputData);
PrintWriter printWriter = new PrintWriter("serialized_data.txt");
printWriter.write(byteArrayOutputStream.toString());
printWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
序列号和消息缓存决定消息接收顺序
在Java中使用序列号和消息缓存来解决消息接收顺序不一致的问题
import java.util.HashMap;
import java.util.Map;
public class MessageReceiver {
private Map<Integer, String> messageCache = new HashMap<>();
private int expectedSequenceNumber = 0;
public void receiveMessage(int sequenceNumber, String message) {
if (sequenceNumber == expectedSequenceNumber) {
// 处理消息
System.out.println("Received message: " + message);
expectedSequenceNumber++;
// 检查缓存中是否有后续消息
while (messageCache.containsKey(expectedSequenceNumber)) {
System.out.println("Received message from cache: " + messageCache.get(expectedSequenceNumber));
messageCache.remove(expectedSequenceNumber);
expectedSequenceNumber++;
}
} else {
// 将消息存入缓存
messageCache.put(sequenceNumber, message);
}
}
public static void main(String[] args) {
MessageReceiver receiver = new MessageReceiver();
// 模拟接收乱序消息
receiver.receiveMessage(1, "Message 1");
receiver.receiveMessage(3, "Message 3");
receiver.receiveMessage(2, "Message 2");
receiver.receiveMessage(4, "Message 4");
}
}
横向越界和纵向越界
在处理消息序列号时,横向越界和纵向越界是两种常见的问题:
- 横向越界:横向越界指的是接收到的消息序列号比期望的序列号大,可能是由于消息重复发送或者消息丢失导致的。在处理横向越界时,可以考虑忽略重复的消息或者进行消息去重处理,确保不会重复处理相同的消息。
- 纵向越界:纵向越界指的是接收到的消息序列号比期望的序列号小,可能是由于消息丢失或者延迟导致的。在处理纵向越界时,可以考虑将接收到的消息缓存起来,等待后续消息到达时再进行处理,确保消息的顺序性。
Android 和 iOS 的区别
Android 和 iOS 是两个最流行的移动操作系统。
Android:
- 开发者:Android 是由 Google 开发和维护的开源操作系统。开发者可以使用 Android SDK(软件开发工具包)来创建 Android 应用程序。
- 内核:Android 使用了 Linux 内核,这是一个开源的操作系统内核,提供了核心的系统服务和硬件驱动程序支持。
- 编程语言:Android 应用程序可以使用多种编程语言编写,包括 Java、Kotlin 和 C++。大多数应用程序使用 Java 或 Kotlin。
- 应用商店:Android 应用程序可以通过 Google Play 商店进行分发和下载。此外,还有其他第三方应用商店可供选择。
- 设备多样性:Android 运行在各种不同制造商的设备上,因此存在广泛的硬件和屏幕大小选择。
- 开放性:Android 是一个相对开放的操作系统,允许开发者更灵活地自定义应用程序和设备。
- 开发工具:Android 开发通常使用 Android Studio 这样的集成开发环境(IDE)。
iOS:
- 开发者:iOS 是由苹果公司开发和维护的操作系统,仅用于苹果的移动设备,如 iPhone、iPad 和 iPod Touch。
- 内核:iOS 使用了自家设计的内核,这使得它在苹果设备上运行时非常高效。
- 编程语言:iOS 应用程序主要使用 Objective-C 和 Swift 编程语言编写。Swift 是苹果公司开发的现代编程语言,逐渐取代了 Objective-C。
- 应用商店:iOS 应用程序可以通过 Apple App Store 进行分发和下载,这是唯一的官方分发渠道。
- 设备一致性:iOS 运行在苹果设备上,因此硬件配置和屏幕大小相对一致,这有助于应用程序的一致性和性能。
- 封闭性:iOS 是一个相对封闭的操作系统,苹果对应用程序的审核和控制非常严格,以确保用户安全和应用质量。
- 开发工具:iOS 开发通常使用 Xcode 这样的集成开发环境(IDE)。
mysql索引类型
数据结构维度:
1、B+树索引: 所有数据存储在叶子节点,复杂度为O(logn),适合范围查询。
2、哈希索引: 适合等值查询,检索效率高,一次到位。
3、全文索引: MyISAM和InnoDB中都支持使用全文索引,一般在文本类型char,text,varchar类型上创建。
R-Tree索引:用来对GIS数据类型创建SPATIAL索引物理存储维度
物理存储维度:
4、聚集索引:聚集索引就是以主键创建的索引在叶子节点存储的是表中的数据。 (Innodb存储引擎)
5、非聚集索引:非聚集索引就是以非主键创建的索引,在叶子节点存储的是主键和索引列。(Innodb存储引擎)
逻辑维度:
6、主键索引:一种特殊的唯一索引,不允许有空值。
7、普通索引: MySQL中基本索引类型,允许空值7和重复值。
8、联合索引:多个字段创建的索引,使用时遵循最左前缀原则。
9、唯一索引: 索引列中的值必须是唯一的,但是允许为空值。
10、空间索引: MySQL5.7之后支持空间索引,在空间索引这方面遵循OpenGIS几何数据模型规则。
什么是RESTful API?
RESTful API(Representational State Transfer API)是一种用于设计网络应用程序接口的架构风格。它是一种基于 HTTP 协议的架构,旨在促进系统之间的互操作性和可扩展性。RESTful API 的核心概念包括资源(Resources)、HTTP 方法(HTTP Methods)、状态(State)、无状态(Stateless)以及表述(Representation)。
配置java环境的时候,JAVA_HOME、 Path、 CLASSPATH这些路径都有什么用
JAVA_HOME:一个系统环境变量,它指向Java Development Kit(JDK)的安装目录。在系统变量中新建一个名为JAVA_HOME的变量,并将其值设置为JDK的安装目录路径。这是为了让系统知道在哪里可以找到Java开发工具。
Path:一个系统环境变量,它用于定义可执行文件的搜索路径。在Path中添加了%JAVA_HOME%\bin;可以让系统在执行命令时自动搜索到JDK的可执行文件(如java、javac等)。其将JDK的可执行文件目录包含在可执行文件的搜索路径中。
CLASSPATH:一个环境变量,用于指定Java类库的搜索路径,它告诉Java虚拟机(JVM)在哪里查找类文件。在系统变量中新建一个名为CLASSPATH的变量,并将其值设置为所需的类路径。比如设置%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;,它们分别指向JDK的类库和tools.jar文件,以便Java应用程序可以访问这些库和工具。
再详细讲一下Path和CLASSPATH的区别
Path和CLASSPATH是两个不同的环境变量,它们在Java开发中具有不同的作用和用途。Path确保系统可以找到Java的可执行文件,而CLASSPATH确保JVM可以找到应用程序所需的类文件。
Path
作用:Path环境变量是操作系统级别的环境变量,用于指定系统在哪里查找可执行文件。当您在命令行中运行可执行程序时,操作系统会根据Path中的路径来查找这些程序。对于Java开发,将%JAVA_HOME%\bin;添加到Path中可以让系统识别并运行JDK中的Java工具和可执行文件,如java、javac等。
使用场景:Path主要用于配置系统的执行路径,以确保系统可以找到所需的可执行文件。它不涉及Java类的加载,只关注可执行文件的查找和执行。
CLASSPATH
作用:CLASSPATH环境变量是Java虚拟机(JVM)的环境变量,用于指定Java类加载器在哪里查找类文件。当Java应用程序运行时,JVM会根据CLASSPATH设置来查找和加载类文件。CLASSPATH用于定义Java应用程序的类路径,以告诉JVM在哪里查找和加载应用程序所需的类文件和库。
使用场景:CLASSPATH主要用于配置Java应用程序的类加载路径,以确保JVM可以找到应用程序依赖的类文件。它是Java开发中非常重要的环境变量,因为它决定了哪些类和库可以在应用程序中使用。