三月中旬一直忙到月底,项目总算告一段落,有点时间写点东西,总结下这段时间面试遇到的问题,以及看到的经典的面试题。
1. 分布式存储与传统的集中式存储优缺点
类型 | 特点 | 优点 | 缺点 |
---|---|---|---|
集中式存储 | 存储设备集中在一起管理,由单一存储甚至是 几个大型存储设备,分配存储资源给众多服务器使用,资源隔离细粒度有限。 |
1. 产品丰富,买来即用。 2. 单一性能可以堆到很高,一荣俱荣。 3. 市场成熟,商业化产品互操性、兼容性佳。 |
1. 数据处理集中,全局影响,不适合多租户 2. 烟囱式扩展. 硬件捆绑. 成本昂贵 3. 架构复杂,故障排查难度大 4. 资源捆绑. 一损俱损 5. 建设周期长,无法快速供给 |
分布式存储 | 软件定义存储,利用X86服务器本地磁盘与高 速网络结合,形成一个大的存储资源池,基于 这个资源池可以衍生多种存储类型,如对象存储, 随着节点规模越大,性能线性水平增长,特别适合大规模数据中心,多租户场景 |
1. 架构简单、扩展性极强,易于管理,自动化程度高。 2. 数据分散在不同服务器上形成冗余级数据保护。 3. 采用本地IO路径,路径更短,延迟更低。 4. 标准X86服务器和磁盘组成,低成本,采购周期短。 |
1. 需要高速低延迟网络环境 2. 需要多个以上节点组成 3. 要有一定的运维能力和自动化程度的环境 |
2. 在高并发的情况下如何提高django的处理能力(增加并发量)
-
采用nginx做负载
去掉自增主键
原因很简单,因为自增主键的存在写库存在抢锁, 可以利用全局id生成器提前生成id直接写入数据库
换成异步任务去写库
如果数据只是存在mysql中做备份,建议使用异步的方式写入库,先把数据写到缓存下发给用户,之后在利用后台异步任务一点点的写入,例如聊天系统可以这样干
换成更高效的框架或者语言
可以试试tornado, 如果tornado依然无法满足,可以尝试使用golango,毕竟golang是以高并发著称, 而且是编译语言,而且基于它的web框架也很容易上手,性能很可观,例如Iris
3. Linux处理查询编辑XXXX文件的方式
- find与locate进行查找
- grep sed awk Linux文本操作三剑客
grep命令用于查找文件里符合条件的字符串;
awk是一种处理文本文件的语言,是一个强大的文本分析工具;awk是以列为划分计数的,$0表示所有列,$1表示第一列, $2表示第二列(着重点在于筛选分析重组然后显示)
sed命令是利用script来处理文本文件(着重点在插入删除替换等编辑动作,通常也和awk常用)。
4.13更新
今天面试了一家公司,岗位是web开发,面试问题很基础但也很有质量,虽然问题都有见到过研究过,但是时间长了,有些忘却,答不到点上,多记录点
4. __init__
与__new__
区别
1.__init__
用于初始化一个类实例(initializer),比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。第一个参数是self。
2.但是__init__
其实不是实例化一个类的时候第一个被调用 的方法。当使用 Persion(name, age) 这样的表达式来实例化一个类时,最先被调用的方法 其实是__new__
方法
3.__new__
用于控制生成一个新实例的过程constructor)。它是类级别的方法。第一个参数是cls
依照Python官方文档的说法,new方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。还有就是实现自定义的metaclass。
例子:
class PositiveInteger(int):
def __new__(cls, value):
return super(PositiveInteger, cls).__new__(cls, abs(value))
i = PositiveInteger(-3)
print(i)
著名的单例模式:
class BaseController(object):
_singleton = None
def __new__(cls, *a, **k):
if not cls._singleton:
cls._singleton = object.__new__(cls, *a, **k)
return cls._singleton
5. 基础问题+之前总结的链接:
老生常谈的迭代器生成器,我竟然遗漏了yield生成器用法,惨,文章里那一张图足矣。
内存管理与垃圾回收,重点在于:变量与对象(对于全局与局部变量的拓展),内存地址(可能涉及到列表元组修改元素带来的内存地址改变以及深浅拷贝),引用计数(垃圾回收机制),del语法。
简述Python的GIL锁,参考我之前写的文章
6. django model的继承方式有哪些
这道题我空白着。惨~ 我之前只知道个抽象继承,但是也不确定要答的是不是这个。
Django 中有三种继承关系:
- 通常你只是需要一个父类来保存子类所共有的字段而避免重复的在多个子类中定义,这个父类永远不打算单独使用,这种情况你可以选择 Abstract base classes。
- 如果你要继承一个已经存在的 model,并且每个 model 都有其独立的数据表,你可以选择 Multi-table inheritance(应避免使用多表继承,因其即增加了复杂度又提高了性能开销。可以用 OneToOneField 及 ForeignKeys 来代替)。
- 如果你只想改变一个 model Python-level 的行为而不修改其字段,你可以选择 Proxy Model。
- Abstract base classes
# 典型的时间戳,给后面的model重用
# core/models.py
from django.db import models
class TimeStampedModel(models.Model):
"""
An abstract base class model that provides self-
updating ``created`` and ``modified`` fields.
"""
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
Multi-table inheritance
Proxy models
上面两个的例子参考这里,不着重写出来
7. 一些web开发偏向理论的知识
- FastCGI 与 CGI的区别,之前有比较过,但是不记得了,此篇文章下面的参考文献很重要
- Django session的运行机制,这里需要参考djang官网了(拓展到cache,cookie等,概念很杂,慢慢啃)
还有一些面向对象的知识,实例方法,属性,多重继承。不展开。总结下来:基础概念要牢固,隔三差五要回顾,可能有新领悟,真正达到温故而知新