1.tcp的三次挥手和四次握手
三次握手:
- 第一次握手:客户端发送一个带有SYN标志的TCP报文段给服务器,并指明初始序列号(Sequence Number)
- 第二次握手:服务器收到客户端的SYN报文段后,会发送一个带有SYN/ACK标志的TCP报文段给客户端,同时确认客户端的初始序列号,并指定自己的初始序列号
- 第三次握手:客户端收到服务器的SYN/ACK报文段后,会发送一个带有ACK标志的TCP报文段给服务器,确认收到服务器的确认,并指明自己的初始序列号
四次挥手:
- 第一次挥手:当应用程序决定要关闭连接时,客户端发送一个带有FIN标志的TCP报文段给服务器,表示不再发送数据
- 第二次挥手:服务器收到客户端的FIN报文段后,发送一个带有ACK标志的TCP报文段给客户端,确认收到客户端的关闭请求
- 第三次挥手:服务器发送一个带有FIN标志的TCP报文段给客户端,表示服务器也不再发送数据
- 第四次挥手:客户端收到服务器的FIN报文段后,发送一个带有ACK标志的TCP报文段给服务器,确认收到服务器的关闭请求
2.Python中的内置函数
print()
: 打印输出内容input()
: 读取用户的输入len()
: 返回对象(字符串、列表、元组等)的长度type()
: 返回对象的类型str()
: 将对象转换为字符串int()
: 将对象转换为整数float()
: 将对象转换为浮点数list()
: 将可迭代对象转换为列表tuple()
: 将可迭代对象转换为元组dict()
: 创建一个字典range()
: 生成一个指定范围的整数序列sum()
: 对可迭代对象进行求和max()
: 返回可迭代对象中的最大值min()
: 返回可迭代对象中的最小值abs()
: 返回数值的绝对值
3.python常见的异常类
SyntaxError
: 语法错误,通常是代码书写错误导致的IndentationError
: 缩进错误,通常是代码缩进不正确导致的NameError
: 名称错误,使用了未定义的变量或函数名TypeError
: 类型错误,如使用了不支持的操作或参数类型不匹配ValueError
: 值错误,当一个对象传入一个函数时,这个对象的类型是正确的,但值不合适IndexError
: 索引错误,尝试访问一个不存在的索引KeyError
: 键错误,尝试访问字典中不存在的键FileNotFoundError
: 文件未找到错误,尝试打开或访问不存在的文件ZeroDivisionError
: 除零错误,尝试进行除以零的运算AttributeError
: 属性错误,尝试访问不存在的属性或方法ImportError
: 导入错误,导入模块失败或找不到指定的模块IOError
: 输入/输出错误,读写文件或数据时发生的错误KeyboardInterrupt
: 键盘中断,当用户中断程序执行时抛出的异常OverflowError
: 溢出错误,数值运算超出了所能表示的范围MemoryError
: 内存错误,尝试分配超过可用内存的对象。
4.什么是匿名函数
匿名函数,也称为 lambda 函数,是一种没有明确名称的函数。它是在编程语言中用来简化代码和处理一些简单任务的一种方式
匿名函数没有独立的定义和命名过程,通常在需要使用函数的地方直接定义和调用。它可以作为参数传递给其他函数、存储在变量中或者直接执行
匿名函数的特点包括:
- 没有函数名:不需要像普通函数那样定义函数名
- 简洁性:可以将简单的函数逻辑写在一行代码中
- 临时性:只在需要的地方定义和使用,无需额外的命名和管理
在许多编程语言中,匿名函数通常以关键字 "lambda" 开头,并紧随其后的是参数列表和函数体。匿名函数可以用来处理迭代、排序、回调等场景,以及编写更简洁、易读的代码
需要注意的是,匿名函数通常用于处理简单、一次性的逻辑,如果函数逻辑复杂或需要重复使用,建议使用普通的具名函数来定义
5.什么是redis
redis是一个使用c语言编写的开源,高性能的非关系型的键值对数据库
redis可以存储键和五种不同类型之间的映射,键的类型只能是字符串值
支持五种数据类型:字符串,列表,集合,有序集合,散列表
6.redis的优缺点
优点:
-
高性能:Redis 的数据存储在内存中,读写速度非常快,适合处理高并发的场景。它支持对数据进行缓存,可以提高访问速度,并减轻后端数据库的负载
-
多种数据结构支持:Redis 不仅支持简单的键值存储,还支持丰富的数据结构,如列表、集合、哈希和有序集合等。这使得开发者可以更灵活地处理不同类型的数据
-
持久化支持:Redis 支持将数据持久化到磁盘上,以防止服务器重启或宕机时数据的丢失。它提供了两种持久化方式,分别是 RDB(快照)和 AOF(日志追加),开发者可以根据需求选择合适的方式
-
分布式计算:Redis 提供了主从复制和集群功能,可以将数据复制到多个节点,实现数据备份和容灾。这样可以增加系统的可用性和可靠性
-
丰富的功能特性:除了基本的数据存储和获取外,Redis 还提供了发布/订阅、事务支持、分布式锁等功能。这些功能可以帮助开发者构建更强大和复杂的应用
缺点:
-
数据量受限:Redis 将数据存储在内存中,因此受到可用内存的限制。当数据量较大时,需要考虑到服务器内存的大小和成本
-
单线程模型:Redis 使用单线程处理请求,这意味着在某些高并发场景下可能存在性能瓶颈。尽管 Redis 内部采用了多路复用技术来提高并发性能,但在特定场景下仍可能出现性能问题
-
无结构查询支持:与传统的关系型数据库相比,Redis 不支持像 SQL 这样的结构化查询语言。虽然 Redis 提供了一些基本的查询操作,但不如关系型数据库那样强大和灵活
-
持久化效率:Redis 的持久化方式对性能有一定的影响,持久化写入磁盘会带来额外的 I/O 操作。在一些对 I/O 效率要求较高的场景下,可以选择关闭持久化或者使用更高级别的存储引擎
7.什么是redis持久化
Redis 持久化是指将 Redis 中的数据在某种形式下保存到磁盘上,以便在 Redis 重启后能够恢复数据。持久化可以确保数据的持久性和可靠性,防止数据丢失
Redis 提供了两种持久化方式:
-
RDB(Redis Database)持久化:RDB 是一种快照式持久化方式,它会将 Redis 内存中的数据定期或手动地保存到一个二进制文件(.rdb 文件)中。RDB 持久化的优点是生成的文件紧凑、自描述性强,适合用于数据备份和灾难恢复。可以通过配置文件设置 RDB 持久化的触发机制和保存频率
-
AOF(Append-Only File)持久化:AOF 持久化是一种追加日志式持久化方式,它会将 Redis 的写命令追加到一个日志文件(appendonly.aof 文件)中。当 Redis 重启时,会通过重新执行日志文件中的命令来还原数据。AOF 持久化的优点是数据更加持久和安全,可以避免数据丢失。可以通过配置文件设置 AOF 持久化的触发机制和刷盘频率(fsync 策略)
8.redis如何实现乐观锁
Redis 的乐观锁是基于 WATCH 命令和事务(MULTI/EXEC)来实现的。WATCH 命令用于监视给定的键,如果在事务执行期间,被监视的键被其他客户端所改动,那么事务将被打断。通过检查事务执行结果中的 nil 值,可以判断是否发生了冲突,从而决定如何处理
9.redis布隆过滤器是什么
Redis 布隆过滤器(Bloom Filter)是一种用于快速判断一个元素是否存在于集合中的数据结构,它通过使用位数组和多个哈希函数来实现。布隆过滤器的主要特点是空间效率高且查询速度快,但会存在一定的误判率
布隆过滤器的优点是占用的空间相对较小,且查询速度非常快。它适用于需要判断元素是否存在或者可能存在的场景,例如缓存穿透、垃圾邮件过滤、URL 去重等。然而,布隆过滤器也存在一定的误判率(即误认为元素存在于布隆过滤器中,但实际上不存在),因此不适用于需要百分之百准确性的场景
在 Redis 中,可以通过使用布隆过滤器插件(RedisBloom)来实现布隆过滤器功能。RedisBloom 提供了一组用于操作布隆过滤器的命令,例如创建布隆过滤器、插入元素、查询元素等。通过使用 RedisBloom,可以方便地在 Redis 中使用布隆过滤器来解决实际问题
布隆过滤器由两部分组成:
-
位数组(Bit Array):用来表示布隆过滤器的容器,通常通过 Redis 的字符串类型实现。每个位数组的位都初始设置为 0
-
多个哈希函数(Hash Functions):用来将待验证的元素映射到位数组上的多个位置。通常使用多个相互独立的哈希函数来实现
10.python的元类
目录
在 Python 中,元类(metaclass)是用于创建类的类。它是一种高级特性,允许我们在定义类时自定义类的行为
元类的主要作用是控制类的创建过程,可以拦截类的定义、修改类的属性和方法,甚至可以替换类的实现。通过定义元类,我们可以对类进行自定义的元编程操作
在 Python 中,可以使用 type
内置函数来创建元类。type
函数接受三个参数:类名、基类元组(可选)、类属性字典。通过调用 type
函数并传递这些参数,就可以动态创建一个类