知识点列表

一、redis

  1. redis

typedef struct redisObject { unsigned type:4;【OBJ_STRING, OBJ_LIST, OBJ_SET, OBJ_ZSET, OBJ_HASH】 unsigned encoding:4【上述type的OBJ-ENCODING _XXX常量,四个位说明同一个type可能是不同的encoding,或者说同一个数据类型,可能不同的内部表示】; unsigned lru:LRU_BITS; /* lru time (relative to server.lruclock) */ int refcount; void *ptr【真正指向的数据】; } robj

  1. 从服务器向主服务器发送sync
  2. 主服务器收到sync命令执行BGSAVE,且在这期间新执行的命令保存到一个缓冲区
  3. 主执行(BGSAVE)完毕后,将.rdb文件发送给从服务器,从服务器将文件载入内存
  4. BGSAVE期间到缓冲区的命令会以redis命令协议的方式,将内容发送给从服务器。

/* Include the best multiplexing layer supported by this system. * The following should be ordered by performances, descending. */ #ifdef HAVE_EVPORT #include "ae_evport.c" #else #ifdef HAVE_EPOLL #include "ae_epoll.c" #else #ifdef HAVE_KQUEUE #include "ae_kqueue.c" #else #include "ae_select.c" #endif #endif

1) "maxmemory-policy" 2) "noeviction" 127.0.0.1:6379>


二、MySql

  1. mysql
  1. myisam采用非聚集索引,innodb采用聚集索引
  2. myisam索引myi与数据myd文件分离,索引文件仅保存数据记录指针地址。
  3. myisam的主索引与辅助索引在结构上没区别,而innodb不一样:innodb的所有辅助索引都引用主索引作为data域。
  4. innodb支持事务,行级锁。myisam不行。
  5. innodb必须有主键,而myisam可以没有。

php架构师面试(PHP高级工程师面试题)(1)

php架构师面试(PHP高级工程师面试题)(2)

php架构师面试(PHP高级工程师面试题)(3)

php架构师面试(PHP高级工程师面试题)(4)

php架构师面试(PHP高级工程师面试题)(5)

php架构师面试(PHP高级工程师面试题)(6)

php架构师面试(PHP高级工程师面试题)(7)

  1. b 中间节点没有卫星数据,而b-tree有卫星数据(可以理解为key data的二维数组),所以前者同样大小可以容纳更多的节点元素。这样又导致了b 比b更“矮胖”,更进一步减少了io查询次数。很好的解释了下面这句话:在cluster index(聚集索引中),叶子节点直接包含卫星数据;在非聚集索引中nonclustered index中,叶子节点带有指向卫星数据的指针。
  2. b-只要查找到匹配元素,直接返回,网络匹配元素处理中间节点还是叶子节点。而b 查询必须查找到叶子节,相对于b-,b 无需返回上层节点重复遍历查找工作,所以得出b-查找并不稳定,而b 是稳定的。
  3. 针对范围查询,b-需要n次中序遍历,而b 只需要通过子节点链表指针遍历即可。

php架构师面试(PHP高级工程师面试题)(8)

  1. 分库分表
  2. 主从
  3. ACID
  4. 覆盖索引(复合索引)
  1. 聚集索引cluster index 一般为primary key

php架构师面试(PHP高级工程师面试题)(9)

CREATE TABLE users( id INT NOT NULL, first_name VARCHAR(20) NOT NULL, last_name VARCHAR(20) NOT NULL, age INT NOT NULL, PRIMARY KEY(id), KEY(last_name, first_name, age) KEY(first_name)

  1. 辅助索引:非聚集索引都可以被称作辅助索引,其叶子节点不包含行记录的全部数据,仅包含索引中的所有键及一个用于查找对应行记录的【书签(即主键或者说聚集索引)】,下面两个图为辅助索引(first_name,age)以及通过主键再次查找的过程

php架构师面试(PHP高级工程师面试题)(10)

php架构师面试(PHP高级工程师面试题)(11)

  1. 联合索引:与覆盖索引没有区别,或者理解为覆盖索引是联合索引的最优解(无需通过主键回表)。
  2. explain
  1. 其他:
  2. varchar为啥为65535?compact行记录的第一个字段为变长字段长度列表,为2个字节16位。参考
  3. 一个表最多多少行?1023,具体也是看行格式的数据结构即可,参考上文的参考链接。
  4. 为什么建议给表加主键?主键的作用是把数据格式转为索引(平衡树)
  5. 联合索引在b 树中如何存储?
  6. 为什么索引不直接用二叉查找树,要用b树,b 树?主要考虑减少磁盘io(考虑磁盘物理原理及局部性与磁盘预读的特性:)
  7. myisam和innodb必须有主键吗?innodb必须有,数据文件需要按照主键聚集,如果没有innodb会自动生成。

三、算法&数据结构

p->next=p->next->next; if(head->next===null){ head=null }

new_node->next=p->next; p->next=new_node if(head===null){ head=new_node; }


四、设计模式

  1. 设计模式

static private $instance; private $config; private funciton __construct($config){ $this->config=$config; } private funciton __clone(){ } static public function instance($config){ if(!self::$instance instanceof self){ self::$instance=new self($config); } return self::$instance; } }

{ public function makeModule($moduleName, $options) { switch ($moduleName) { case 'Fight': return new Fight($options[0], $options[1]); case 'Force': return new Force($options[0]); case 'Shot': return new Shot($options[0], $options[1], $options[2]); } } } # 使用工厂方式 001 class Superman { protected $power; public function __construct() { // 初始化工厂 $factory = new SuperModuleFactory; // 通过工厂提供的方法制造需要的模块 $this->power = $factory->makeModule('Fight', [9, 100]); // $this->power = $factory->makeModule('Force', [45]); // $this->power = $factory->makeModule('Shot', [99, 50, 2]); /* $this->power = array( $factory->makeModule('Force', [45]), $factory->makeModule('Shot', [99, 50, 2]) ); */ } } # 使用工厂方式 002 class Superman { protected $power; public function __construct(array $modules) { // 初始化工厂 $factory = new SuperModuleFactory; // 通过工厂提供的方法制造需要的模块 foreach ($modules as $moduleName => $moduleOptions) { $this->power[] = $factory->makeModule($moduleName, $moduleOptions); } } } // 创建超人 $superman = new Superman([ 'Fight' => [9, 100], 'Shot' => [99, 50, 2]


五、正则表达式

  1. 正则表达式

六、PHP

  1. php

七、操作系统

  1. 操作系统

八、网络协议

  1. 网络协议

php架构师面试(PHP高级工程师面试题)(12)


九、大前端

  1. js

十、中间件

  1. 中间件

十一、php框架

  1. php框架

十二 、运维

  1. 运维&架构

十三、golang

  1. golang

十四、 Linux

  1. linux

十五、nginx

  1. nginx

十六、分布式 | 微服务

  1. 分布式
  1. 微服务

其他

  1. 其他

php架构师面试(PHP高级工程师面试题)(13)

具体

  1. 如何对一个大文件排序(装不进内存的)-好未来
  1. 快速排序代码
  2. 冒泡排序代码
  1. 归并排序代码

,