面试题

一、Python

1. new.__init__区别,如何实现单例模式,有什么优点

__new__是一个静态方法,__init__是一个实例方法
__new__返回一个创建的实例,__init__什么都不返回
__new__返回一个cls的实例时后面的__init__才能被调用
当创建一个新实例时调用__new__,初始化一个实例时调用__init__

2. 深浅拷贝

浅拷贝只是增加了一个指针指向一个存在的地址,而深拷贝是增加一个指针并且开辟了新的内存,这个增加的指针指向这个新的内存,采用浅拷贝的情况,释放内存,会释放同一内存,深拷贝就不会出现释放同一内存的错误

3. 装饰器

调用装饰器其实是一个闭包函数,为其他函数添加附加功能,不修改被修改的源代码和不修改被修饰的方式,装饰器的返回值也是一个函数对象。
比如:插入日志、性能测试、事物处理、缓存、权限验证等,有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。

4. 闭包

1.必须有一个内嵌函数
   2.内嵌函数必须引用外部函数的变量(该函数包含对外作用域而不是全局作用域名字的引用)
   3.外部函数的返回值必须是内嵌函数

5. 迭代器与生成器

​ 迭代可迭代对象对应_iter_(方法)和迭代器对应_next_(方法)的一个过程
​ 生成器:包括含有yield这个关键字,生成器也是迭代器,调动next把函数变成迭代器。

6.classmethod,staticmethod,property

类方法:将类的函数转换成类方法,函数上装饰@classmethod会将函数的自动传值参数改成cls
静态方法:此方法相当于给类扩展一个功能,将类内的函数实例化,给类或对象使用,此时类内的函数就是普通函数,不管是类还是实例化的对象都可以使用
实例化:类的实例化就会产生一个实例(对象),可以理解为类()把虚拟的东西实例化,得到具体存在的值

‍7.多进程,多线程,协程,GIL

​ GIL:全局解释器锁,是锁在cpython解释器上,导致同一时刻,同一进程只能有一个线程被执行
​ 多进程:多进程模块multiprocessing来实现,cpu密集型,IO计算型可以用多进程
​ 多线程:多线程模块threading来实现,IO密集型,多线程可以提高效率
​ 协程:依赖于geenlet,对于多线程应用。cpu通过切片的方式来切换线程间的执行,遇到IO操作自动切换,线程切换时需要耗时,
​ 而协成好处没有切换的消耗,没有锁定概念。
​ 进程:是资源管理单位,进行是相互独立的,实现并发和并发
​ 线程:是最小的执行单位,线程的出现为了降低上下文切换的消耗,提供系统的并发性

8.IO多路复用/异步非阻塞

​ IO多路复用:通过一种机制,可以监听多个描述符 select/poll/epoll
​ select:连接数受限,查找配对速度慢,数据由内核拷贝到用户态
​ poll:改善了连接数,但是还是查找配对速度慢,数据由内核拷贝到用户态
​ epoll:epoll是linux下多路复用IO接口,是select/poll的增强版,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率
​ 异步非阻塞:异步体现在回调上,回调就是有消息返回时告知一声儿进程进行处理。非阻塞就是不等待,不需要进程等待下去,继续执行其他操作,不管其他进程的状态。

9.PEP8规范,规范的好处是什么?

1.缩进:4个空实现缩进,尽量不使用Tab
2.行:没行最大长度不超过79,换行可以使用反斜杠
3.命名规范:
4.注释规范:

10.range-and-xrange

都在循环时使用,xrange内存性能更好,xrange用法与range完全相同,range一个生成list对象,xrange是生成器

11.with上下文机制原理

 _enter_和_exit_,上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象类中声明_enter_和_exit_方法,使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须收到干预

12.经典类、新式类

​ 经典类遵循:深度优先,python2中
​ 新式类遵循:广度优先,Python3中

13.有没有一个工具可以帮助查找Python的bug和进行静态的代码分析?

PyChecker是一个Python代码的静态分析工具,它可以帮助查找Python代码的bug,会对代码的复杂度和格式提出警告,Pylint是另外一个工具可以进行codingstandard检查

14.Python是如何进行内存管理的

1.对象引用计数:
引用计数增加的情况:
来保持追踪内存中的对象,所有对象都用引用计数,一个对象分配一个新名称
将其放入一个容器中(列表,字典,元祖)
引用计数减少的情况:
使用del语句对对象别名显示的销毁
引用超出作用域或被重新赋值
sys.getrefcount()函数可以获得对象的当前引用计数
2.标记-清除机制

3.分代技术

15.什么是python?使用python有什么好处?

python是一种编程语言,它有对象、模块、线程、异常处理和自动内存管理。它简洁,简单、方便、容易扩展、有许多自带的数据结果,而且它开源

16.什么是pickling和unpickling?

Pickle模块读入任何python对象,将它们转换成字符串,然后使用dump函数将其转储到一个文件中——这个过程叫做pickling反之从存储的字符串文件中提取原始python对象的过程,叫做unpickling

17.python是如何被解释的?

Python是一种解释性语言,它的源代码可以直接运行,Python解释器会将源代码转换成中间语言,之后再翻译成机器码再执行

18.数组和元祖之间的区别是什么?

数组和元祖之间的区别:数组内容可以被修改,而元祖内容是只读的,不可被修改的,另外元祖可以被哈希,比如作为字典的key

19.参数按值传递和引用传递是怎么实现的?

python中的一切都是类,所有的变量都是一个对象的引用。引用的值是由函数确定的,因此无法被改变,但是如果一个对象是可以被修改的,你可以改动对象

20.Python都有哪些自带的数据结构?

Python自带的数据结构分为可变和不可变的:可变的有:数组、集合、字典,不可变的是:字符串、元祖、整数

21.什么是python的命名空间?

在python中,所有的名字都存在于一个空间中,它们在改空间中存在和被操作——这就是命名空间,它就好像一个盒子,在每个变量名字都对应装着一个对象,当查询变量的时候,会从该盒子里面寻找相应的对象

22.python中的unittest是什么?

在python中,unittest是python中的单元测试框架,它拥有支持共享搭建、自动测试、在测试中暂停代码、将不同测试迭代成一组

23.*args与**kwargs

*args代表位置参数,它会接收任意多个参数并把这些参数作为元祖传递给函数。**kwargs代表的关键字参数,返回的是字典,位置参数一定要放在关键字前面

24. 在Python中什么是slicing?

slicing是一种在有序的对象类型中(数组、元祖、字符串)节选某一段的语法

25.Python中的docstring是什么?

Python中文档字符串被称为docstring,它在Python中的作用是为函数、模块和类注释生成文档

26. os与sys区别:

os是模块负责程序与操作系统的交互,提供了访问操作系统底层的接口
sys模块是负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控Python时运行的环境

27. 实现一个单例模式

_new_()在 _init_()之前被调用,用于生成实例对象。利用这个方法和类的属性的特点可以实现设计模式的单例模式。
单例模式是指创建唯一对象,单例模式设计的类只能实例,实例化1个对象
class Singleton(object):
__instance=None
def __init__(self):
	pass
def __new__(cls, *args, **kwargs):
	if Singleton.__instance is None:
		Singleton.__instance=object.__new__(cls,*args,**kwargs)
		return Singleton.__instance

二、Linux

1. 常用的Linux命令

Ln ls apt-get vim ifconfig rm mkdir where mv cp find tar/wget deb

三、Django和flask

1.Django 和flask的区别

Django功能大而全,Flask只包含基本的配置 Django的一站式解决的思路,能让开发者不用在开发之前就在选择应用的基础设施上花费大量时间。Django有模板,表单,路由,认证,基本的数据库管理等等内建功能。与之相反,Flask只是一个内核,默认依赖于两个外部库: Jinja2 模板引擎和 Werkzeug WSGI 工具集,其他很多功能都是以扩展的形式进行嵌入使用。

Flask 比 Django 更灵活 用Flask来构建应用之前,选择组件的时候会给开发者带来更多的灵活性 ,可能有的应用场景不适合使用一个标准的ORM(Object-Relational Mapping 对象关联映射),或者需要与不同的工作流和模板系统交互

2.中间件

中间件一般做认证或批量请求处理,django中的中间件,其实是一个类,在请求和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法,如请求过来 执行process_request, view,process_response方法

3.Django、Tornado、Flask各自的优势

Django:Django无socket,django的目的是简便,快速开发,并遵循MVC设计,多个组件可以很方便的以“插件”形式服务于整个框架,
django有许多功能强大的第三方插件。django具有很强的可扩展性。
Tornado:它是非阻塞式服务器,而且速度相当快,得力于其非阻塞的方式和对epoll的运用,Future对象,缺点:没有session,需要自定制
Flask:是一个微型的web框架,配合SQLALchemy来使用,jinja2模板, werkzeug接口

4.django版本,Python版本,linux版本

​ django:1.11
​ Python:3.5
​ linux:6.8

5.django的template的注释是什么样子的

​ 单行:{#注释#}
​ 多行注释:{%comment%}

6.django怎么弄并发的

nginx+uwsig为django提供高并发,nginx的并发能力超过,单台并发能力过完,在纯静态的web服务中更是突出其优越的地方,由于底层使用epoll异步IO模型进行处理。

7.tornodo的ioloop知道是什么吗?

事件循环

8.select_related和prefetch_related,Q和F

​ select_related:一对多使用,查询主动做连表
​ prefetch_related:多对多或者一对多的时候使用,不做连表,做多次查询
​ Q:用于构造复杂查询条件
​ F:更新时用于获取原来的值,专门取对象中某一列进行操作

9.什么是ORM?

​ ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间做一个映射
​ ORM优缺点:
​ 优点:摆脱复杂的SQL操作,适应快速开发,让数据结果变得简单,数据库迁移成本更低
​ 缺点:性能较差,不适用于大型应用,复杂的SQL操作还需要通过SQL语句实现

10.CORS跨域资源共享

首先会发送"预检"opption",请求,如果"预检"成功,则发送真实数据。

11.Django的Form主要具有以下功能?

生成HTMl标签,验证用户数据 is_vaild,HTML Form提交保留上次提交数据,初始化页面显示内容

12.CBV和FBV

CBV在指定的类上面加上装饰器或在此方法上面添加装饰器 @method_decorator,并继承view

13.cookie及session

​ cookie:是保留在客户端上面的一组键值对,cookie不是很安全,别人可以分析存放在本地的cookie
​ session:是保存在服务器上面的一组键值对,依赖与cookie,安全指数比cookie高

14.django的请求生命周期

请求来了先到uwsgi,把请求做一部分分装给django框架,然后经过所有的中间件,路由,视图,视图处理再返回给中间件,中间件在返回给uwsgi,在返回给用户。

15.uwsgi和wsgi

​ wsgi:是web服务器网关接口,是pyhton应用程序或框架和web服务器之间的一种接口,其广泛使用的是django框架。
​ uwsgi:是一个web服务器,它实现了wsgi协议,Nginx中HttpUwsgiModule的作用是与Uwsgi服务器进行交换

16.解释下django - debug -toolbar的使用

使用django开发站点时,可以使用django-debug-toolbar来进行调试,在settings.py中添加 'debug—toolbar.midleware.Debug ToolbarMiddleware’到项目的MIDDLEWARE_CLASSES内。

四、数据库

说一下 MySQL 数据库存储的原理?

答案: 过程是一个可编程的函数,它在数据库中创建并保存。 它可以有 SQL 语句和一些特殊的控制结构组成。当希望在不同的应用 程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非 常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的 模拟。它允许控制数据的访问方式。存储过程通常有以下优点: 1)存储 能实现较快的执行速度。 2)存储过程允许标准组件是编程。 3)存储过程可以用流控制语句编写,有很强的灵活性,可以完成 复杂的判断和较复杂的运算。 4)存储 可被作为一种安全机制来充分利用。 5)存储过程能过减少网络流量。

事务的特性

答:

1、原子性:事务中的全部操作在数据库中是不 可分割的,要么全部完成,要么均不执行。

2、一致性:几个并行执行的事务,其执行结果必 须与按某一顺序串行执行的结果相一致。

3、隔离性:事务的执行不受其他事务的干扰,事务 执行的中间结果对其他事务必须是透明的。

4、持久性:对于任意已提交事务,系统必须保证该 事务对数据库的改变不被丢失,即使数据库出现故障

readis 和 mysql 的区别

readis 是内存数据库,数据保存在内存中,速度快。

mysql 是关系型数据库,持久化存储,存放在磁盘里面,功能强 大。检索的话,会涉及到一定的 IO,数据访问也就慢。

redis 受攻击怎么办?

主从

持久化存储

Redis 不以 root 账户启动

设置复杂密码

不允许 key 方式登录

MongoDB

MongoDB 是一个面向文档的数据库系统。使用 C++编写,不支持 SQL,但有自己功能强大的查询语法。 MongoDB 使用 BSON 作为数据存储和传输的格式。BSON 是一种类 似 JSON 的二进制序列化文档,支持嵌套对象和数组。 MongoDB 很像 MySQL,document 对应 MySQL 的 row,collection 对应 MySQL 的 table 应用场景: 1.网站数据:mongo 非常适合实时的插入,更新与查询,并具 备网站实时数据存储所需的复制及高度伸缩性。 2.缓存:由于性能很高,mongo 也适合作为信息基础设施的缓 存层。在系统重启之后,由 mongo 搭建的持久化缓存可以避免下层的 数据源过载。 3.大尺寸、低价值的数据:使用传统的关系数据库存储一些数 据时可能会比较贵,在此之前,很多程序员往往会选择传统的文件进 行存储。 4.高伸缩性的场景:mongo 非常适合由数十或者数百台服务器 组成的数据库。 5.用于对象及 JSON 数据的存储:mongo 的 BSON 数据格式非常 适合文档格式化的存储及查询。 6.重要数据:mysql,一般数据:mongodb,临时数据:memcache 7.对于关系数据表而言,mongodb 是提供了一个更快速的视图 view;而对于 PHP 程序而言,mongodb 可以作为一个持久化的数组来 使用,并且这个持久化的数组还可以支持排序、条件、限制等功能。 8.将 mongodb 代替 mysql 的部分功能,主要一个思考点就是: 把 mongodb 当作 mysql 的一个 view(视图),view 是将表数据整合 成业务数据的关键。比如说对原始数据进行报表,那么就要先把原始 数据统计后生成 view,在对 view 进行查询和报表。 不适合的场景: a.高度事物性的系统:例如银行或会计系统。传统的关系型数 据库目前还是更适用于需要大量原子性复杂事务的应用程序。 b.传统的商业智能应用:针对特定问题的 BI 数据库会对产生 高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。 c.需要 SQL 的问题 d.重要数据,关系数据 优点:弱一致性(最终一致),更能保证用户的访问速度 文档结构的存储方式,能够更便捷的获取数 内置 GridFS,高效存储二进制大对象 (比如照片和视频) 支持复制集、主备、互为主备、自动分片等特性 动态查询 全索引支持,扩展到内部对象和内嵌数组 缺点:不支持事务 MongoDB 占用空间过大 维护工具不够成熟

Mysql 和 redis 高可用性

MySQL Replication 是 MySQL 官方提供的主从同步方案,用于将 一个 MySQL 实例的数据,同步到另一个实例中。Replication 为保证 数据安全做了重要的保证,也是现在运用最广的 MySQL 容灾方案。 Replication 用两个或以上的实例搭建了 MySQL 主从复制集群,提供 单点写入,多点读取的服务,实现了读的 scale out. Sentinel 是 Redis 官方为集群提供的高可用解决方案。 在实际 项目中可以使用 sentinel 去做 redis 自动故障转移,减少人工介入 的工作量。另外 sentinel 也给客户端提供了监控消息的通知,这样 客户端就可根据消息类型去判断服务器的状态,去做对应的适配操作。 下面是 Sentinel 主要功能列表: Monitoring:Sentinel 持续检查集群中的 master、slave 状态, 判断是否存活。 Notification:在发现某个 redis 实例死的情况下,Sentinel 能通过 API 通知系统管理员或其他程序脚本。 Automatic failover:如果一个 master 挂掉后,sentinel 立马 启动故障转移,把某个 slave 提升为 master。其他的 slave 重新配 置指向新 master。 Configuration provider:对于客户端来说 sentinel 通知是有效可 信赖的。客户端会连接 sentinel 去请求当前 master 的地址,一旦发 生故障 sentinel 会提供新地址给客户端。

数据库索引

数据库索引,是数据库管理系统中一个排序的数据结构,以协助 快速查询、更新数据库表中数据。索引的实现通常使用 B_TREE。 B_TREE 索引加速了数据访问,因为存储引擎不会再去扫描整张表得 到需要的数据;相反,它从根节点开始,根节点保存了子节点的指针, 存储引擎会根据指针快速寻找数据。

数据库怎么优化查询效率

1.储存引擎选择:如果数据表需要事务处理,应该考虑使用 InnoDB,因为它完全符合 ACID 特性。如果不需要事务处理,使用默 认存储引擎 MyISAM 是比较明智的

2.分表分库,主从,

3.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引

4.应尽量避免在 where 子句中对字段进行 null 值判断,否则 将导致引擎放弃使用索引而进行全表扫描

5.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将 引擎放弃使用索引而进行全表扫描

6.应尽量避免在 where 子句中使用 or 来连接条件,如果一个 字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全 表扫描 7.Update 语句,如果只更改 1、2 个字段,不要 Update 全部字 段,否则频繁调用会引起明显的性能消耗,同时带来大量日志 8.对于多张大数据量(这里几百条就算大了)的表 JOIN,要先 分页再 JOIN,否则逻辑读会很高,性能很差。

数据库优化方案

  1. 优化索引、SQL 语句、分析慢查询;

  2. 设计表的时候严格根据数据库的设计范式来设计数据库;

  3. 使用缓存,把经常访问到的数据而且不需要经常变化的数据 放在缓存中,能 节约磁盘 IO;

  4. 优化硬件;采用 SSD,使用磁盘队列技术(RAID0,RAID1,RDID5) 等;

  5. 采用 MySQL 内部自带的表分区技术,把数据分层不同的文件, 能够提高磁 盘的读取效率;

  6. 垂直分表;把一些不经常读的数据放在一张表里,节约磁盘 I/O;

  7. 主从分离读写;采用主从复制把数据库的读操作和写入操作 分离开来;

  8. 分库分表分机器(数据量特别大),主要的的原理就是数据 路由;

  9. 选择合适的表引擎,参数上的优化;

  10. 进行架构级别的缓存,静态化和分布式;

  11. 不采用全文索引;

  12. 采用更快的存储方式,例如 NoSQL 存储经常访问的数

Redis mongodb 优缺点

MongoDB 和 Redis 都是 NoSQL,采用结构型数据存储。二者在使 用场景中,存在一定的区别,这也主要由于二者在内存映射的处理过 程,持久化的处理方法不同。MongoDB 建议集群部署,更多的考虑到 集群方案,Redis 更偏重于进程顺序写入,虽然支持集群,也仅限于主-从模式.

Redis 优点: 1 读写性能优异 2 支持数据持久化,支持 AOF 和 RDB 两种持久化方式 3 支持主从复制,主机会自动将数据同步到从机,可以进行读写 分离。 4 数据结构丰富:除了支持 string 类型的 value 外还支持 string、hash、set、sortedset、list 等数据结构。 缺点: 1 Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致 前端部分读写请求失败,需要等待机器重启或者手动切换前端的 IP 才能恢复。 2 主机宕机,宕机前有部分数据未能及时同步到从机,切换 IP 后还会引入数据不一致的问题,降低了系统的可用性。 3 Redis 的主从复制采用全量复制,复制过程中主机会 fork 出 一个子进程对内存做一份快照,并将子进程的内存快照保存为文件发 送给从机,这一过程需要确保主机有足够多的空余内存。若快照文件 较大,对集群的服务能力会产生较大的影响,而且复制过程是在从机 新加入集群或者从机和主机网络断开重连时都会进行,也就是网络波 动都会造成主机和从机间的一次全量的数据复制,这对实际的系统运 营造成了不小的麻烦。 4 Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会 变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足 够的空间,这对资源造成了很大的浪费。 优点:弱一致性(最终一致),更能保证用户的访问速度 文档结构的存储方式,能够更便捷的获取数 内置 GridFS,高效存储二进制大对象 (比如照片和视频) 支持复制集、主备、互为主备、自动分片等特性 动态查询 全索引支持,扩展到内部对象和内嵌数组 缺点:不支持事务 MongoDB 占用空间过大 维护工具不够成熟

数据库负载均衡

负载均衡集群是由一组相互独立的计算机系统构成,通过常规网 络或专用网络进行连接,由路由器衔接在一起,各节点相互协作、共 同负载、均衡压力,对客户端来说,整个群集可以视为一台具有超高 性能的独立服务器。 1、实现原理 实现数据库的负载均衡技术,首先要有一个可以控制连接数据库 的控制端。在这里,它截断了数据库和程序的直接连接,由所有的程 序来访问这个中间层,然后再由中间层来访问数据库。这样,我们就 可以具体控制访问某个数据库了,然后还可以根据数据库的当前负载 采取有效的均衡策略,来调整每次连接到哪个数据库。

2、实现多据库数据同步 对于负载均衡,最重要的就是所有服务器的数据都是实时同步的。 这是一个集群所必需的,因为,如果数不据实时、不同步,那么用户 从一台服务器读出的数据,就有别于从另一台服务器读出的数据,这 是不能允许的。所以必须实现数据库的数据同步。这样,在查询的时 候就可以有多个资源,实现均衡。比较常用的方法是 Moebius for SQL Server 集群,Moebius for SQL Server 集群采用将核心程序驻留在 每个机器的数据库中的办法,这个核心程序称为 Moebius for SQL Server 中间件,主要作用是监测数据库内数据的变化并将变化的数 据同步到其他数据库中。数据同步完成后客户端才会得到响应,同步 过程是并发完成的,所以同步到多个数据库和同步到一个数据库的时 间基本相等;另外同步的过程是在事务的环境下完成的,保证了多份 数据在任何时刻数据的一致性。正因为 Moebius 中间件宿主在数据 库中的创新,让中间件不但能知道数据的变化,而且知道引起数据变 化的 SQL 语句,根据 SQL 语句的类型智能的采取不同的数据同步的策 略以保证数据同步成本的最小化。 数据条数很少,数据内容也不大,则直接同步数据 数据条数很少,但是里面包含大数据类型,比如文本,二进制数 据等,则先对数据进行压缩然后再同步,从而减少网络带宽的占用和 传输所用的时间。 数据条数很多,此时中间件会拿到造成数据变化的 SQL 语句,然 后对 SQL 语句进行解析,分析其执行计划和执行成本,并选择是同步 数据还是同步 SQL 语句到其他的数据库中。此种情况应用在对表结构 进行调整或者批量更改数据的时候非常有用。

3、优缺点 优点: (1) 扩展性强:当系统要更高数据库处理速度时,只要简单地增 加数据库服务器就 可以得到扩展。 (2) 可维护性:当某节点发生故障时,系统会自动检测故障并转 移故障节点的应用,保证数据库的持续工作。 (3) 安全性:因为数据会同步的多台服务器上,可以实现数据集 的冗余,通过多份数据来保证安全性。另外它成功地将数据库放到了 内网之中,更好地保护了数据库的安全性。 (4) 易用性:对应用来说完全透明,集群暴露出来的就是一个 IP 缺点: (1) 不能够按照 Web 服务器的处理能力分配负载。 (2) 负载均衡器(控制端)故障,会导致整个数据库系统瘫痪。

Mysql 集群操作步骤

原博客地址 Mysql 群集(Cluster)简介 MySQL 群集需要有一组计算机,每台计算机的角色可能是不一样 的。MySQL 群集中有三种节点:管理节点、数据节点和 SQL 节点。群 集中的某计算机可能是某一种节点,也可能是两种或三种节点的集合。 这三种节点只是在逻辑上的划分,所以它们不一定和物理计算机是一 一对应的关系。 管理节点(也可以称管理服务器)主要负责管理数据节点和 SQL 节点,还有群集配置文件和群集日志文件。它监控其他节点的工作状 态,能够启动、关闭或重启某个节点。其他节点从管理节点检索配置 数据,当数据节点有新事件时就把事件信息发送给管理节点并写入群 集日志。 数据节点用于存储数据。 SQL 节点跟一般的 MySQL 服务器是一样的,我们可以通过它 进行 SQL 操作。 用的 MysqlServer 已经不能满足群集的要求,配置群集需要使用 MySQLCluster。 MySQLCluster 的配置 首先找三台电脑,或者是开三个虚拟机,管理节点部署在一 台机子上,其他两台每台都部署一个数据节点和一个 SQL 节点。这里 以两台机子举例,其中一台机器 A(IP 为 192.168.193.90)部署管 理节点、数据节点和 SQL 节点,另一台机器 B(IP 为 192.168.193.50) 部署数据节点和 SQL 节点。 其实最好不要将管理节点跟数据节点部署到一台机子上, 因为如果数据节点宕机会导致管理节点也不可用,整个 MySQL 群集就 都不可用了。所以一个 MySQL 群集理想情况下至少有三台服务器,将 管理节点单独放到一台服务器上。暂以两台举例,只是为了说明三种 节点的配置启动方法。 将上面下载的安装包解压,并改文件夹名为 mysql,因为需要多 次在命令行中操作,所以名字改短后更容易输入。 配置管理节点,配置数据节点,配置 SQL 节点 启动管理节点,启动数据节点,启动 SQL 节点 测试 MySQLCluster:我们需要测试三种情况: 1.在任一 SQL 节点对数据节点进行操作后,各数据节点是否能够 实现数据同步。例如,我们在机器 A 上新创建一个数据库 myDB,然 后再建一个表 student(新建表如下命令:createtable student (id int(2)) engine=ndbcluster),插入若干数据,接着我们到机器 B 上查看是否能看到新的数据库myDB和新的表student以及插入数据。 2.当关闭任一数据节点后,在所有 SQL 节点中进行操作是否不 受其影响。例如,我们关闭机器 A 上的数据节点服务,在两台主机上 应该能够继续对数据库进行各种操作。 3.关闭某数据节点进行了数据库操作,然后重新启动,所有 SQL 节点的操作是否正常。

怎样解决海量数据的存储和访问造成系统设计瓶颈的问题?

水平切分数据库:可以降低单台机器的负载,同时最大限度的降 低了宕机造成的损失;分库降低了单点机器的负载;分表,提高了数 据操作的效率, 负载均衡策略:可以降低单台机器的访问负载,降低宕机的可能 性; 集群方案:解决了数据库宕机带来的单点数据库不能访问的问题; 读写分离策略:最大限度了提高了应用中读取数据的速度和并发 量;

MySQL 集群的优缺点

优点: a) 99.999%的高可用性 b)快速的自动失效切换 c)灵活的分布式体系结构,没有单点故障 d)高吞吐量和低延迟 e)可扩展性强,支持在线扩容 缺点: a)存在很多限制,比如:不支持外键 b)部署、管理、配置很复杂 c)占用磁盘空间大,内存大 d)备份和恢复不方便 e)重启的时候,数据节点将数据 load 到内存需要很长时间

你用的 mysql 是哪个引擎,各引擎间有什么区别

主要 MyISAM 与 InnoDB 两个引擎,其主要区别如下: 一、InnoDB 支持事务,MyISAM 不支持,这一点是非常之重要。 事务是一种高 级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还 原,而 MyISAM 就不可以了; 二、MyISAM 适合查询以及插入为主的应用,InnoDB 适合频繁修 改以及涉及到 安全性较高的应用; 三、InnoDB 支持外键,MyISAM 不支持; 四、MyISAM 是默认引擎,InnoDB 需要指定; 五、InnoDB 不支持 FULLTEXT 类型的索引; 六、InnoDB 中不保存表的行数,如 select count() from table 时,InnoDB;需要 扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出 保存好的行数即 可。注意的是,当 count()语句包含 where 条件时 MyISAM 也 需要扫描整个表; 七、对于自增长的字段,InnoDB 中必须包含只有该字段的索引, 但是在 MyISAM 表中可以和其他字段一起建立联合索引; 八、清空整个表时,InnoDB 是一行一行的删除,效率非常慢。 MyISAM 则会重 建表; 九、InnoDB 支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like ‘%lee%’

redis 基本类型、相关方法

答:Redis 支持五种数据类型:string(字符串)、hash(哈希)、 list(列表)、set(集合)及 zset(sorted set:有序集合)。 一、String String 是 Redis 最为常用的一种数据类型,String 的数据结构 为 key/value 类型,String 可以包含任何数据。 常用命令: set,get,decr,incr,mget 等 二、Hash Hash 类型可以看成是一个 key/value 都是 String 的 Map 容器。 常用命令:hget,hset,hgetall 等。 三、List List 用于存储一个有序的字符串列表,常用的操作是向队列两 端添加元素或者获得列表的某一片段。 常用命令:lpush,rpush,lpop,rpop,lrange 等 四、Set Set 可以理解为一组无序的字符集合,Set 中相同的元素是不会 重复出现的,相同的元素只保留一个。 常用命令:sadd,spop,smembers,sunion 等 五、Sorted Set(有序集合) 有序集合是在集合的基础上为每一个元素关联一个分数,Redis 通过分数为集合中的成员进行排序。 常用命令:zadd,zrange,zrem,zcard 等

redis 的事务?

Redis 事务允许一组命令在单一步骤中执行。事务有两个属性, 说明如下: 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按 顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令 请求所打断。 Redis 事务是原子的。原子意味着要么所有的命令都执行,要么 都不执行; 一个事务从开始到执行会经历以下三个阶段: 开始事务 命令入队 执行事务

redis 的使用场景有哪些?

1.取最新 N 个数据的操作 2.排行榜应用,取 TOP N 操作 3.需要精准设定过期时间的应用 4.计数器应用 5.uniq 操作,获取某段时间所有数据排重值 6.Pub/Sub 构建实时消息系统 7.构建队列系统 8.缓存

怎样结局数据库高并发的问题?

解决数据库高并发: 分表分库 数据库索引 redis 缓存数据库 读写分离 负载均衡集群:将大量的并发请求分担到多个处理节点。由于单 个处理节点的故障不影响整个服务,负载均衡集群同时也实现了高可 用性。

redis 默认端口,默认过期时间,Value 最多可以容纳的数据 长度?

默认端口:6379

默认过期时间:可以说永不过期,一般情况下,当配置中开启了超出最大内存限制就写磁盘的话,那么没有设置过期时间的 key 可能会被写到磁盘上。假如没设置,那么 REDIS 将使用 LRU 机制,将 内存中的老数据删除,并写入新数据。

Value 最多可以容纳的数据长度是:512M。

sqlserver,MySQL ,Oracle http,redis,https 默认端 口号?

sqlserver:1433

MySQL:3306

Oracle :1521

http:80

https:443

redis:6379

redis 缓存命中率计算?

Redis 提供了 INFO 这个命令,能够随时监控服务器的状态,只 用 telnet 到对应服务器的端口,执行命令即可: telnet localhost 6379 info 在输出的信息里面有这几项和缓存的状态比较有关系: keyspace_hits:14414110 keyspace_misses:3228654 used_memory:433264648 expired_keys:1333536 evicted_keys:1547380 通过计算 hits 和 miss,我们可以得到缓存的命中率:14414110 / (14414110 + 3228654) = 81% ,一个缓存失效机制,和过期时间 设计良好的系统,命中率可以做到 95%以上

redis 有多少个库?

Redis 一个实例下有 16 个库

五、数据结构与算法

桶排序(最快最简单的排序)

桶排序的基本思想是将一个数据表分割成许多 buckets,然后每
个 bucket 各自排序,或用不同的排序算法,或者递归的使用 bucket
sort 算法。也是典型的 divide-and-conquer 分而治之的策略。它是
一个分布式的排序,介于 MSD 基数排序和 LSD 基数排序之间

def bucketSort(nums):

    #选择一个最大的数
    max_num = max(nums)
    #创建一个元素全是 0 的列表, 当做桶
    bucket = [0]*(max_num+1)
    #把所有元素放入桶中, 即把对应元素个数加一
    for i in nums:
    bucket[i] += 1
    #存储排序好的元素
    sort_nums = []

    #取出桶中的元素

    for j in range(len(bucket)):
        if bucket[j] != 0:
            for y in range(bucket[j]):
                sort_nums.append(j)
			return sort_nums
nums = [5,6,3,2,1,65,2,0,8,0]
print bucketSort(nums)

1、桶排序是稳定的
2、桶排序是常见排序里最快的一种, 大多数情况下比快排还要快
3、桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法

斐波那契数列

斐波那契数列:简单地说,起始两项为 01,此后的项分别为
它的前两项之和。
def fibo(num):
numList = [0,1]
for i in range(num - 2):
numList.append(numList[-2] + numList[-1])
return numList

排序算法的分析

排序算法的稳定性:如果在对象序列中有两个对象r[i]和r[j] , 它们的排序码 k[i]==k[j] 。如果排序前后,对象 r[i]和 r[j] 的相对位置不变,则称排序算法是稳定的;否则排序算法是不稳定的。

时间开销:排序的时间开销可用算法执行中的数据比较次数与数据移动次数来衡量。算法运行时间代价的大略估算一般都按平均情况进行估算。对于那些受对象排序码序列初始排列及对象个数影响较大的,需要按最好情况和最坏情况进行估算

空间开销:算法执行时所需的附加存储。

冒泡

冒泡排序的思想: 每次比较两个相邻的元素, 如果他们的顺序错误就把他们交换位置。
def bubble_improve(l):
print l
flag = 1
for index in range(len(l) - 1, 0 , -1):
if flag:
flag = 0
3
for two_index in range(index):
if l[two_index] > l[two_index + 1]:
l[two_index], l[two_index + 1] =
l[two_index + 1], l[two_index]
flag = 1
else:
break
print l
l = [10, 20, 40, 50, 30, 60]
bubble_improve(l)

快排

快速排序使用分治法策略来把一个序列分为两个子序列。
步骤:
从数列中挑出一个元素,称为 "基准"(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元
素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个
分割结束之后,该基准就处于数列的中间位置。这个称为分割
(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值
元素的子数列排序。
def quickSort(alist,first,last):
if first<last:
splitpoint = findpos(alist,first,last)
quickSort(alist,first,splitpoint-1)
quickSort(alist,splitpoint+1,last)
def findpos(lists, low, high):
key = lists[low]
while low < high:
4
while low < high and lists[high] >= key:
high -= 1
lists[low] = lists[high]
while low < high and lists[low] <= key:
low += 1
lists[high] = lists[low]
lists[low] = key
return low
alist = [54,26,93,17,77,31,44,55,20]
quickSort(alist,0,8)
print(alist)

六、爬虫及网络编程+HTTP+UDP+TCP

1、HTTP/IP相关协议,分别位于哪层

    http协议是超文本传输协议,http协议是基于TCP/IP通信协议来传递数据

      http协议工作与c/s架构上,浏览器作为http的客户端通过URL向http服务端即web服务器发送所用请求。web服务器收到所有请求后,向客户端发送响应信息,

      http特点是短连接,无状态

    地址栏键输入URL,按下回车之后经历了什么?
    1.浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址
    2.解析出IP地址后,根据IP地址和默认端口80,和服务器建立TCP连接
    3.浏览器发出读取文件的http请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器
    4.服务器对浏览器请求做出响应,并把对应的html文件发送给浏览器
    5.释放TCP连接
    6.浏览器将该HMTL渲染并显示内容

2、TCP/UDP区别

   TCP协议是面向连接,保证高可靠性(数据无丢失,数据无失序,数据无错误,数据无重复达到)传输层协议
   UDP:数据丢失,无秩序的传输层协议(qq基于udp协议)

3、webscoket

  websocket是基于http协议的,可持续化连接
   轮询:浏览器每隔几秒就发送一次请求,询问服务器是否有新消息
   长轮询:客户端发起连接后,如果没有消息,就一直不返回response给客户端,直到有消息返回,返回完之后,客户端再次发起连接

4、RabbitMQ:

  服务器端有Erlang语言来编写,支持多种客户端,只会ajax,用于分布式系统中存储转发消息,在易用性、扩展性、高可用性的方面不俗。
  connection是RabbitMQ的socket连接,它封装了socket部分相关协议逻辑
  connectionFactroy为connection的制造工厂
  channel是我们与RabbitMQ打交道的最重要的一个接口,大部分的业务操作是在chaanel这个接口中完成,包括定义Queue、定义Exchange、
   绑定Queue与Exchange,发布消息等

5、常用的状态码

        200--服务器成功返回网页
        204--请求收到,但返回信息为空
        304--客户端已经执行了GET,但文件未变化
        400--错误请求,如语法错误
        403--无权限访问
        404--请求的页面不存在
        500--服务器产生内部错误

七、机器学习

无监督和有监督算法的区别?代表性算法有哪些?

有监督学习:对具有标记的训练样本进行学习,以尽可能对训练样本集外的数据进行分类预测。 无监督学习:对未标记的样本进行训练学习,以发现这些样本中的结构知识。

什么是线性回归、逻辑回归、朴素贝叶斯

注意:逻辑回归和朴素贝叶斯是重点,线性回归更多用于数据分析岗位。

逻辑回归要点:逻辑回归是通过sigmoid函数使损失函数达到最小或者是似然函数达到最大通过相应的优化算法求出其中的参数值实现分类。(什么优化算法:了解过梯度下降的原理实现,sklearn包里solver中有个可以设置选择哪个优化算法:lbfs、liblinear**……)**

**朴素贝叶斯要点:**贝叶斯算法是通过先验概率去得出后验概率的过程,先验即经验或者说是通过历史的大量数据得出的相关概率值,最终得到后验概率做出分类。

LR和线性回归的区别和联系?

逻辑回归以线性回归为理论支持。但线性回归模型无法做到sigmoid的非线性形式,sigmoid可以轻松处理0/1****分类问题。

逻辑回归:迭代求解

线性回归:直接求解

LR和朴素贝叶斯有什么联系和区别?为什么朴素贝叶斯如此“朴素”?

都可以处理分类问题,但是LR****是让损失函数最小求解参数值,可用于推荐,朴素贝叶斯是基于特征之间相互独立的假设,更多用于文本分类。且数据量小的时候更多用朴素贝叶斯

因为它假定所有的特征在数据集中的作用是同样重要和独立的。正如我们所知,这个假设在现实世界中是很不真实的,因此,说朴素贝叶斯真的很“朴素”

什么是梯度下降?

要点:一种优化算法,通过迭代的方式使得目标函数或损失函数最小时求解相关参数值

涉及到的梯度下降相关知识:

(1)随机梯度下降

优点:可以一定程度上解决局部最优解的问题

缺点:收敛速度较慢

(2)批量梯度下降

优点:容易陷入局部最优解

缺点:收敛速度较快

(3)mini_batch梯度下降

综合随即梯度下降和批量梯度下降的优缺点,提取的一个中和的方法。

如何处理缺失值数据:

要点:处理的方法有两种,一种是删除整行或者整列的数据,另一种则是使用其他值去填充这些缺失值。

在Pandas库,有两种很有用的函数用于处理缺失值:isnull()和dropna()函数能帮助我们找到数据中的缺失值并且删除它们。如果你想用其他值去填充这些缺失值,则可以是用fillna()函数。

什么是数据标准化,为什么要进行数据标准化?

要点:数据标准化是预处理步骤,将数据标准化到一个特定的范围。

(将该值将去平均值后再除以标准差)。

要点:数据标准化可以使得每个特征的重要性更加均衡。

如果不进行数据标准化,有些特征(值很大)将会对损失函数影响更大(就算这个特别大的特征只是改变了1%,但是他对损失函数的影响还是很大,并会使得其他值比较小的特征变得不重要了)。

你有一些和机器学习相关的项目吗

对于这个问题,你可以从你做过的研究与他们公司的业务之间的联系上作答。 你所学到的技能是否有一些可能与他们公司的业务或你申请的职位有关? 不需要是100%相吻合的,只要以某种方式相关就可以。这样有助于让他们认为你可以在这个职位上所产生的更大价值。

接触过推荐吗?知道推荐系统主要分为那两个方面吗?

基于内容的推荐和协同过滤推荐。

过拟合和欠拟合是什么?如何解决过拟合?

underfitting和overfitting的成因都是模型的复杂度和分类的关系。 如果模型很简单,但是要分的类型很多就会产生欠拟合。比如要求用一条直线将数据分成10类。 反之如果模型很复杂,但是分类很简单,就容易产生过拟合。(比如,有一个复杂度很高的非线性分类器,用来分类猫和狗。训练久了以后,可能会出现有几个长得像狗的猫和长得像猫的狗的个例都能被正确分类了。这时候你的模型很可能已经过拟合了,因为训练成这样的模型在遇到新的数据的时候,将样本错误分类的可能性很大。)

重点是过拟合

所谓过拟合(Overfit),是这样一种现 象:一个假设在训练数据上能够获得比其他假设更好的拟合,但是在训练数据外的数据集上却不能很好的拟合数据。此时我们就叫这个假设出现了overfit的现象。

过拟合产生的原因:出现这种现象的主要原因是训练数据中存在噪音或者训练数据太少。

解决方法:

1、 增大数据量

2、 减少feature个数(人工定义留多少个feature或者算法选取这些feature)

3、 正则化(留下所有的feature,但对于部分feature定义其parameter非常小)

4、 交叉验证,重采样评价模型效能,K折交叉验证

5、保留一个验证数据集检验

tf-idf用过吗?它的公式?

要点:TFIDF实际上是:TF * IDF,一个TF**,一个IDF**

词频(term frequency**,TF****)指的是某一个给定的词语在该文件中出现的频率(一词语出现的次数除以该文件的总词语数)。**

逆向文件频率(inverse document frequency**,IDF****)是一个词语普遍重要性的度量。某一特定词语的IDF****,可以由总文件数目除以包含该词语之文件的数目。**

假如一篇文件的总词语数是100个,而词语“母牛”出现了3次,那么“母牛”一词在该文件中的词频就是3/100=0.03。一个计算文件频率 (IDF) 的方法是文件集里包含的文件总数除以测定有多少份文件出现过“母牛”一词。所以,如果“母牛”一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是 lg(10,000,000 / 1,000)=4。最后的TF-IDF的分数为0.03 * 4=0.12。

LR和SVM的区别和联系?

要点:联系,都是分类算法,

如果不考虑核函数,LR和SVM都是线性分类算法,也就是说他们的分类决策面都是线性的。

要点:损失函数不同

SVM 只考虑局部的边界线附近的点,LR 考虑全局,远离的点对边界线的确定也起作用

在解决非线性问题时,SVM 采用核函数的机制,而 LR 通常不采用核函数的方法

线性 SVM 依赖数据表达的距离测度,所以需要先对数据做 normalization, LR 则不受影响。

你可能感兴趣的:(基础)