GC机制
GC机制又称垃圾回收机制,是Python解释器自带一种机,专门用来回收不可用的变量值所占用的内存空间
有三个核心,分别是引用计数、标记清除和分代回收
引用计数:一个变量值如果有一个变量名指向,那么在它身上就计数1,引用计数为0的数据都为垃圾数据,我们也会把引用计数为0的数据清除点;
标记清除:当我们的内存空间即将要沾满的时候,这个时候会暂停所有程序的执行,开始扫描内存空间中得数据,把垃圾数据进行打标签,然后统一进行垃圾数据的清除。
分代回收:扫描是否回收,多次都未回收将不再扫描,提高效率,即对垃圾数据的监管频率逐渐下降。
数据库三大范式
数据库的三大范式是关系型数据库的表设计规范
在设计表时,要遵循这三大范式,有第一范式1NF,第二范式2NF和第三范式3NF
第一范式(1NF)是指数据库表每列的值具有原子性,不可再分割, 每个字段的值都只能是单一值, 比如hobby字段 [抽烟 烫头]
第二范式(2NF)是在第一范式(1NF)的基础上建立起来得,主键以外的列必须完全依赖于主键;比如学生id和课程id联合主键,非主键列【分数】完全依赖于主键【学生id和课程id】,学生id和课程id两个值才能决定score的值
第三范式(3NF)是在第二范式的基础上建立起来的,指非主键列之间不能传递依赖,可以比喻成一对多的表,比如上海表里有个个区,而通过区表又可以有个个路
mysql有哪些索引类型
索引是存储引擎用于快速找到记录的一种数据结构,这也是索引最基本的功能
一共有七种索引类型,首先是主键索引、普通索引、唯一索引、全文索引、前缀索引、组合索引和空间索引
主键索引又叫聚簇索引,mysql是一定会有主键索引,如果按主键搜索,速度是最快的;普通索引通过变化大字段查询,会提高速度,如果字段变化小(性别,年龄),不要建立普通索引;唯一索引通常使用 UNIQUE 关键字,不是为了提高访问速度,而是为了避免数据出现重复;组合索引又称联合索引,多个字段一起查询以提高速度;全文索引主要用来查找文本中的关键字。
事务的特性和隔离级别
事务有四大特性,原子性、隔离性、一致性和持久性
原子性是事务包含的所有数据库操作要么全部成功,要不全部失败回滚
隔离性是指事务之间相互隔离,不受影响
一致性是指事务执行前后的状态要一致,可理解为数据一致性
持久性是指事务完成之后对数据的修改是永恒的
隔离级别有四种:读未提交、读已提交、可重复读取和串行化
读未提交是指一个事物读到了另一个事务未提交的数据,存在脏读,不可重复读,幻读的问题;
读已提交是指设置了这个级别一个事物读不到另一个事务未提交的数据,解决了脏读,但是存在不可重复读和幻读;
可重复读取是指事务开启即在开始读取数据时,不再允许修改操作,这样就可以在同一个事务内两次读到的数据是一样的,解决了脏读,不可重复读问题,存在幻读问题;
串行化是指事务只能一个接着一个地执行,但不能并发执行,解决了脏读,不可重复读和幻读问题,牺牲了效率
脏读、不可重复读和幻读
事务隔离级别不同,而并发开启事务操作数据,就会出现不同的问题
脏读指的是读当前事务到了其他事务未提交的数据,未提交意味着这些数据是不存在的
不可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况,导致的原因是事务 A多次读取同一数据,但事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致;
幻读是指select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入
qps、tps、并发量、pv和uv
QPS:指每秒查询率,一台服务器每秒能够响应的查询次数,每秒的响应请求数;
TPS:每秒处理的事务数,包括一条消息入和一条消息出,加上一次用户数据库访问;
并发量:指系统同时处理的请求或事务数,可以直接理解为:系统同时处理的请求数量;
PV:指页面访问量,即页面浏览量或点击量,用户每次刷新即被计算一次
可以统计服务一天的访问日志得到
UV:指独立访客,统计1天内访问某站点的用户数
DAU:指日活跃用户数量,常用于反映网站、app、网游的运营情况;
MAU:指月活跃用户数量
接口幂等性问题
无论调用多少次,产生的效果是一样的,比如用户多次点击按钮 只执行了一次
解决方案有:
1、通过token机制,下单接口的前一个接口,只要一访问,后端生成一个随机字符串,存到redis中,把随机字符串返回给前端,然后调用业务接口请求时,把随机字符串携带过去,一般放在请求头部,务器判断随机字符串是否存在redis中,存在表示第一次请求,然后redis删除随机字符串,继续执行业务,如果判断随机字符串不存在redis中,就表示是重复操作,直接返回重复标记给client,这样就保证了业务代码,不被重复执行
2、使用唯一主键
3、使用唯一id
4、前端设置按钮只能点击一次
5、悲观锁和乐观锁
乐观锁和悲观锁
乐观锁:假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,乐观锁其实不是锁,是数据库的字段,每操作一次就+1 这样后续的操作就对不上,适用于写比较少的情况下(多读场景);
悲观锁才是真的锁住了,只能有一个拿一把钥匙,是比较悲观的锁,总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁
三次握手四次挥手
三次握手是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包,客户端发送一个包给服务端,服务端表示收到并再发送一个包给客户端,客户端然后发送应答表示收到
四次挥手则是客户端发送包到服务端,服务端给客户端发送一条请求表示收到包了,然后服务端又再次给客户端发送关闭包,表示考虑好了,最后客户端表示收到;
由于四次挥手是因为如果服务器接收到客户端并且发送关闭的请求后,回容易造成数据的丢失,因此中间的这一段时间,等待服务器把剩余的数据发送完是很有必要的
django中实现事务
1、全局开启事务,在setting中设置,可以局部禁用;
2、Django提供了一个atomic装饰器,它可以轻松地将一个视图函数或方法包裹在事务中。这个装饰器确保在其内部的代码块中执行的数据库操作要么全部成功,要么全部失败 3、还可以使用atomic上下文管理器来定义事务块或objects.atomic方法
鸭子类型
鸭子类型是python语言面向对象中的一个概念,面向对象有三大特性:继承、封装和多态
当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
鸭子类型在程序设计中强调的是行为而不是类型,只关心对象是否具备预期的方法或属性,如果对象的行为符合预期,那么就可以将其当作特定类型的对象来使用。有助于增强代码的灵活性和可维护性。
浏览器输入地址,看到页面信息,经历的过程
1、输入网址:你在浏览器的地址栏中输入你想要访问的网址。
2、浏览器解析URL:浏览器首先会解析你输入的URL,检查其是否合法。
3、查找缓存:浏览器会检查其自身的缓存以查看是否之前已经访问过该网页,如果缓存中有该网页的内容,那么浏览器会直接显示缓存的内容,而不会再去服务器上请求数据。
4、如果缓存中没有找到相应的内容,浏览器会进行域名系统解析,以获取该网址对应的IP地址。
5、与服务器建立TCP连接。这个过程需要进行TCP三次握手,以确保连接的可靠性。
6、TCP连接建立成功后,浏览器会向服务器发送HTTP请求,请求获取网页的内容。
7、服务器收到请求后,会处理该请求,并将网页的内容作为HTTP响应返回给浏览器。
8、浏览器收到服务器的响应后,会解析响应的内容,并将网页的内容显示出来。这包括解析HTML、CSS、JavaScript等,以及下载和显示嵌入在HTML中的资源
9、关闭TCP连接:当网页内容全部加载完成后,浏览器会关闭与服务器的TCP连接。