面试大纲

数据库: B树就是 B-树 B&B+都用到了磁盘块的概念,每块大概4k,利用了磁盘的预读和同一数据块内很有可能一起用到 Redis端口6379

事务四大特性(ACID)原子性(不可再分 要么都发生 要么不发生)、一致性、隔离性、持久性

数据库隔离级别:读取未提交数据=脏读,可以读取其他事务提交的数据 大多数默认级别,不可重复读-MySQL默认,可重读=幻读 InnoDB默认,串行化 读写阻塞。并行依次降低,安全性提高。

innodb和myisam区别:MyIsam-允许没有主键 表锁 不产生死锁 读快 不支持事务操作,外键以及行级锁 保存表行数count直接返回行数 支持全文索引 存储数据文件 索引/数据文件分离 索引文件保存数据地址; InnoDB-没主键或非空唯一索引它会自动生成一个用户不可见的主键 不保存表的行数,count()会遍历整个表,但是加上where俩引擎都一样 不支持全文索引 写较快 并发高 索引和数据一起存在表空间-数据记录本身被存于主索引的叶子节点上 行锁,并发高,可能死锁 表数据文件就是主索引-叶节点包含完整数据记录,数据按照主键聚集,所以InnoDB必须有主键,没有也会 自生成长度6字节的 辅助索引先检索主键再根据主键找到数据 设计主键时长度不能过大因为辅助索引都引用主索引,过大引起辅助索引过大 使用单调的字段,非单调在插入新数据时会为了维持其特性而频 繁分裂调整。
后者查询快-叶子节点不保存数据,占用空间小,分布集中。前者相反,所以占用更多扇区,更多IO。插入也是后者快,前者需要检测主键重复,尽可能也要按顺序来。

查询语句不同元素(where、jion、limit、group by、having 等等)执行先后顺序:from-join-where-group by-having-select-order by

使用explain优化sql索引:先开启慢日志查询,找到慢的SQL再执行explain。id type(ALL < index < range ~ index_merge < ref < eq_ref < const < system)至少range key ref extra
SQL优化:减少数据请求量 不要* 减少与数据库交互,最好批量操作 用limit 缓存 避免隐式转化导致索引失效 拆分大SQL为小SQL。
索引失效:% 索引列计算 左原则 查询条件有函数 组合索引有null 查询条件中有!=,<>,is null is not null 查询条件字符串不带引号
字段设计优化:一定要根据需求设计,比如varchar char的选择 前者变长但有额外信息 后者固定适合定长字段如UUID 使用简单数据结构-str变数字 IP变整型 列设置not null-索引列需要额外空间保存 时间用TIMESTAMP,DATETIME可读性高空间小 不建议外键约束,影响性能,用业务逻辑约束。主键自增,不宜过大。
索引优化:多列索引比多个单列索引好 在order by where经常搜索 范围搜索上创建索引 主键创建唯一索引 外键建立索引 经常改的/大量重复/记录少不建 限制单表索引数量一般少于5
数据量大之后分库分表:垂直 水平分表 主从复制分库

数据库的主从复制:binlog 线程(将主服务器上的数据更改写入二进制日志(Binary log)中)、I/O 线程(从主服务器上读取二进制日志,并写入从服务器的中继日志(Relay log))和 SQL 线程(读取中继日志,解析出主服务器已经执行的数据更改并在从服务器中重放(Replay))读写分离:主从服务器负责各自的读和写,极大程度缓解了锁的争用 从服务器可以使用 MyISAM,提升查询性能以及节约系统开销

B+索引数据结构,和B(B-)树的区别:B树是比平衡二叉树多分枝,每个索引节点都会有Data域。B+树的俩个特点:数据存在叶子结点,叶子结点由指针连接
为什么选择B+:因为B树不管是叶子节点还是非叶子节点都会保存数据,这样在非叶子节点保存的指针数量就会变少,响应的树高就会增大,I/O数就变多,性能变低。

聚集和非聚集索引:共同点-内部都是B+,高度都是平衡,叶节点存放所有数据。不同点:叶节点是否存放一整行数据。聚集是按照数据的物理存在划分的,索引的顺序和数据的物理顺序保持一致。
非聚集强调逻辑分类-先去索引表查位置 再去取记录。
主索引:key是主键的索引

数据库三范式,根据某个场景设计数据表(可以通过手绘ER图)第一:列的原子性 即不可再分-也要看需求,必要再分(如地址 若城市查询率很高 则需要再分地址字段为省、城市、县)
第二:必有主键 没有包含在主键中的列必须完全依赖于主键 第三:非主键列必须直接依赖于主键,不能存在传递依赖

MySQL:单进程多线程,分三层:客户端 服务层 存储引擎
MySQL数据库备份:SELECT INTO OUTFILE 这种方法只能导出或导入数据的内容,而不包括表的结构。若表的结构文件损坏,则必须先设法恢复原来表的结构。LOAD DATA…INFILE 恢复数据
MySQL分区:物理分区,逻辑一个表。分类:hash分区-按活跃来 range-适合时间相关

redis和mysql什么时候同步:读,先读缓存,没有数据则读数据库,然后取出数据后放入缓存同时返回响应。更新,先删除缓存,然后再更新数据库。为什么删缓存?懒加载用到再写入缓存。为什么先删再更新?若反着来先更新再删除缓存,若删除失败则出现数据不一致,先删后更新,更新失败则访问数据为空

内连接、外连接、交叉连接、笛卡儿积等

死锁:当两个事务都需要获得对方持有的排他锁才能完成事务,导致循环锁等待。关键:两个 (或以上) 的Session加锁的顺序不一致。那么对应的解决死锁问题的关键就是:让不同的 session 加锁有次序。
InnoDB提供wait-for graph算法,当检测到有向图是否出现环路,回滚一个事务。或kill线程,设置锁超时时间。预防:约定程序读表顺序一样 大事务拆成小事务 降低隔离级别

乐观锁悲观锁:排它锁:写锁,其他事务不可加锁 用法 select 后面加 FOR UPDATE 乐观锁:更新提交才检测 版本号 时间戳

Redis特点:持久化、丰富的数据类型,支持数据的备份即master-slave模式,性能高,操作原子性-MULTI和EXEC指令包起来
Redis数据类型,以及Redis底层实现:string计算;list消息队列 最近浏览;set共同好友;hash zset排行榜
实现:单线程(避免不必要的上下文切换和竞争条件 不用考虑锁)-多路复用IO模型。因为单线程所以在使用keys查看时会阻塞,若是在线上则不能用keys,用scan,无阻塞取但有重复,去重即可。

Redis缓存穿透/雪崩 穿透-查数据库没有的数据会一直请求,解决:查不到缓存空值或布隆过滤器
雪崩-许多key设置相同时间过期,即同时出现大面积缓存失效去访问数据库,解决:加随机数设置过期时间 加锁或者队列,不让大量线程去请求数据库
缓存预热:系统上线后,将相关数据加载到缓存系统。思路:写一个刷新缓存页面,去请求次数据 数据量不大可以自动加载 定时刷新缓存

如何使用Redis来实现分布式锁:SET NX 是将key的值设为value,当且仅当 key不存在,返回1说明拿到锁 返回0则没拿到;设置超时时间 万一突然宕机锁没有被释放

Redis的并发竞争问题如何解决:乐观锁,使用redis的命令watch进行监控key值,若exec执行事务时watch的key变了则事务失败

Redis 持久化的几种方式,优缺点是什么,怎么实现的:有AOF优先加载
RDB: SAVE/BGSAVE:前者是阻塞执行,后者是fork一个子进程不影响用户请求 前面是手动保存,一般配置参数:900-1(900秒内改一次则快照) 300-10 60-10000 在Redis中,这个自动保存RDB 的功能是默认开启的。优缺点:适合灾难恢复 大量数据比AOF快 需要避免过多丢失数据不适合快照 若fork子进程去执行,数据多时很占资源
AOF:默认关闭,设置(每秒默认 每个命令都写 操作系统决定)优缺点:有重写功能 减少冗余命令 比RDB大 执行时大量写入操作,效率低
选择:一般俩者都开 对数据要求不高,只开RDB 不能只开AOF,官方说有BUG,且载入慢比RDB慢。重启优先加载AOF 没有再去加载RDB。

Redis几种模式:主从复制不能用图状,用单链表式
主从复制:实现:输入slave of host port后,从节点保存主节点信息,主从建立socket连接,发送ping命令,权限校验,数据同步便完成建立,后面主持续写命令至从。 第一次时主做bgsave操作,并将后续的修改操作写入内存buffer,完成后把rdb文件复制到从且写入从内存,再将buffer同步到从节点。一般不会用,至少会是哨兵。
哨兵:解决高可用,独立的进程,在监听所有的Redis服务器是否正常运行,若主机宕机,令从机变为主机并通过发布订阅模式通知别的服务器,修改配置文件,让他们切换主机。
哨兵模式分俩部分,一是哨兵系统-不存数据,二是主从节点。配置:sentinel monitor master ip port n(n为master故障几个哨兵同意才故障转移) 启动:redis-sentinel conf_path
cluster集群/分区/分片:拓展性,数据量大时用。分片:将数据存在多个服务器 分类:范围分片(1-10 10-20)hash分片。

Redis 的数据淘汰策略 6种:已设置过期时间 最近最少使用/将要过期/任意数据 所有数据 最少使用/任意 禁止驱除数据

Redis过期键删除策略:1、定时删除-过期时创建一个定时器2、惰性删除-过期键不管,当再次访问时若过期则删除3、定期删-隔一段时间删除过期键。

Redis在项目中用:settings中配置 from django_redis import get_redis_connection pool = redis.ConnectionPool(host='localhost', port=6379, db=2)
redis_db = redis.Redis(connection_pool=pool)

URL URI区别:URI-统一资源描述符,用来唯一标识一个资源 URL-统一资源定位器,具体的URI,即可以标识该资源还可以定位该资源。URN-统一资源命名

HTTP协议:特点:1、简单快速-只需传方法路径2、灵活-传输的类型由Content-Type控制3、无连接-应答完毕断开4、无状态-指协议对事务没记忆能力,即俩次打开同一个页面无任何联系1.1开始默认长连接

Http的报文结构:Request请求行 请求头部 空行 请求数据 首部-Cache-Control缓存 accept-charset/encoding/language

Http长连接:本质是TCP长短连接。1.1开始默认长连接,设置实在响应头中加Connection:keep-alive,他会有一个保持时间即一次任务完成后连接不断开。长短取舍在于场景,长用在操作频繁 点对点,web网
站一般为短 因为有成千上万个用户 各自都占连接 资源浪费太大

TCP报文结构:序号Seq,确认号Ack,标志位-共6个Ack SYN-新连接标志 FIN-断开连接标志,窗口,指针,数据

TCP握手与挥手:Seq用来标识A到B数据包的序号,Ack确认号 等于Seq+1,SYN建立新连接,FIN断开连接 TIMEWAIT:断开连接时,最后客户端给服务端发送Ack后进入的状态,不直接断开的原因是
怕服务端没有接受到Ack就会继续给客户端发送之前的信息,正常情况TIMEWAIT会维持往返俩个传输的时间后进入close状态

HTTPs加密原理:数字证书-CA机构颁发的 里面有证书持有人及其密钥信息。数字签名-制作过程:CA对证书明文先hash(私钥加密很慢 hash后为固定长度 传输快)再用私钥加密得到签名,明文和数字签名 共同组成了数字证书。浏览器验证过程:拿到证书得到明文T,数字签名S,用CA机构的公钥对S解密得到S’,用证书里说明的hash算法对明文T进行hash得到 T’,若S’=T’则证书可信。

常见的hash MD5 除了可以加密,由于算法后得到固定的值,如用md5算法hash后可以得到固定的128位的值,这样加密解密就会快很多。

OSI七层网络模型太复杂,TCP/IP概念层常用:分为应用层-HTTP FTP SMTP DNS,传输层-TCP/UDP,网络层-IP,网络接口-。IP协议主要解决网络路由和寻址问题,TCP 协议主要解决如何在 IP 层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。

CDN实现原理:基于UDP。选择就近服务器请求资源是因为下面DNS解析时,访问到权威服务器他会就近原则返回就近的IP。总结:通过权威 dns 服务器来实现优质节点的选择,通过缓存来减少源站的压力。

DNS域名解析:本地缓存(浏览器 主机)-运营商DNS(本地local DNS)-域名一次从左往右域名对于www.taobao.com.,先去问负责。的根域名服务器 .com。。。返回ip-localDNS缓存并回复浏览器

cookie和session和token的关系:cookie自动放在每次的http 所以适合存放必须传的数据如身份信息 大小4k 可设置过期expires;session存在服务器,session_id存在cookie,较安全
token和cookie相似 登录后服务器返回给浏览器 再次访问放到headers中 可以防止攻击,与cookie区别:不会自动添加至headers且攻击者无法访问到token。保证cookie安全设置HttpOnly,js就访问不到。
session为什么更安全:第一先要攻破cookie 登录后cookie才有sessionID 而且加密 第二次访问第一次的就没用了
session是抽象概念,大家把每次的连接成为会话,而cookie是存在header里的。

常见攻击技术:XSS-注入js脚本获取cookie(过滤用户输入的特殊字符 cookie设置httponly)。DDoS:黑客通过向插件注入恶意代码,把你的机子当做傀儡机去不间断的请求另一个网页, 解决-引入第三方库时在页面写上hash值,若被劫持则与开发者写的hash值不一致。

tcp为什么比udp安全:TCP面向连接 三次握手四次挥手 传输中间有确认号 重传机制等多种机制保证数据正确到达。UDP:无连接,只是简单的把数据丢进网络

TCP粘包问题(数据的无边界性):客户端发送的多个数据包被当做一个数据包接收。也称数据的无边界性,read/recv函数不知道数据包的开始或结束标志,因为也没有任何开始或结束标志,只把它们当做连续的数据流来处理。

ajax(Asynchronous JavaScript And XML异步js和XML 这俩个都是语言)原理:获取数据后通过js操作DOM,DOM相当于人体的骨架。

web框架的底层协议:WSGI协议:定义一种server与application如何通信的规范,主要是解耦,WSGI server 负责从客户端接收请求,将 request 转发给 application,将 application 返回的 response 返回给客户端,WSGI application 接收由 server 转发的 request,处理请求,并将处理结果返回给 server。uWSGI和Gunicorn都是实现了WSGI server协议的服务器,Django,Flask 是实现了 WSGI application 协议的web框架,可以根据项目实际情况搭配使用。Django flask也实现了简单的 WSGI server用于调试,线上一定要用WSGI server。
uwsgi:与WSGI一样是一种通信协议,是uWSGI服务器的独占协议,用于定义传输信息的类型。
uWSGI:实现了WSGI协议、uwsgi协议、http协议等。属于应用服务器-处理动态资源,另外一种web服务器-只处理静态资源http协议 发送静态页面 如nginx

django:生命周期:用户输入URL,浏览器生成请求头请求体发给服务端,如果有nginx,处理后转给后台,经过django的wsgi,到中间件,映射路由表,匹配一条转给视图函数,逻辑处理后返回结果给前端,渲染呈现。
五个中间件:请求进来前-IP拦截,执行views前-修改请求,用render前,view抛异常前,view执行完准备返回前端前-修改。黑白名单,csrf,缓存,判断登录
FBV-基于函数,url匹配对应函数。CBV-基于类,请求包含url和method,url匹配后走dispatch反射找到类对应的方法执行。
orm:可执行SQL的:extra、raw、自定义SQL。F:操作数据中的某列,如可以给这列值加值。Q:复杂查询,支持& | ~not
django-csrf:全局中间件配置,亦可用装饰器,表单提交时要加入{%csrf%}。django-缓存:settings配置,可视图缓存,中间件全部缓存。
csrf:跨站请求伪造,先访问正常网站A获得A信任,再访问攻击网站B,B可能会在用户不知情下访问A,由于同域名可带上cookie,认证通过请求伪造。解决:1、检测请求来源-referer2、表单中加入token
懒加载:QuerySet被构造,过滤,切片,做为参数传递,都没查询数据库,后面的会:循环,切片,len,list,序列化
HttpResponse-传字符串。render-request、HTML文件、数据参数(字典 显示在前端的模板语言)。redirect(HttpResponseRedirect 类似)-调到指定的URL。reverse-指定处理函数。
路由中的name相当于给URL起个别名,如果用的是name,修改URL也没关系。

RESTful API设计:全称 资源表现层状态转化。规范:URI不能有动词用名词且是复数 资源具体操作类型用动词 协议用https 版本放入url,也可放入头信息 请求的无状态 资源描述-MIME 多级缓存:从浏览器(私有共有都有)-代理服务器-缓存服务器-应用服务器。如:https://developer.github.com/v3/pulls/reviews/ https://developer.linkedin.com/zh-cn/docs/rest-api
幂等性:其任意多次执行对资源本身所产生的影响均与一次执行的影响相同-主要是对系统内部(如System.getCPULoad(),返回值虽不一样,但幂等),不考虑网络。用在支付/交易-订单只能是一个,支付只能扣一次钱。注:patch不是幂等,http是。幂等承诺只要调用接口成功,外部多次调用对系统

Zookeeper:分布式协调服务。因为是在内存中,so每个节点最大存储1M。持久节点和临时节点

项目中作用:作为服务生产者和服务消费者的注册中心,去config写,执行返回至output。提供了文件系统和通知机制。

zookeeper原理和适用场景:其实只有俩个功能:1、读写2、watch。数据存在内存中,所以高吞吐量和低延迟。主备模式:Leader-发起投票更新系统状态、Follower-参与投票和Observer-拓展系统 提高读取速度,过半写成功策略

zookeeper watch机制

redis/zk节点宕机如何处理

消息中间件是如何实现的,技术难点有哪些:作用-应用解耦,异步消息,流量削锋。

celery:任务生产者,交给任务队列处理 任务调度器-独立进程,自带的任务生产者,读取配置文件 任务代理-作为消息队列,可为Redis 任务消费者-

堆 栈

硬链接和软连接区别:Linux里文件分为用户数据(即文件数据块,记录真实数据)和元数据(文件附加属性 大小 创建者 时间),元数据中的i-node号才是文件的唯一标识而非文件名,所以文件打开顺序是
filename=>i-node=>data block。若一个inode对应多个文件名,则这些文件称为硬链接,换言之硬链接就是同一个文件使用了多个别名,特点:文件有相同的inode data block,只能对已存在的文件创建,不
可对目录创建,删除一个不会影响别的。若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件是软连接,软连接是一个数据块特殊的普通文件。特点:它有自己的inode 文件属性 权限等,可
对不存在的文件和目录创建,删除软连接不影响被指向的文件,但删除源文件,则这些链接称为死链接。

发现磁盘空间不够,如何快速找出占用空间最大的文件? du -sh:当前目录大小 du –max-depth=1 -h: find . -type f -size +100M

文件描述符表:内核为每个进程维护一个,表中记录单个文件描述符的相关信息,包括:控制标志-目前内核仅定义了一个close-on-exec 打开文件描述指针-指向打开文件表的地址。
打开文件表:全称打开文件描述表,表中条目为打开文件描述体,存储与一个文件打开的全部信息。包括:文件偏移量-调用read/write更新 访问模式-只读只写或读写追加覆盖 i-node-对象指针
i-node表:每个文件系统会为存储于其上的所有文件/目录维护一个i-node表,表中包括:文件类型-常规文件、目录、套接字 时间戳-创建更新时间等 访问权限 文件锁列表 文件大小等等

同步异步:指代码调用IO操作时,必须等待or不必等待操作完成才返回的调用方式。异步需要多线程、多CPU或非阻塞IO支持。同步IO必然是阻塞IO,异步IO必然是非阻塞IO。
阻塞非阻塞:指调用线程进程会不会被操作系统挂起。
总结:同步异步关注消息通信机制-同步主动等待调用结果并自己写读写数据,异步是调用发起后就返回,且没结果,有结果后通过回调函数来处理这个调用,由操作系统自己来读写数据。阻塞非阻塞关注程序在等待调用结果时的状态-阻塞是在得到结果前当前线程会被挂起,非阻塞在没得到结果前不会阻塞当前线程(但会时不时的check是否有结果返回)。
阻塞非阻塞是从线程角度看的-请求不能立即回答且要等待就是阻塞,否则是非阻塞。同步异步表示一种协作方式或者是进程之间的合作方式,按甲方请求一次乙方应答一次属于同步(同步IO中对同一个描述符的操作必须是有序的)。而甲方有需要就请求不管上次乙方是否应答,即请求应答不需要一致进行,这种是异步。同步是线性的,异步是并发的。
同步异步&阻塞非阻塞属于俩个范畴,异步不分阻塞非阻塞

响应时间:一个请求从开始到结束的时间。吞吐量:单位时间内系统能处理的请求数量,常用性能指标。QPS-每秒查询数,QPS = 并发数 / 平均响应时间。 TPS-每秒事务数 吞吐量常用指标 HPS-每秒HTTP数

kill用法,某个进程杀不掉的原因(进入内核态,忽略kill信号)

linux命令:scp-远程拷贝文件 scp 文件名 账号@remote_ip:目标路径,完毕需要输入密码。> & >>:覆盖&追加写入。抓包-tcpdump -i echo host and port网卡。Windows findstr=prep。
top看CPU free看内存。find 路径 -name/size/ 。tar xvf解包 cvf打包。history | grep zk-查看关于zk的历史命令。chmod 777 file_name文件主 其他 组成员。netstat -ano | grep port-查看端口占用。
cat xxx|less;ps -ef|grep zk kill-9。make 编译 make install-安装编译好的源码包。sudu apt-get install yum -y install/update。df -h磁盘剩余。tab 补全命令。
if test `find path -size -3k`; then cat path; else echo 'file too big' ; fi:if 要对应 fi,test检测某个条件是否成立。
Linux上查看日志:less:比more强大 可以向前翻页 Shift+G到达文件底部 再通过?+关键字的方式来根据关键来搜索信息 grep的方式查关键字
vim:u撤回 Ctrl+r恢复撤销 删除文本:x dd 5dd 复制粘贴:yy。tail -f。awk:grep出来 +这个选择列数 重定向到一个文本。free -h 。 curl 可以get post。
crontab:可以定时执行一个脚本,如果逻辑简单,可直接写入任务(-e 写入 -l 列出当前任务 -r 终止任务)

git:工作区 暂存区 本地仓库 远程仓库。git pull = fetch(下载远程仓库的变动至本地仓库)+merge(合并制定分支至当前分支)。git branch新建 -b新建并切换至该分支。status log。
git rebase:替代merge的操作,对多个commit合并,减少分支合并的记录。git reset-修改.git里的东西。

IO多路复用:select-在一个进程打开的FD有限,默认2048,去轮询每个FD是否准备好。epoll-FD没限制,采取事件的通知机制,一旦某个FD好了内核采取callback的机制。

布隆过滤器:一个很长的二进制向量和一系列随机映射函数 用于检索一个元素是否在一个集合中 优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难(hash碰撞 可以多次hash减少碰撞)。

正向代理(客户端代理)和反向代理(服务器端代理)

nginx:1、静态代理2、负载均衡:轮询 加权轮询-服务器性能不一 ip_hash(IP不变 每次都由一个机器处理) 随机 最小连接法(动态选择当前连接最少的处理) ***Sticky:session粘滞(分发和识别cookie 让同一个机器处理请求 默认标识名为route 需要增加nginx-sticky-module模块 设置:upstream字典里设置 sticky [name=route][domain=.foo.bar][path=/][expires=1h][hash=index|md5|sha1][no_fallback][secure] [httponly];)
3、限流:参数设置请求每秒不超过100个4、缓存:浏览器静态资源用expire 代理层缓存 5、黑白名单
原理:接受到一个http请求根据配置映射到响应模块。HTTP Request=>nginx core=>handler负责处理请求 生成相应内容=>filter1处理相应内容=>filter2=>n=>HTTP response

docker:一层一层的被封装,镜像(只可读)是初始,加一层变容器(最上一层可读可写),再加进程隔离空间。docker仓库是存放镜像的 docker run = create+start 相当于git pull = fetch+merge

什么是守护线程?有什么用?

上下文切换是什么含义:上下文管理器-含有__enter__和__exit__方法的对象

负载均衡为什么用到redis master和worker属于负载均衡?

gc垃圾处理:1、引用计数 会引起循环引用 so产生下面俩个方法:1、标记清除算法:用图论理解不可达理论2、分代收集

多线程、多进程、协程

threading.Thread(target=):方法:在线程开始(thread.start())之前,调用setDeamon(True)函数,设定线程的daemon标志,表明该线程不重要,主线程退出它就退出。start()开始线程活动 run()调用target join()等待,直到线程终结。

常用魔法方法:call-对象可call, init-对象实例化先new再init new-对象的创建,必须有返回值,返回实例化出的实例,一般调用object.new

Python dict:hash算法实现,会留三分之一空的,多了则扩容。若hash碰撞,Python采取开放寻址法(用不同的hash重新计算)即空间换时间 或者是一个链表,直到找到的key是需要的

hash算法:俩条件:对于输入的值会有固定长度输出 不同的输入可能输出一样

Python sort是在原位置排序 sorted是返回一个新列表,对原列表无影响

计算机英文单词准备,django https://blog.csdn.net/hairetz/article/details/4141043


PostgreSQL:相比较MySQL,没那么多坑,后者对text有限制,前者text都能存,后者可重复读隔离级别不能阻止并发还需要加锁,前者有隐藏的乐观锁version。前者数据类型丰富,可用字典、数组。
scrapy numpy pandas

posted @ 2019-08-07 22:45  长安某~  阅读(168)  评论(0编辑  收藏  举报