《2019年小米春季上海 PHP 实习生招聘面试题》部分答案解析 [ 千人千面 ]

1丶Nginx怎么实现负载均衡

这个还是比较简单

1、轮询

这种是默认的策略,把每个请求按顺序逐一分配到不同的server,如果server挂掉,能自动剔除。

upstream  fengzp.com {   
    server   192.168.99.100:42000; 
    server   192.168.99.100:42001;  
}

2、最少连接

把请求分配到连接数最少的server

upstream  fengzp.com {   
    least_conn;
    server   192.168.99.100:42000; 
    server   192.168.99.100:42001;  
}

3、权重

使用weight来指定server访问比率,weight默认是1。以下配置会是server2访问的比例是server1的两倍。

upstream  fengzp.com {   
    server   192.168.99.100:42000 weight=1; 
    server   192.168.99.100:42001 weight=2;  
}

4、ip_hash

每个请求会按照访问ip的hash值分配,这样同一客户端连续的Web请求都会被分发到同一server进行处理,可以解决session的问题。如果server挂掉,能自动剔除。

upstream  fengzp.com {   
    ip_hash;
    server   192.168.99.100:42000; 
    server   192.168.99.100:42001;  
}

ip_hash可以和weight结合使用。

2丶Linux常用的命令

这个就不多说了

3丶微信小程序常用的组件

view丶text丶button丶navigator丶scroll-view......等等

4丶Nginx怎么配置虚拟主机

恩2333333

5丶TP5和Laravel框架差异

恩2333333

6丶TP5和Laravel框架中的数据迁移

这个本社区就有文档的

7丶RBAC模型的讲解

什么是RBAC

RBAC(基于角色的访问控制):英文名称 Rose base Access Controller 。本博客介绍这种模型的权限系统设计。取消了用户和权限的直接关联,改为通过用户关联角色、角色关联权限的方法来间接地赋予用户权限。从而实现了解耦。RBAC在发展过程中分为以下几个版本。RBAC0、RBAC1、RBAC2、RBAC3。

8丶订单模块的流程

9丶订单支付成功后的操作

10丶设置邮箱激活连接过期时间

在把激活码写入数据库的同时写入时间戳+过期时间

11丶Redis与Mongodb的区别

1、性能

都比较高,性能对我们来说应该都不是瓶颈。
总体来讲,TPS方面redis和memcache差不多。

2、操作的便利性

redis在2.0版本后增加了自己的VM特性,突破物理内存的限制;可以对key value设置过期时间(类似memcache)。
mongoDB适合大数据量的存储,依赖操作系统VM做内存管理,吃内存也比较厉害,服务不要和别的服务在一起。

4、可用性(单点问题)

对于单点问题:
redis,依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制,因性能和效率问题,所以单点问题比较复杂;不支持自动sharding,需要依赖程序设定一致hash 机制。
一种替代方案是,不用redis本身的复制机制,采用自己做主动复制(多份存储),或者改成增量复制的方式(需要自己实现),一致性问题和性能的权衡。
mongoDB支持 master-slave,replicaset (内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制。

5、可靠性(持久化)

对于数据持久化和数据恢复,redis支持(快照、AOF):依赖快照进行持久化,aof增强了可靠性的同时,对性能有所影响,MongoDB从1.8版本开始采用binlog方式支持持久化的可靠性。

6、数据一致性(事务支持)

redis事务支持比较弱,只能保证事务中的每个操作连续执行,mongoDB不支持事务。

7、应用场景

redis:数据量较小的更性能操作和运算上
MongoDB:主要解决海量数据的访问效率问题

12丶redis和memcached的区别

13丶redis中的队列

关于redis队列的实现方式有两种:

1、生产者消费者模式。

普通版本:

比如一个队列里面,生产者A push了一个数据进去,消费者B pop 了这个数据,那个这个队列依旧为空。所以是一对一的。
至于是先进先出还是先进后出等,可以依照函数lpush(从队列左边,也就是队首push一个数据) rpush(从队列右边也就是队尾push一个数据) lpop(同理) rpop等来控制。

阻塞版本:

但是上面的命令都是立即返回的,无论数据有无,关于取数据lpop有个增强版本,blpop(block left pop)阻塞版本,
使用方法:blpop key1 key2 ... keyn 10
同时预获取多个key的值,并设置超时时间为10s,如果所有key,有些key有value就立即返回,如果所有key都没有value就阻塞10秒返回

2、发布者订阅者模式。

概念:

三个用户A,B,C同时都订阅了一个channel名字叫msg,然后发布者往msg的channel里面发布了一个数据,那么A,B,C三个用户都会收到该数据。

注意点:

很明显,三个用户ABC需要阻塞。怎么收到订阅的数据呢,肯定是依靠注册在redis里面的回调函数。
发布的数据不会在redis里面复现,意思就是发布了以后,A,B,C由于种种原因没收到就没收到。

14丶redis中的数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

15丶TP框架中的事件

16丶TP框架的依赖注入

和Laravel没什么区别

17丶MySQL的读写分离操作

什么主从复制,什么bin log,胡说了一大堆

18丶数据库varchar和char的区别

varchar会回收未使用的空间

19丶MyIsam与InnoDB的区别

1、MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法。不是事务安全的,而且不支持外键,如果执行大量的select,insert MyISAM比较适合。
2、InnoDB:支持事务安全的引擎,支持外键、行锁、事务是他的最大特点。如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况。

一、表锁差异

MyISAM:

myisam只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。也可以通过lock table命令来锁表,这样操作主要是可以模仿事务,但是消耗非常大,一般只在实验演示中使用。

InnoDB :

Innodb支持事务和行级锁,是innodb的最大特色。
事务的ACID属性:atomicity,consistent,isolation,durable。
并发事务带来的几个问题:更新丢失,脏读,不可重复读,幻读。

二、数据库文件差异

MyISAM :

myisam属于堆表
myisam在磁盘存储上有三个文件,每个文件名以表名开头,扩展名指出文件类型。
.frm 用于存储表的定义
.MYD 用于存放数据
.MYI 用于存放表索引
myisam表还支持三种不同的存储格式:
静态表(默认,但是注意数据末尾不能有空格,会被去掉)丶动态表丶压缩表。

InnoDB :

innodb属于索引组织表
innodb有两种存储方式,共享表空间存储和多表空间存储
两种存储方式的表结构和myisam一样,以表名开头,扩展名是.frm。
如果使用共享表空间,那么所有表的数据文件和索引文件都保存在一个表空间里,一个表空间可以有多个文件,通过innodb_data_file_pathinnodb_data_home_dir 参数设置共享表空间的位置和名字,一般共享表空间的名字叫ibdata1-n。
如果使用多表空间,那么每个表都有一个表空间文件用于存储每个表的数据和索引,文件名以表名开头,以.ibd为扩展名。

三、索引差异

1、关于自动增长

myisam引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。
innodb引擎的自动增长咧必须是索引,如果是组合索引也必须是组合索引的第一列。

2、关于主键

myisam允许没有任何索引和主键的表存在,
myisam的索引都是保存行的地址。
innodb引擎如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见)
innodb的数据是主索引的一部分,附加索引保存的是主索引的值。

3、关于count()函数

myisam保存有表的总行数,如果 select count(*) from table; 会直接取出出该值
innodb没有保存表的总行数,如果使用 select count(*) from table; 就会遍历整个表,消耗相当大,但是在加了where 条件后,myisam和innodb处理的方式都一样。

4、全文索引

myisam支持 FULLTEXT类型的全文索引
innodb不支持FULLTEXT类型的全文索引(5.6开始已经支持了),但是innodb可以使用sphinx插件支持全文索引,并且效果更好。(sphinx 是一个开源软件,提供多种语言的API接口,可以优化mysql的各种查询)。

5、delete from table

使用这条命令时,innodb不会从新建立表,而是一条一条的删除数据,在innodb上如果要清空保存有大量数据的表,最 好不要使用这个命令。(推荐使用truncate table,不过需要用户有drop此表的权限)。

6、索引保存位置

myisam的索引以表名+.MYI文件分别保存。
innodb的索引和数据一起保存在表空间里。

20丶MySQL中的索引有几种

一、普通索引

最基本的索引,只是加快了查询速度。

二、唯一索引

与普通索引类似,不同的是:索引的列值必须唯一,但允许有空值,也就是null,如果是组合索引,则列值的组合必须是唯一的。

三、主键索引

即我们常用的主键id,它是一种特殊的唯一索引,不允许有空值,一般在建表时同时创建主键索引。
特点:

1)一张表只有一个主键索引
2)主键要求自增

四、组合索引

即多个字段建立的索引

五、全文索引

fulltext
myisam引擎支持

六、外键

建立外键需要注意的事项:

1)表引擎必须一样
2)字段类型必须一样
3)长度必须一样
4)存储范围必须一样
5)约束字段必须在被引用的字段中出现过
php

By: Laravel-China 宁泽林
MySite: iacblog

本帖由系统于 2个月前 自动加精
讨论数量: 18
Zerin

欢迎大家来补充答案呀 :+1:

2个月前
NingZelin

有点意思

2个月前

小米上海有招PHP实习生?

2个月前
yourself

@Zerin
问:TP5和Laravel框架差异
答:laravel有的照搬,但是copy的不严谨出了大bug。

2个月前
yourself

@Zerin
问:innodb不支持FULLTEXT类型的全文索引
答 :5.6开始已经支持了

2个月前
Zerin

@yourself 恩,我更改下

2个月前
Zerin

@Icharle 上海和西安

2个月前
梦之马

ip_hash可以和weight结合使用。
这个可以?我看负载均衡的时候好像不可以啊。

2个月前
Zerin

@梦之马 是可以的

2个月前
梦之马

@Zerin 那你知道ip_hash再加权 还能解决session 共享问题?ip_hash的好处不就在这里嘛

2个月前
Zerin

@梦之马 这个没涉及到,我在审阅一下,或者你提交修改

2个月前

@Zerin 现在上海小米还有实习内推?

2个月前
梦之马

@Zerin 确实支持 权重了,https://nginx.org/en/CHANGES-1.12
在这个页面搜索 ip_hash
Changes with nginx 1.3.1 05 Jun 2012
*) Feature: it is now possible to specify a weight for servers while
using the "ip_hash" directive.

2个月前
Zerin

@Icharle 内推不好说,你可以关注一下小米Hr官网

2个月前
Zerin

@梦之马 好吧

2个月前

@梦之马 ip_hash在移动网连接的情况下,不好用吧,ip会变

3周前
梦之马

@markchu 后端为了保证一致性,会让 session 放到同一台机器(可以是redis,mysql等)上

3周前

赞一个

3周前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!