学习python挺久了根据主要百度的面试题总结了一下面试可能问到的知识点,总之还差很多很多...还需要不断地添加修正。如果有大神看了评论、点赞一下给我一点信心。
需求:(memcached)
缓存架构:
缓存数据:
缓存保存形式:
缓存有效期:
内存淘汰策略:
缓存使用模式:
先更新数据库,在存入缓存。
缓存穿透:
缓存雪崩:
+++
自己封装的简单动态字符串(SDS),不用c的字符串:
len总长度,free剩余长度,buf当前字符串
C字符串 | SDS |
---|---|
获取字符串长度的复杂度为O(N) | 获取字符串长度的复杂度为O(1) |
API 是不安全的,可能会造成缓冲区溢出 | API 是安全的,不会造成缓冲区溢出 |
修改字符串长度N次必然需要执行N次内存重分配 | 修改字符串长度N次最多执行N次内存重分配 |
只能保存文本数据 | 可以保存二进制数据和文本文数据 |
可以使用所有 |
可以使用一部分 |
哈希表(字典/符号表):
跳跃表(链表和节点组成,有序集合/集群节点):
节点:
1、层:level 数组可以包含多个元素,每个元素都包含一个指向其他节点的指针。
2、前进指针:用于指向表尾方向的前进指针
3、跨度:用于记录两个节点之间的距离
4、后退指针:用于从表尾向表头方向访问节点
5、分值和成员:跳跃表中的所有节点都按分值从小到大排序。成员对象指向一个字符串,这个字符串对象保存着一个SDS值
整数集合:为全是数字且数据量小的集合的底层实现,由数组实现。
压缩列表:是列表和哈希的底层之一
链表:列表的底层之一
B-tree是多叉平衡查找树(多分支):
B±tree(取消指针,底部指针连接【根据顺序】):
B-tree(非根和非叶子结点再增加指向兄弟的指针):*
三树区别:
B树:有序数组+平衡多叉树;
B+树:有序数组链表+平衡多叉树;
B*树:一棵丰满的B+树。
B树必须用中序遍历的方法按序扫库,而B+树直接从叶子结点扫就可以,B+树支持range-query非常方便,而B树不支持。
B树也好B+树也好,根或者上面几层因为被反复query,所以这几块基本都在内存中,不会出现读磁盘IO,一般已启动的时候,就会主动换入内存。
+++
os,time,random,pymysql,threading,multiprocessing,queue,django,flask,requests,virtualenv,selenium,scapy,xadmin,celery,re,hashlib,md5
###init和new的区别:
rnadom.random():生成0-1之间的随机浮点数
rnadom.uniform(a,b):生成a,b见的浮点数
rnadom.randint(a,b):生成a,b见的整数
rnadom.choice(sequence):特定序列随机取数
rnadom.shuffle(list):打乱列表
detatime.data(year=,month=,day=)
(date1-date2).days
物理层(中继器(也叫放大器)和集线器):
数据链路层(帧):
传输层(IP数据报):
网络层(tcp,udp):
SYN:"synchronize"请求同步标志;;ACK:“acknowledge"确认标志”;
FIN:"Finally"结束标志。
会话层:
表示层:
应用层:
常量:大写+’_’ 私有变量:‘下划线’+小写
内置变量:前后都加双下划线
类:大驼峰命名法
###css初始化:
重设浏览器样式,防止页面差异。使得开发简洁方便,减少CSS代码量。
请求上下文保存交互数据:
应用上下文保存配置信息:
###Django过滤:
模糊查询:
空查询(字段名__usnull=False)
范围查询(字段名__in=【】)
比较查询(gt大于lt小于加e包含等于)
查询不满足条件的数据:
F对象(类属性之间的比较):需要导入
from django.db.models import F
对象.objiects.filter(字段__gt=F(‘另一个字段’))
Q对象(与或非&|~)
from django.db.models import F
对象.objiects.filter(Q(字段__gt=30)&Q(字段2_gt=30))
对象.objiects.filter(Q(字段__gt=30)|Q(字段2_gt=30))
对象.objiects.filter(~Q(字段__gt=30))
聚合函数:
from django.db.models import Sum.Count.Max,Min,Avg
对象.objiects.aggregate(Sum(字段__gt=30))
对象.objiects.aggregate(Sum(字段__gt=30)).count()
def __init__(): #初始化,不需要参数,只在服务器第一个响应执行
def process_reuqest():每个请求之前
def process_view():每个视图之前
def process_template_response():渲染模板前
def process_response():响应返回浏览器之前
def process_exception():视图出现异常是
特征值+目标值
nginx:
apache:
####查询集的特性:惰性执行,缓存。
ioloop&iosteram前者封装了高效io事件循环,后封装了无阻塞的soket,可以达到高效异步请求。
class TreeNode(object):
def __init__(self,left=None,right=None,value=None)
self.value = value
self.left = left
self.right = right
def preorder(root):
if value is None:
return
else:
print(root.value)
preorder(root.left)
preorder(root.right)
def two_search(alist,item):
n = len(alist)
if n == 0:
return False
mid = n // 2
if alist[mid] == item:
return True
elif alist[mid] > item:
return two_search( alist[:mid],item)
else:
return two_search( alist[mid+1:],item)
def quick_sort(alist):
if len(alist) < 2 and not alist:
return alist
a = 0
b = alist[0]
llist = [alist[i] for i in range(1, len(alist)) if alist[i] <= b]
rlist = [alist[i] for i in range(1, len(alist)) if alist[i] > b]
return quick_sort(llist) + [b] + quick_sort(rlist)
def merge_main_sort(alist):
if len(alist) <= 1:
return alist
mid = len(alist) // 2
llist = merge_main_sort(alist[:mid])
rlist = merge_main_sort(alist[mid:])
return merge_sort(llist,rlist)
def merge_sort(llist,rlist):
a = b = 0
len_a, len_b = len(llist), len(rlist)
c = []
while a < len_a and b < len_b:
if llist[a] < rlist[b]:
c.append(llist[a])
a += 1
else:
c.append(rlist[b])
b += 1
if a < len_a:
c.extend(llist[a:])
else:
c.extend(rlist[b:])
return c
进程线程协成:
云平台存储图片:
CDN:
cdn是对域名加速
CDN部署简单,对原站基本不做任何改动即可生效。
CDN因为其流量分流到各节点的原理,天然获得抵抗网络攻击的能力。
CDN采用各节点缓存的机制,网站的静态网页和图片修改后,如果CDN缓存没有做相应更新,则看到的还是旧的网页。