《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_path
和 innodb_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)约束字段必须在被引用的字段中出现过#
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: