PHP相关面试题总结

栏目: 数据库 · Memcache · 发布时间: 6年前

内容简介:HashHash索引,当我们要给某张表某列增加索引时,将这张表的这一列进行哈希算法计算,得到哈希值,排序在哈希数组上。所以Hash索引可以一次定位,其效率很高,而Btree索引需要经过多次的磁盘IO,但是innodb和myisam之所以没有采用它,是因为它存在着好多缺点Btree

数据库

Btree和hash索引的区别

Hash

Hash索引,当我们要给某张表某列增加索引时,将这张表的这一列进行哈希算法计算,得到哈希值,排序在哈希数组上。所以Hash索引可以一次定位,其效率很高,而Btree索引需要经过多次的磁盘IO,但是innodb和myisam之所以没有采用它,是因为它存在着好多缺点

  1. hash索引比较的是经过hash计算的值,所以只能进行等式比较,不能进行范围查询;

  2. 每次都要全表扫面;

  3. 由于哈希值是按照顺序排列的,但是哈希值所对应得真实数据并不一定是按照顺序排列,所以不能进行 排序 比较;

  4. 不能用部分索引键进行搜索,因为组合索引在计算哈希值得时候是在一起计算得;

  5. 当hash值大量重复且数据量非常大得时候,其检索效率并没有Btree快。

Btree

以B+树为存储结构实现得

  1. 可以使用除了等于之外的比较操作符

  2. 使用like查询的时候也可以使索引生效,只要不是以通配符 % 开头的就可以

InnoDB个MyISAM引擎的区别

基本区别:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能

具体区别:

  1. InnoDB不支持全文索引(Mysql5.7已支持);

  2. InnoDB不保存表的具体行数,执行 select count(*) from table 时要扫描全表来计算有多少行。MyISAM就不需要扫描全表,只需要读出保存好的行数即可(MyISAM内置了一个计数器)。当查询的时候有where条件的时候,两者的操作是一样的;

  3. 对于自增类型的字段,InnoDB中必须包含只有该字段的索引,在MyISAM表中,可以和其他字段一起建立联合索引;

  4. 删除全表(delete from table)的时候,InnoDB是逐行删除

  5. InnoDB的行锁也不是绝对的,比如在执行一个不确定扫描范围的语句的时候,就会锁表

  6. InnoDB支持事务处理、外键、行级锁

MySQL事物中的ACID分别指什么

  1. A原子性(Atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性

  2. C一致性(Consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态

  3. I隔离性(Isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的

  4. D持久性(Durability):一旦事物提交,其结果时永久性的

PHP

不用第三个变量,交换两个变量的值

最简单的,加减法或者乘除法,举例:

a = a + b
b = a - b
a = a - b

array+array和array_merge的区别

当要合并的两个数组下标相同并且为 数值 时,array+array会返回最先出现的下标对应的值,把后来的值舍弃掉。而array_merge则不会覆盖

当要合并的两个数组下标相同并且为 字符串 时,array+array还是会返回最先出现的下标对应的值,把后来的值舍弃掉。而array_merge则会覆盖掉前面相同键名的值

周边问题

Restful是什么?

一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制

什么是协程

协程就是 用户态的线程

什么是RPC

RPC是指远程过程调用(像调用本地的函数一样去调远程函数)。主要功能目标是让构建分布式计算更容易,在提供强大的远程协调能力时不损失本地调用的语义简明性。

TCP和UDP的主要区别

  1. TCP是面向连接的,在传递数据之前,需要经过三次握手来建立连接;UDP是无需连接的(无状态传输协议),即发送之前是不需要连接的,即不需要握手

  2. 对系统资源的要求(TCP多,UDP少)

  3. 流模式和数据报文模式

  4. TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证

MemCache和 Redis 的区别

数据支持类型

memcache

使用key-value形式存储和访问数据,在内存中维护一张巨大的HashTable,使得对数据查询的时间复杂度降低到O(1),保证了对数据的高性能访问。

Redis

redis与 memcached 相比,比仅支持简单的key-value数据类型,同时还提供list,set,zset,hash等数据结构的存储;

网络IO模型

memcache

memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe传递给worker线程,进行读写IO,网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,

Redis

使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll, kqueue和select,对于单存只有IO操作来说,单线程可以将速度优势发挥到最大,但是redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型施加会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞的。

内存管理机制

memcache

Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内存池的方式可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可能会被剔除

详细:

Memcached默认使用Slab Allocation机制管理内存,其主要思想是按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。Slab Allocation机制只为存储外部数据而设计,也就是说所有的key-value数据都存储在Slab Allocation系统里,而Memcached的其它内存请求则通过普通的malloc/free来申请,因为这些请求的数量和频率决定了它们不会对整个系统的性能造成影响Slab Allocation的原理相当简单。 如图所示,它首先从操作系统申请一大块内存,并将其分割成各种尺寸的块Chunk,并把尺寸相同的块分成组Slab Class。其中,Chunk就是用来存储key-value数据的最小单位。每个Slab Class的大小,可以在Memcached启动的时候通过制定Growth Factor来控制。假定图中Growth Factor的取值为1.25,如果第一组Chunk的大小为88个字节,第二组Chunk的大小就为112个字节,依此类推。

当Memcached接收到客户端发送过来的数据时首先会根据收到数据的大小选择一个最合适的Slab Class,然后通过查询Memcached保存着的该Slab Class内空闲Chunk的列表就可以找到一个可用于存储数据的Chunk。当一条数据库过期或者丢弃时,该记录所占用的Chunk就可以回收,重新添加到空闲列表中。从以上过程我们可以看出Memcached的内存管理制效率高,而且不会造成内存碎片,但是它最大的缺点就是会导致空间浪费。因为每个Chunk都分配了特定长度的内存空间,所以变长数据无法充分利用这些空间。如图 所示,将100个字节的数据缓存到128个字节的Chunk中,剩余的28个字节就浪费掉了

Redis

Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,Redis跟据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合作为存储而不是cache

详细:

Redis为了方便内存的管理,在分配一块内存之后,会将这块内存的大小存入内存块的头部。

Redis通过定义一个数组来记录所有的内存分配情况,数组的每一个元素代表当前程序所分配的内存块的个数,且内存块的大小为该元素的下标。Redis采用的是包装的malloc/free,相较于Memcached的内存管理方法来说,要简单很多。

在Redis中,并不是所有的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别.当物理内存用完时,Redis可以将一些很久没用到的value交换到磁盘.Redis只会缓存所有的key的信息,如果Redis发现内存的使用量超过了某一个阀值,将触发swap的操作,计算出哪些key对应的value需要swap到磁盘。然后再将这些key对应的value持久化到磁盘中,同时在内存中清除.

数据存储及持久化

memcache

memcached不支持内存数据的持久化操作,所有的数据都以in-memory的形式存储。

Redis

redis支持持久化操作。redis提供了两种不同的持久化方法来讲数据存储到硬盘里面,一种是快照(RDB),它可以将存在于某一时刻的所有数据都写入硬盘里面。另一种方法叫只追加文件(append-only file, AOF),它会在执行写命令时,将被执行的写命令复制到硬盘里面。

数据一致性问题

memcached

Memcached提供了cas命令,可以保证多个并发访问操作同一份数据的一致性问题。

Redis

Redis没有提供cas 命令,并不能保证这点,不过Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断。

集群管理不同

memcached

Memcached是全内存的数据缓冲系统,Redis虽然支持数据的持久化,但是全内存毕竟才是其高性能的本质。作为基于内存的存储系统来说,机器物理内存的大小就是系统能够容纳的最大数据量。如果需要处理的数据量超过了单台机器的物理内存大小,就需要构建分布式集群来扩展存储能力。

Memcached本身并不支持分布式,因此只能在客户端通过像一致性哈希这样的分布式算法来实现Memcached的分布式存储。下图给出了Memcached的分布式存储实现架构。当客户端向Memcached集群发送数据之前,首先会通过内置的分布式算法计算出该条数据的目标节点,然后数据会直接发送到该节点上存储。但客户端查询数据时,同样要计算出查询数据所在的节点,然后直接向该节点发送查询请求以获取数据。

Redis

相较于Memcached只能采用客户端实现分布式存储,Redis更偏向于在服务器端构建分布式存储。最新版本的Redis已经支持了分布式存储功能。Redis Cluster是一个实现了分布式且允许单点故障的Redis高级版本,它没有中心节点,具有线性可伸缩的功能。Redis Cluster的分布式存储架构,节点与节点之间通过二进制协议进行通信,节点与客户端之间通过ascii协议进行通信。在数据的放置策略上,Redis Cluster将整个key的数值域分成4096个哈希槽,每个节点上可以存储一个或多个哈希槽,也就是说当前Redis Cluster支持的最大节点数就是4096。Redis Cluster使用的分布式算法也很简单:crc16( key ) % HASH_SLOTS_NUMBER。

为了保证单点故障下的数据可用性,Redis Cluster引入了Master节点和Slave节点。在Redis Cluster中,每个Master节点都会有对应的两个用于冗余的Slave节点。这样在整个集群中,任意两个节点的宕机都不会导致数据的不可用。当Master节点退出后,集群会自动选择一个Slave节点成为新的Master节点。


以上所述就是小编给大家介绍的《PHP相关面试题总结》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

PHP&MySQL Web数据库应用开发指南

PHP&MySQL Web数据库应用开发指南

Hugb E. Williams、David Lane / 谢君英 / 中国电力出版社 / 2003-5 / 69.00元

一起来看看 《PHP&MySQL Web数据库应用开发指南》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具