目录
11.在Redis事务中,通常将事务的执行分为以下三个阶段:
1.__init__ 和 __new__ 的区别
__init__ 方法是类的构造函数,当一个对象被创建时,Python 会自动调用该方法来初始化对象的属性。在 __init__ 方法中,可以为对象的属性赋值,也可以执行一些初始化操作。
__new__ 方法是类的实例化方法,它负责创建一个新的对象,并返回该对象。在 __new__ 方法中,可以为对象的属性赋值,也可以执行一些初始化操作。__new__ 方法必须返回一个对象,否则会抛出 TypeError 异常。
区别:__new__ 方法和 __init__ 方法的第一个参数都是 self,表示当前对象的实例。__new__ 方法和 __init__ 方法的区别在于,__new__ 方法必须返回一个对象,而 __init__ 方法可以为对象的属性赋值
2.iter()内置方法 :
iter()是一个内置函数,用于将可迭代对象转换为迭代器。可迭代对象是一种可以被迭代的对象,例如列表、元组、字符串等。迭代器是一种特殊的对象,它可以在迭代过程中逐个返回元素,而不是一次性返回所有元素
3.type 和 isinstance
type() 函数用于返回一个对象的类型,它可以返回对象所属类的类型信息。
isinstance()函数用于检查一个对象是否是指定类型或其子类的实例。它返回一个布尔值,如果对象是指定类型或其子类的实例,则返回 True ,否则返回 False 。
区别:
1,type() 函数返回对象的具体类型,而 isinstance()函数则检查对象是否是指定类型或其子类的实例。
2,type() 返回的是对象的类型,是一个类对象的实例,而 isinstance()返回的是一个布尔值,表示对象是否是指定类型或其子类的实例。
3,type()函数通常用于判断对象的具体类型,例如判断一个对象是否是整数、字符串、列表等。而 isinstance() 函数通常用于检查对象是否是某个类的实例,可以检查对象是否是某个类的子类的实例
4.匿名函数(lambda)
匿名函数是一种没有明确名称的函数,也被称为lambda函数。它通常用于需要一个临时函数的场景,不需要定义函数的完整结构。匿名函数可以在需要时声明和使用,而无需事先定义函数名称。
匿名函数的语法通常为:lambda 参数列表:表达式
例子如下:
add = lambda x,y: x + y
print(add(2,3)) # 输出结果为5
5.在Python中,常见的异常有:
1.ValueError(数值错误): 当一个函数接收到一个不合适的参数或参数值时,会引发ValueError异常.
2.TypeError (类型错误): 当操作或函数应用于不兼容的类型时,会引发TypeError异常。例如,:尝试对字符串进行数值运算,或将一个不可迭代的对象传递给一个期望可迭代对象的函数,都会引发ypeError.
3.IndexError (索引错误): 当使用无效的索引访问序列(如列表、字符串等)中的元素时,会引发IndexError异常。例如,尝试访问一个超出席列范围的索引或负数索引,都会引发IndexError。
4.KeyError(键错误): 当使用一个字典中不存在的键访问字典元素时,会引发KeyError异常.
5.FileNotFoundError (文件未找到错误) : 当尝试打开一个不存在的文件时,会引发FileNotFoundError异常。
6.I0Error (输入/输出错误) : 当发生输入/输出操作失败时,会引发IOError异常。例如,在读取或写入文件时发生错误,就会引发IOError。
7.ZeroDivisionError (除委错误) : 当尝试以委作为除数进行除法运算时,会引发ZeroDivisionError异
6.osI 和 TCP/IP 7层协议:
7.redis中的数据类型:
字符串(string),散列(hashes)、哈希(hash)、位图 ( Bitmaps )、基数统计 ( HyperLogLogs )、 列表(lists),集合(sets),有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 、 地理空间(geospatial) 索引半径查询、 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions)、磁盘持久化(persistence), 哨兵(Sentinel)、自动 分区(Cluster)
8.redis的过期策略
- 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。
- 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。
- 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。
9.redis持久化方式:
1 RDB持久化方式(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化)
能够在指定的时间间隔能对你的数据进行快照存储.
2 AOF持久化方式(原理是将Reids的操作日志以追加的方式写入文件)
记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,
AOF命令以redis协议追加保存每次写的操作到文件末尾.
Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.
10.redis雪崩:
原因:由于原有缓存失效(或者数据未加载到缓存中),新缓存未到期间(缓存正常从Redis中获取)所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机,造成系统的崩溃。
解决方案:
第一,大多数系统设计者考虑用加锁或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写,避免缓存失效时对数据库造成太大的压力,虽然能够在一定的程度上缓解了数据库的压力但是与此同时又降低了系统的吞吐量。
第二,分析用户的行为,尽量让缓存失效的时间均匀分布。
第三,如果是因为某台缓存服务器宕机,可以考虑做主备,比如:redis主备,但是双缓存涉及到更新事务的问题,update可能读到脏数据,需要好好解决
11.在Redis事务中,通常将事务的执行分为以下三个阶段:
1. 开始事务(multi)
当客户端启动事务时,它会向 Redis 服务器发送一个 MULTI 命令,告诉服务器客户端准备开始执行一个事务。
2. 命令入队
一旦事务开始,客户端在 MULTI 和 EXEC 命令之间发送的所有命令都被暂时存储在事务队列中,并且只有在事务执行 EXEC 命令的时候才会被实际执行。
3. 执行事务(EXEC)
当客户端发送 EXEC 命令时,Redis 服务器将事务队列中的所有命令作为一个原子操作一块在服务器端原地执行,然后返回命令结果。
12.什么是序列化和反序列化
序列化是什么?
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。
反序列化 (Deserialization)是将有序的二进制序列转换成某种对象(字典,列表等)的过程。
13.三次握手:
-
第一次握手([SYN], Seq = x)
客户端发送一个SYN标记的包,Seq初始序列号x,发送完成后客户端
进入SYN_SEND
状态。 -
第二次握手([SYN,ACK], Seq = y, ACK = x + 1)
服务器返回确认包(ACK)应答,同时还要发送一个SYN包回去。ACK = x + 1,表示确认收到(客户端发来的Seq值 + 1),Seq = y, 表示让客户端确认是否能收到。发送完成后服务端
进入SYN_RCVD
状态。 -
第三次握手([ACK], ACK = y + 1)
客户端再次发送确认包(ACK),ACK = y + 1, 表示确认收到服务器的包(服务端发来的Seq值 + 1)。客户端
发送完毕后,进入ESTABLISHED
状态,服务端
接收到这个包,也进入ESTABLISHED
状态, TCP握手结束。