三月中旬一直忙到月底,项目总算告一段落,有点时间写点东西,总结下这段时间面试遇到的问题,以及看到的经典的面试题。

1. 分布式存储与传统的集中式存储优缺点

类型 特点 优点 缺点
集中式存储 存储设备集中在一起管理,由单一存储甚至是
几个大型存储设备,分配存储资源给众多服务器使用,资源隔离细粒度有限。
1. 产品丰富,买来即用。
2. 单一性能可以堆到很高,一荣俱荣。
3. 市场成熟,商业化产品互操性、兼容性佳。
1. 数据处理集中,全局影响,不适合多租户
2. 烟囱式扩展. 硬件捆绑. 成本昂贵
3. 架构复杂,故障排查难度大
4. 资源捆绑. 一损俱损
5. 建设周期长,无法快速供给
分布式存储 软件定义存储,利用X86服务器本地磁盘与高
速网络结合,形成一个大的存储资源池,基于
这个资源池可以衍生多种存储类型,如对象存储,
随着节点规模越大,性能线性水平增长,特别适合大规模数据中心,多租户场景
1. 架构简单、扩展性极强,易于管理,自动化程度高。
2. 数据分散在不同服务器上形成冗余级数据保护。
3. 采用本地IO路径,路径更短,延迟更低。
4. 标准X86服务器和磁盘组成,低成本,采购周期短。
1. 需要高速低延迟网络环境
2. 需要多个以上节点组成
3. 要有一定的运维能力和自动化程度的环境

2. 在高并发的情况下如何提高django的处理能力(增加并发量)

  • 采用nginx做负载


    image
  • 去掉自增主键
    原因很简单,因为自增主键的存在写库存在抢锁, 可以利用全局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 中有三种继承关系:

  1. 通常你只是需要一个父类来保存子类所共有的字段而避免重复的在多个子类中定义,这个父类永远不打算单独使用,这种情况你可以选择 Abstract base classes。
  2. 如果你要继承一个已经存在的 model,并且每个 model 都有其独立的数据表,你可以选择 Multi-table inheritance(应避免使用多表继承,因其即增加了复杂度又提高了性能开销。可以用 OneToOneField 及 ForeignKeys 来代替)。
  3. 如果你只想改变一个 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

7. 一些web开发偏向理论的知识

还有一些面向对象的知识,实例方法,属性,多重继承。不展开。总结下来:基础概念要牢固,隔三差五要回顾,可能有新领悟,真正达到温故而知新

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,237评论 2 33
  • 最近这段时间忙忘记了总结自己的所得以及所获了,由于为年后工作座准备今天看了看多线程,那么下面为大家带来我的所感及所...
    fc4e54758f8d阅读 1,196评论 2 14
  • 1.创建文件夹 !/bin/sh mkdir -m 777 "%%1" 2.创建文件 !/bin/sh touch...
    BigJeffWang阅读 10,191评论 3 53
  • 最近被朋友问到的问题,总结了一下问题分享出来(鶸的分享通常都是一本正经地胡说八道😂),问题之间基本上没什么关联,也...
    Delpan阅读 1,979评论 16 33
  • 你有没有过特别恐惧的时候,突如其来,不知所措。 我有着一个一直存在的恐惧,我害怕黑暗,害怕夜晚的宁静,以至于对睡觉...
    紫沐語阅读 163评论 0 1