2019-2020 PHP面试-12家(答案全)

目录

一、洛可可设计

1、判断一个字符串A(ghtabcdef)是否包含另一个字符串B(bac),不考虑顺序。

2、ip的正则表达式

3、Restful动词中post,patch,put的区别?什么是安全?什么是幂等?哪些动词符合安全幂等?

4、写出LRU最近最久未被使用的页面置换算法的实现。哪些地方用到?如何将缓存存入redis

5、问:平常如何调试代码,答:看错误日志和Xdebug调试,问:Xdebug单步调试的原理与实际操作

6、cookie-session,文件各自存在具体哪儿

7、手写二维数组查重和二维数组排序

二、微博动漫

1、mysql注入,mysql各种索引,哪些连接词对索引无效?

2、"24linux"+6=30

3、高并发,ElasticSearch

4、取一串url中的扩展

5、全局变量和静态变量

三、360金融

1、描述一下http协议里,header里的keep alive的作用

2、请写出php中array_开头的函数,并说明用途,至少6个

3、你是如何发现php运行中的错误呢?如果已知某个页面打开较慢,请问如何定位具体原因?

4、有10万个URL在一个文件中,每行一个URL,请写一个PHP函数,抓取这些URL网页中的内容,并把里面a标签的链接()提取出来,保存在数据库里。

5、请用C语言实现一个base62encode函数(写成PHP扩展的风格更佳)。

6、Mysql有哪几种存储方式,innodb与myisam的区别?如何选择?

7、数据库索引,C加索引,ABC加索引,请问下面的SQL语句,能否加索引?

8、简述如何查看当前系统的负载情况-uptime,tload,top,w,cat /proc/loadavg

9、请用shell完成一个文本分析,文本的格式如下,需要统计一下倒数第3列数字之和

10、在一台运行Apache的服务器上,如何查看当前HTTP的并发连接数(netstat)

11、请描述下Memcache或Redis的内部实现方式

12、请设计一个短地址的服务(类似于微博的短地址)

13、大数据的搜索引擎——Elasticsearch

四、作业帮

前4题是面试的时候考的,后2题是觉得得准备的

1、php设置超时时间

2、nginx有哪几种与php-fpm的通信方式?nginx与淘宝的tengine有什么区别?

(1)nginx 与 php-fpm 的通信有 tcp socket 和 unix socket 两种方式。

(2)nginx与淘宝的tengine有什么区别

3、mysql有普通索引,唯一索引,主键索引,其中唯一索引与主键索引在底层结构上有什么不同?

4、mysql隔离机制与锁:其中脏读与幻读的区别,分别怎么用锁?读锁?

5、多服务器如何保证数据一致性。服务器分配现场设计方案。

6、算法题

(1)优惠券排序

(2)有一个文件,里面每一行都是一个url,写一个算法,读取出现最多的五条及其出现的次数

五、顺丰科技

1、分布式锁

2、二维数组,行从小到达递增,列从小到大递增,判断一个数是否在其中?

3、2个有序链表的合并

4、如何平滑迁移数据库的表,如何分库分表(提示:保证两者一致后,再考虑业务)

5、事务的特性,这些特性是如何保证的?(四大隔离机制)

6、如何设计一个秒杀系统?(1)更新代入插入   (2)异步缓存

7、高并发如何提升性能

8、ElasticSearch

9、设计一个存储器,100万条数据,保证增删改查都是O(1)? (提示:hash+链表)

10、mysql有哪些锁,IS为何在S前加,IX为何在X前加?

六、百度

1、A下有B、C,B下面有D和E,C下面也有D和E, 这相当于一个多叉树,如何判断一个树是否和这个一样?

2、(1)用一条sql求user_id=100,topic_id=1的未作答的question  (2)当百万条记录,并发也很高,如何加索引?

3、上百万条json,每条的字段content是json串,求ABCDE

4、$a = [3,5,7,2];每个值代表柱形的一个高度,求max矩形面积(提示:单调栈)

5、yii里bindValue和bindProporety的区别?

6、max{a[j]-a[i]},股价的买入和卖出

 

七、轻松筹:----技术200人,按职能(前端/后端/测试)分开

========如下是笔试题:

1、函数内部static和global关键字的作用,php魔术方法都有哪些,它们的作用是什么?

2、说一说用过的php开源框架CI、ThinkPHP、Laravel、Yaf、Phalcon的优缺点以及框架如何载入类的

3、使用php下载网络照片,有哪些方法?

4、什么是CSRF攻击?xss攻击?如何防范?

5、列举常用的设计模式并说说明其使用场景

6、简单描述类的依赖注入和反射机制,简述接口金额抽象类的区别和使用场景

7、静态变量的试题

8、为一个论坛系统设计一套数据库表,要求使用MYSQL数据库,可以自己设想一些产品需求。

9、算法题

算法一:在未排序的数组中找到第k个最大的元素。

算法二:给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。

算法三:给定n个非负整数表示每个宽度为1的柱子的高度图,计算按次排列的柱子,下雨之后能接多少雨水。(单调栈)

========如下是面试题:

1、sql注入与XSS攻击

2、pdo PDO最全面的疑难杂症汇总

3、innodb事务隔离级别,默认哪级,具体说说 数据库四大特性+四种隔离+详细操作

4、php自动(懒)加载 php懒加载(自动加载)

4、require和include区别 php require()和include()的区别

5、php变量:了解php源码中变量的容器zval吗?

6、php怎么进行变量的生命周期管理?

7、cgi与fastcgi Nginx+Php-fpm运行原理详解

8、单点登录,如果是集群10台单点登录呢????????????

9、索引结构,B+叶子结点存什么?非叶子结点存什么,范围是?主键索引的数据都存在叶子结点,那text类型也存在里面吗?

10、memcache与redis区别?只存k-v结构时,用哪种好?redis单核占满的时候如何获取数据缓存?i/o,内存,cpu之间的区别?缓存在哪?

11、进程,线程,协程的区别?用协程的好处?简述I/O多路复用?

12、会议室预约,同一时段,被多人选,怎么解决并发?

13、redis做高可用的存储方案怎么做? kafka如何保持高可用,哈希一致性有了解吗?

14、选择排序与堆排序,及其时间复杂度。

八、字节跳动

(8.1)实战面试题

1、随便写一个排序算法,说明它的时间复杂度和空间复杂度,并详细解释这个复杂度是怎么算出来的?

2、array_walk和array_map的区别,这里提到有个区别是,返回值的不同,前者返回bool,后者返回数组

3、yii2的自动加载机制?vendor里的composer是怎么加载进来的?spl_autoload_register?

4、yii2的事件和行为?我说了行为可以用来自动填充mysql的created_at和updated_at,又问了mysql自己的机制也能填充

5、yii2的最基础的类是?开始说了\yii\base\Application,然后说这不对,是Object!

6、yii2的依赖注入和容器化?

7、redis的5种数据结构,其中string的底层结构是什么?

8、kafka怎么保证消息不丢失?kafaka的offset怎么设计的,有什么作用?

9、mysql索引的原理,有哪个索引是必须的?主键索引是唯一的

(8.2)面试前搜罗的头条的相关面试题

1、http协议知道吗?

2、cookie session介绍一下

3、session表结构怎么设计,储存在哪里? 你们的session cookie在项目里运用到哪里?

4、TCP/UDP的区别介绍一下

5、三次握手和四次挥手,time_wait是什么状态

6、B树 B+树区别说一下,数据库平时用到过什么 咱们先问MySQL MySQL索引原理知道吗

7、问了两种索引的区别(没记住...)

8、乐观锁悲观锁区别说一下

9、数据库四种隔离状态,分别有什么问题

10、redis的数据结构,sortset底层,原理,怎么保证有序

题目:https://blog.csdn.net/zujipi8736/article/details/87441981 【19.2.14视频面试】

11、了解http,https吗?http中的状态码:500,501,502,503,504是什么意思。介绍一下cookie和session。

12、技术面,涉及数据库优化,redis的使用

13、手写数据库查询语句以及索引优化,redis等缓存的使用。

14、抖音的后端核心开发岗

1、输入一个域名到访问到你的主页面中间发生了什么,单个服务器和多个服务器的过程分别是什么

2、说说你理解的thinkPHP和smarty,尽量详细

3、LAMP之间的关系

4、apache对于php是个什么角色

5、除了apache还了解哪些服务器

6、一系列的项目问题,你写的功能点怎么实现,换一种方式怎么实现,怎么优化。这个跟简历有关

7、怎么精确统计在线人数,除了用session还能用什么

7、不用用户id标识session怎么实现单点登录

9、怎么控制代码之间的关联性

10、取出一系列数中最大的五个数

11、sql优化

===================算法题如下===================

算法1:链表

(1)变形的链表反转:

(2)[删除链表中重复的节点]

(3)链表的合并

算法2:字符串:从一个字符串中找出无重复的最大子串  详见:P剑236,P左284

算法3:数组与矩阵

(1)多个有序数组的合并

(2)满足条件的子数组

算法6:进制转换

(1)36进制加法

(2)华为笔试题:N进制求和计算问题

算法7:LRU页面置换算法

九、快手

六险一金,食堂包三餐, 房补2千,年假7天,周末加班,双倍工资/调休

十、北京掌上先机

1、web开发中遇到哪些安全性问题?

2、前后端分离有用吗?好处是什么?

3、cgi协议,fastcgi协议,fpm  [面试]Nginx+Php-fpm运行原理详解

4、$_POST 什么情况下接收不到post提交过来的参数?

5、15*34=532,在什么进制下成立?

6、判断四个点能否构成矩阵

7、sql优化方案 常考数据库优化

8、逻辑推断题:甲乙丙三人,甲说乙说谎,乙说丙说谎,丙说甲乙都说谎了。这三人中只有一人说了真话,是谁?==>乙

9、数组a有99个元素,元素值范围1~100

(1)数组a中只有99个无序且不重复的元素,再不排序的前提下,怎么找出那缺失的元素值?

(2)如果a中有小于100个的元素,请把这些缺失的元素找出来?

十一、滴滴出行

一面:

1、三次握手和四次挥手,可否只用两次握手?

2、php生命周期

3、mysql的innodb和myisam的区别?两者各自索引的区别?

4、mysql的事务和事务隔离机制?

5、mysql有哪三类日志?慢查询日志,binlog日志,还有啥?binlog日志用来做主从同步的,mysql是串行还是并行,mysql主从同步是串行还是并行?共享锁和排他锁的区别

6、什么事死锁,怎么解决?

7、26进制:a~z代表0-25,ba代表26,ca代表52,baa代表26*26(类比10进制的10,20,100),现在给定一个很大的10进制数,请转成26进制数?

​8、滴滴打车订单数据的分库分表

二面:

1、PHP判断{函数/类/方法/属性}是否存在(滴滴面试题)

(1)判断类是否存在---class_exists

(2)判断系统函数或自己写的函数是否存在---function_exists

(3)判断类里面的某个方法是否已经定义---method_exists

(4)判断类里面的某个属性是否已经定义---property_exists

2、linux定时任务原理

3、如何检测一台机器是否宕机?

3.1、检测一台机器是否宕机的应用场景

3.2、检测一台机器是否宕机必须是可靠的

4、php多进程

5、设计一个短信发送平台

三面:

1、有序数组的二分查找和旋转有序数组的二分查找

2、分布式锁?

3、Yii2服务怎么分层的?---php框架分层模型

顺风车一面:

1、redis的

(1)zset的底层原理和操作和场景

(2)redis两种持久化方式?

(3)redis高可用的哨兵和集群

2、mysql的

(1)4大隔离机制

(2)innodb和myisam两种存储引擎的区别?如何取舍?

3、分布式id的生成:数据分布在10台机器上,如何保证id唯一?===>雪花算法

4、算法

(1)两大数的相加求和

(2)赛马决胜前三名

顺风车二面:

 

顺风车三面:

十二、阿里

1、悲观锁

2、设计模式的分类

3、字节与字符的区别

(1)定义:

(2)区别:

4、知道哪些服务器? 各自的区别?

(1)apache与nginx的区别。

(2)redis,robbitmq,kafka的区别。

5、一维数组存储平衡二叉树

6、数组的最大子列和

7、mysql里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?

8、手撕多进程与多线程

十三、一亩田

1、kafka高吞吐量的原因?

2、字符集utf8_mb4和utf8的区别?

3、主键索引和普通索引的区别?

4、1千万条记录,建立索引B+树,需要建几层?

5、[Linux]有个文件,内容就三列,用户id,时间,url,示例:1,2020-07-14 15:48:27,/index。查询某用户每天请求的url个数


一、洛可可设计

1、判断一个字符串A(ghtabcdef)是否包含另一个字符串B(bac),不考虑顺序。

str_split--将字符串转成数组
function actionIsInclude($a, $b)
{
    bool $found = false;
    $aArr = str_split($a);//无分隔符的字符串转成数组
    $bArr = str_split($b);
    $diffArr = array_diff($bArr, $aArr);
    if (!$diffArr) {
        $found = true;
    }
    return $found;
}


2、ip的正则表达式

四组是0-255
ip地址分4组,每组范围0-255
1位数:0-9 => \d
2位数:10-99 => [1-9]\d
3位数:100-255=100-199与200-249与250-255 => 1\d{2} 与2[0-4]\d与 25[0-5]
即: (\d)|([1-9]\d)|(1[0-4]\d)|(25[0-5])
所以:((\d\.)|([1-9]\d\.)|(1\d{2}\.)|(2[0-4]\d\.)|(25[0-5]\.){3}(\d)|([1-9]\d)|(1\d{2})|2[0-4]\d|(25[0-5]))

if ( preg_match('/((\d\.)|([1-9]\d\.)|(1\d{2}\.)|(2[0-4]\d\.)|(25[0-5]\.){3}(\d)|([1-9]\d)|1\d{2}|(2[0-4]\d)|(25[0-5]))/', $ip) ) {
    echo 't';
} else {
    echo 'f';
}

3、Restful动词中post,patch,put的区别?什么是安全?什么是幂等?哪些动词符合安全幂等?

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/91415168


4、写出LRU最近最久未被使用的页面置换算法的实现。哪些地方用到?如何将缓存存入redis

class LRUCacheInterface{
    int $maxSize;
    int $data[];
    public function put();
    public function size();
    public function containsKey();
    public function remove();
}

使用场景:缓存优化
https://www.cnblogs.com/acgoto/p/9852704.html
https://blog.csdn.net/a19990412/article/details/80826854


5、问:平常如何调试代码,答:看错误日志和Xdebug调试,问:Xdebug单步调试的原理与实际操作

https://blog.csdn.net/wang740209668/article/details/50588557 中有原理:

https://www.cnblogs.com/gpcuster/archive/2009/05/29/1491836.html

https://www.jianshu.com/p/8fb9ad0719c2 
使用PHPStorm + Xdebug + Firefox 单步调试PHP并分析代码性能

6、cookie-session,文件各自存在具体哪儿


7、手写二维数组查重和二维数组排序

二维数组查重:array_unique($arr, SORT_REGULAR);
二维数组排序:
$ages = array_column($arr, 'age'); 
array_multisort($column, SORT_REGULAR, $arr);

 

二、微博动漫

1、mysql注入,mysql各种索引,哪些连接词对索引无效?

还有如何注意其它myql安全;mysql索引:主键,普通索引,唯一索引,联合索引,对性能的影响(从读写2方面).哪些连接词对索引有效,哪些无效?

答:mysql注入:https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79774480

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
索引的遵循原则:1、最左侧原则,表的最左侧的一列,往往数据不会发生改变,不影响其他列的数据;2、命名短小原则,索引命名过长会使索引文件变大,损耗内存。
1普通索引(由关键字KEY或INDEX定义得到索引):加快数据的查询速度
一索引(由关键字UNIQUE把它定义为唯一索引):保证数据记录的唯一性
主键:一种特殊的唯一索引,在一张表中只能定义一个主键索引,用来标识唯一一条数据,用PRIMARY KEY创建。
联合索引:索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引,这就是联合索引。
索引可以极大的提高查询访问速度,但是会降低插入,删除,更新表的速度,因为在执行写操作的时候还要操作索引文件。

or is_null %like !=, in between,<=a<=部分失效,详见:

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/93191569

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/96484169

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/92989000


2、"24linux"+6=30

3、高并发,ElasticSearch

4、取一串url中的扩展

5、全局变量和静态变量

class A {
    $a = 'hello';
    public function M1()
    {
        $a = 'mysql';
        global $a;
        echo $a;
    }
    echo $a;
    M1();
}
的结果是hellohello

 

三、360金融

1、描述一下http协议里,header里的keep alive的作用


2、请写出php中array_开头的函数,并说明用途,至少6个


3、你是如何发现php运行中的错误呢?如果已知某个页面打开较慢,请问如何定位具体原因?

4、有10万个URL在一个文件中,每行一个URL,请写一个PHP函数,抓取这些URL网页中的内容,并把里面a标签的链接(<a href="http://www.facebook.com/"></a>)提取出来,保存在数据库里。

// https://blog.csdn.net/wakice/article/details/60870428
function curlSend($url)
{
	$imgArr = [];
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//将curl_exec()获取的信息以文件流的形式返回,而不是直接输出 
	curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36');//模拟浏览器
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);//10秒超时,set to zero for no timeout
	$res = curl_exec($ch);
	curl_close($ch);	
	$input = mb_convert_encoding($res, 'UTF-8', 'UTF-8,GBK,GB2312,BIG5');//使用该函数对结果进行转码
	preg_match_all('/<a[^>]*>[^>]+<\/a>/', $input, $output);// <a[^>]*>[^>]+</a> ,其中^>: 意思是非“>”的字符
	return $output[0]??[];
}
// https://www.cnblogs.com/mydesky2012/p/7121577.html
// a.txt的内容如下
// http://www.anqu.com
// https://www.163.com
$imgArr = [];
try {
	$file = fopen('/Users/xiafen/web/test.xf.com/a.txt', 'r'); //以只读的方式打开文件
	if ($file) {
		while (!feof($file)) {
			$item = fgets($file);//fgets()函数从文件指针中读取一行
			$itemArray = array_filter(explode("\n",$item)); // 将换行分割的各部分内容提取出来
            if (!empty($itemArray[0])) {
                echo count(curlSend($itemArray[0]));echo '<hr>';
				$imgArr = array_merge($imgArr, curlSend($itemArray[0]));
            }
		}
	}
	fclose($file);
	var_dump(count($imgArr));die;
} catch (Exception $exception) {
	var_dump([$exception->getCode(), $exception->getMessage()]);
}


5、请用C语言实现一个base62encode函数(写成PHP扩展的风格更佳)。

函数说明:base62encode函数把一个函数转成一个62进制的字符串,62进制顺序为012..89AB..YZab..yz(10个数字+26个大写字母+26个小写字母)

函数举例:base62encode(1)返回1,base62encode(61)返回z,base62encode(62)返回10

<?php

//加密
function base62_encode($data){
    $base62str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $data = strval($data);
    $base62 = str_split($base62str);
    $len = strlen($data);
    $i = 0;
    $tmpArr = array();
    while($i<$len){
        $val = $data[$i];
        $tmp = str_pad(decbin(ord($data[$i])),8,'0',STR_PAD_LEFT );
        $temp = str_split($tmp,4);
        $tmpArr = array_merge($tmpArr,$temp);
        ++$i;
    }
    $result = '';
    $i = 0;
    foreach($tmpArr as $arr){
        $temp = bindec($arr)*4+$i%2;
        $result .= $base62[$temp];
        ++$i;
    }
    return $result;
}

//解密
function base62_decode($data){
    $base62str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $data = strval($data);
    $base62 = str_split($base62str);
    $base62Arr = array_flip($base62);
    if(!preg_match('/[a-zA-Z0-9]+/',$data)){
        return false;
    }
    $len = strlen($data);
    $i = 0;
    $tempArr = array();
    while($i<$len){
        $temp = decbin(($base62Arr[$data[$i]]-$i%2)/4);
        $tempArr[] = str_pad($temp,4,'0',STR_PAD_LEFT);
        ++$i;
    }
    $result = '';
    $tempArr = array_chunk($tempArr,2);
    foreach($tempArr as $arr){
        $result .= chr(bindec(join('',$arr)));
    }
    return $result;
}


6、Mysql有哪几种存储方式,innodb与myisam的区别?如何选择?


7、数据库索引,C加索引,ABC加索引,请问下面的SQL语句,能否加索引?

a) where a=1 and b=2 and c=3
b) where b=2
c) where a>1 and b!=2
d) where a=1 and b>2 and c=3
e) where c=3 order by a
f) where b=2 order by a

a) 可以使用索引abc,abc三个列全部可以参与索引片定义,会产生一个最窄的索引片
b) 不使用索引
c) 可以使用索引abc,但只有a参与定义索引片
d) 可以使用索引abc,但只有a、b参与定义索引片,c只能用于回表过滤,这是个宽索引,注意a、b定义的索引片不能太厚,否则会产生大量随机读
e) 可以且只可以使用索引c,并有一次排序
f) 不能使用索引,有排序


8、简述如何查看当前系统的负载情况-uptime,tload,top,w,cat /proc/loadavg

1、uptime: 主要用于获取主机运行时间和查询linux系统负载等信息。
# uptime
02:03:50 up 126 days, 12:57, 2 users, load average: 0.08, 0.03, 0.05
10:19:04 up 257 days, 18:56, 12 users, load average: 2.10, 2.10,2.09

显示内容说明:
10:19:04 //系统当前时间 
up 257 days, 18:56 //主机已运行时间,时间越大,说明你的机器越稳定。 
12 user //用户连接数,是总连接数而不是用户数 
load average // 系统平均负载,统计最近1,5,15分钟的系统平均负载

 

那么什么是系统平均负载呢?
系统平均负载是指在特定时间间隔内运行队列中的平均进程数。 
如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能是良好的。
如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。 
如果你的linux主机是1个双核CPU的话,当Load Average 为6的时候说明机器已经被充分使用了。
1可以被认为是最优的负载值。负载是会随着系统不同改变得。
单CPU系统1-3和SMP系统6-10都是可能接受的。

 

2、cat /proc/loadavg
# cat /proc/loadavg
0.00 0.01 0.05 2/384 4482
0.00 0.01 0.05 表示最近1分钟,5分钟,15分钟 系统的平均负载; 系统负载越高,代表CPU越繁忙;
2/384 2代表此时运行队列中的进程个数;384 代表系统中进程的总数
4482 代表到此为止创建的最后一个进程的ID.

 

3、w
# w
02:14:34 up 126 days, 13:08, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 29Jul16 114days 0.63s 0.30s -bash
ceshi pts/0 118.247.5.122 02:03 0.00s 0.00s 0.00s w
  USER:用户名  
  TTY:录后系统分配的终端号           
  FROM: 远程主机名(即从哪儿登录来的)
  LOGIN@:何时登录
  IDLE:空闲了多长时间,表示用户闲置的时间。
  JCPU:和该终端(tty)连接的所有进程占用的时间,这个时间里并不包括过去的后台作业时间,但却包括当前正在运行的后台作业所占用的时间
  PCPU:指当前进程(即在WHAT项中显示的进程)所占用的时间   
  WHAT:当前正在运行进程的命令行

 

4、tload
# tload
0.23, 0.32, 0.45   
平均负载:0.23, 0.32, 0.45 表示最近1分钟,5分钟,15分钟的系统平均负载.

 

5、top
# top
top - 21:23:53 up 40 min,  2 users,  load average: 0.19, 0.35, 0.47
Tasks: 255 total,   1 running, 253 sleeping,   0 stopped,   1 zombie
%Cpu(s):  1.1 us,  0.3 sy,  0.0 ni, 98.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   4022756 total,  2130488 used,  1892268 free,   192608 buffers
KiB Swap: 19999740 total,        0 used, 19999740 free.   919724 cached Mem
第一行:时间为:21:23:53; 已经运行了 40min; 当前在线用户:2个;  平均负载:0.19, 0.35, 0.47 表示最近1分钟,5分钟,15分钟的系统平均负载.
第二行:进程总数:255 正在运行进程数:1  睡眠进程数:253 停止的进程数:0  僵尸进程数:1
第三行:用户空间占用CPU百分比: 1.1%  内核空间占用CPU百分比:0.3%  用户进程空间内改变过优先级的进程占用CPU百分比:0.0%   空闲CPU百分比:0.0  等待输入输出的CPU时间百分比:0.0  CPU服务软中断所耗费的时间总额:0.0% StealTime:0.0%
第四行: 物理内存总量:4022756  使用的物理内存总量:2130488  空闲内存总量:1892268   用作内核缓存的内存量:192608
第五行: 交换区总量:19999740   使用的交换区总量:0          空闲交换区总量:19999740 缓冲的交换区总量:919724      
第六行: 进程ID、进程所有者、优先级、nice值,负值表示高优先级,正值表示低优先级、进程使用的虚拟内存总量、进程使用的、未被换出的物理内存大小、共享内存大小、进程状态、上次更新到现在的CPU时间占用百分比、进程使用的物理内存百分比、进程使用CPU总时间、命令名、命令行


9、请用shell完成一个文本分析,文本的格式如下,需要统计一下倒数第3列数字之和

第一行:aaa,bbb,ccc,ddd,101,102,103,104,105
第二行:eee,fff,ggg,hhh,201,202,203,204,205
第三行:iii,jjj,kkk,lll,301,302,303,304,305
第N行:...
倒数第三列即为:求出103+203+303+..的和

https://blog.csdn.net/Alen_xiaoxin/article/details/79892050
用shell分析文本,统计文本每一行倒数第三列之和
https://blog.csdn.net/qq_36117775/article/details/80814244
shell编程——基本文本处理(四)之文本统计

#!/bin/bash
sum=0
for line in `awk -F ',' '{print $NF-2}' sum.txt`
do
	sum=$[$sum+$line]
done
echo $sum

10、在一台运行Apache的服务器上,如何查看当前HTTP的并发连接数(netstat)

https://blog.csdn.net/wl_1013/article/details/81291032
查看apache当前并发访问数和进程数
https://blog.csdn.net/andy1219111/article/details/9054277
查看 Apache并发请求数及其TCP连接状态
答:netstat -an | grep ESTABLISHED | wc -l


11、请描述下Memcache或Redis的内部实现方式


12、请设计一个短地址的服务(类似于微博的短地址)

需求:可以支持10亿条URL信息,需画出系统架构图,并说明如何保证服务的高性能和高稳定性,如果我需要申请一个memcached服务器来缓存100万条原始URL的数据,请问需要多个空间(需写明计算过程)

https://blog.csdn.net/weiren1101/article/details/51752493
短url的意义和实现(类似微博短url)

// https://www.cnblogs.com/lsl8966/p/3315204.html
// 仿新浪微博短网址PHP实现方案
// https://www.cnblogs.com/latteyan/articles/5845117.html
// 微博URL短网址生成算法原理及(java版、php版实现实例)

// 0b:二进制(零), 0:八进制(零), 0x:十六进制(零)
// $b = "echo 0x{$c};"; echo eval($b);//输入字符'e' => 0xe
function createUrl($url_info) {
    foreach($url_info as $key=>$row ){
        //已经是短网址了就不要处理了
        // if( false == $this->isShortUrl($row['url']) ){
            $base62 = [
            	"a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" ,  
	            "i" , "j" , "k" , "l" , "m" , "n" , "o" , "p" , "q" , "r" , "s" , "t" ,  
	            "u" , "v" , "w" , "x" , "y" , "z" , "0" , "1" , "2" , "3" , "4" , "5" ,  
	            "6" , "7" , "8" , "9" , "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" ,  
	            "I" , "J" , "K" , "L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" ,  
	            "U" , "V" , "W" , "X" , "Y" , "Z"
            ];
           
            $hex = md5($row['url']);
            $hexLen = strlen($hex);//32
            $subHexLen = $hexLen / 8;//4组
            $output = array();

            for ($i = 0; $i < $subHexLen; $i++) {
                $subHex = substr ($hex, $i * 8, 8);
                $int = (int)base_convert('3FFFFFFF', 16, 10) & (int)base_convert($subHex, 16, 10);
                $out = '';
                for ($j = 0; $j < 6; $j++) {
                	$val = base_convert('0000003D', 16, 10) & $int;
                    $out .= $base62[$val];
                    $int = $int>>5;
                }
                $output[] = $out;
            }
            //$this->urls[$output[0]] = $row['url'];
            //$row['url'] = $GLOBALS['u_short_server'].$output[0];
            //处理完了就删了,剩下的则原来就是短网址,直接返回给客户端即可
        	return $output;
        // }
    }
}

$res = createUrl([['url' => 'https://www.sina.com/']]);
var_dump($res);die;

13、大数据的搜索引擎——Elasticsearch

https://mp.weixin.qq.com/s/4A690N_JTNIObPyfVWOdtA

 

四、作业帮

前4题是面试的时候考的,后2题是觉得得准备的

1、php设置超时时间

1.修改php的配置文件,找到php.ini文件,然后找到max_execution_time= 30 ;//设置成你想要的值,单位是秒
这一行,这就是设置的执行时间最大值为30秒,你可以对这个值进行一下修改,改为你的期望值。(也可以直接设置成:max_execution_time= 0)
2.使用ini_set()函数,使用这个函数来改变你的最大执行时间限制值,如:ini_set('max_execution_time','50');
则设置为50秒,你也可以设置为0,那么就是不限制执行的时间。
3.使用set_time_limit()函数,set_time_limit(10),则表示最大执行时间加上10秒,但如果在php执行安全模式时,set_time_limit()将不会有结果

2、nginx有哪几种与php-fpm的通信方式?nginx与淘宝的tengine有什么区别?

(1)nginx 与 php-fpm 的通信有 tcp socket 和 unix socket 两种方式。

https://www.cnblogs.com/wish123/p/10460554.html
tcp socket 的优点是可以跨服务器,当 nginx 和 php-fpm 不在同一台机器上时,只能使用这种方式。
Unix socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信,这种方式需要在 nginx配置文件中填写 php-fpm 的 socket 文件位置。

(2)nginx与淘宝的tengine有什么区别

a、tengine是在nginx上面开发的,包含了nginx的性能。
b、tengine更适合大访问量网站的需求,相比nginx更加的稳定,性能更加的强劲。
据网络测试:Tengine相比Nginx默认配置,提升200%的处理能力。Tengine相比Nginx优化配置,提升60%的处理能力。
 


3、mysql有普通索引,唯一索引,主键索引,其中唯一索引与主键索引在底层结构上有什么不同?

https://www.cnblogs.com/rjzheng/p/9915754.html 

4、mysql隔离机制与锁:其中脏读与幻读的区别,分别怎么用锁?读锁?

5、多服务器如何保证数据一致性。服务器分配现场设计方案。

6、算法题

(1)优惠券排序

一个优惠券有面额和到期时间两种属性,按照面额从大到小排列,如果面额相同,按照到期时间的从小到大的顺序排列---快排

class Discount
{
    public $money;
    public $time;

    function __construct($money, $time)
    {
        $this->money = $money;
        $this->time = $time;
    }
}

$discounts = [];
for ($i = 0; $i < 10; $i++) {
    $discount = new Discount(rand(1, 10), time() - rand(1111, 9999));
    array_push($discounts, $discount);
}
print_r($discounts);

function quick_sort($ds)
{
    if (count($ds) <= 1) {
        return $ds;
    } else {
        $left = [];
        $right = [];
        for ($i = 1; $i < count($ds); $i++) {
            if ($ds[$i]->money > $ds[0]->money) {
                array_push($left, $ds[$i]);
            } else if ($ds[$i]->money < $ds[0]->money) {
                array_push($right, $ds[$i]);
            } else {
                if ($ds[$i]->time <= $ds[0]->time) {
                    array_push($left, $ds[$i]);
                } else {
                    array_push($right, $ds[$i]);
                }
            }
        }
        $left = quick_sort($left);
        $right = quick_sort($right);
        return array_merge($left, [$ds[0]], $right);
    }
}

$result = quick_sort($discounts);
print_r($result);

(2)有一个文件,里面每一行都是一个url,写一个算法,读取出现最多的五条及其出现的次数

https://www.jianshu.com/p/e765e3822676

 

五、顺丰科技

1、分布式锁

2、二维数组,行从小到达递增,列从小到大递增,判断一个数是否在其中?

3、2个有序链表的合并

4、如何平滑迁移数据库的表,如何分库分表(提示:保证两者一致后,再考虑业务)

5、事务的特性,这些特性是如何保证的?(四大隔离机制)

6、如何设计一个秒杀系统?(1)更新代入插入   (2)异步缓存

7、高并发如何提升性能

8、ElasticSearch

9、设计一个存储器,100万条数据,保证增删改查都是O(1)? (提示:hash+链表)

10、mysql有哪些锁,IS为何在S前加,IX为何在X前加?

1.首先IS/IX是意向锁,属于表级锁;而S/X是属于行级锁    2.意向锁的出现是为了更好细化锁的层级粒度,并且能提高锁处理性能:在数据库处理事务A请求的行级锁之前,会先申请该资源对应根目录资源的意向锁,以便能在其他事务B中再次请求表锁时做到阻塞    3.最后四种锁合理使用是:表锁、行锁同时使用

 

六、百度

1、A下有B、C,B下面有D和E,C下面也有D和E, 这相当于一个多叉树,如何判断一个树是否和这个一样?

2、(1)用一条sql求user_id=100,topic_id=1的未作答的question  (2)当百万条记录,并发也很高,如何加索引?

(1)select * from question as q left join userAnswer as a on q.id=a.question_id 
where q.topic_id=1 and a.user_id=100 and a.id is null;
注意1:是left join不是inner join。
注意2:a.id is null,不要写成a.id=null

(2)question_id和user_id字段分别添加单列索引。还有吗?

 

3、上百万条json,每条的字段content是json串,求ABCDE

第1条:{A:1,B:9,C:2,D:1,E:6}

第2条:{A:2,B:7,C:2,D:8,E:4}

第3条:{A:1,B:8,C:2,D:2,E:5}

......

第n条:{A:6,B:1,C:8,D:9,E:3}

当A选一个值,使得B有对应的下拉值可选,B选一个值,对应C有下拉值可选,..类似省市级联动的效果(提示:用ElasticSearch)

4、$a = [3,5,7,2];每个值代表柱形的一个高度,求max矩形面积(提示:单调栈)

5、yii里bindValue和bindProporety的区别?

bindParam() 和 bindValue() 非常相似。唯一的区别就是前者使用一个 PHP 变量绑定参数, 而后者使用一个值。对于那些内存中的大数据块参数,处于性能的考虑,应优先使用前者。

根据id查询一条数据,并对id进行过滤:
$id = 1;
$result = Yii::$app->db->createCommand("select * from product where id=:id")->bindParam(":id",$id,\PDO::PARAM_INT)->queryAll();
$result = Yii::$app->db->createCommand("select * from product where id=:id")->bindParam(":id",$id,\PDO::PARAM_STR)->queryAll();

更新一条数据:
$id = 1;
$name = 'xiaoming';
$result = Yii::$app->db->createCommand("update product set name=:name where id=:id")->bindParam(':id',$id,\PDO::PARAM_INT)->bindParam(':name',$name,\PDO::PARAM_INT)->execute();

以下写法在会报错:
$result = Yii::$app->db->createCommand()->delete('product',['name'=>':value'],'id=:id')-bindValue(':id',1,\PDO::PARAM_INT)->bindParam(':value',$user,\PDO::PARAM_INT)->execute();

6、max{a[j]-a[i]},股价的买入和卖出

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79644381

 

七、轻松筹:----技术200人,按职能(前端/后端/测试)分开

预复习:感觉应该加强大流量微服务,qbs相关的知识,另外缓存相关问的还比较多,设计模式也需要掌握。
高并发的四个角度:
首先是:无状态前端机器不足以承载请求流量,需要进行水平扩展,一般QPS是级。 
然后是:关系型数据库无法承载读取或写入峰值,需要数据库横向扩展或引入nosql,一般是千到级。 
之后是:单机nosql无法承载,需要nosql横向扩展,一般是十万到百万QPS。 
最后是:难以单纯横向扩展nosql,比如微博就引入多级缓存架构,这种架构一般可以应对百万到千万对nosql的访问QPS。 当然面向用户的接口请求一般到不了这个量级,QPS递增大多是由于读放大造成的压力,单也属于高并发架构考虑的范畴。
PV和QPS:
比如微博每天1亿多pv的系统一般也就1500QPS,5000QPS峰值。
比如有人说:2C4G机器单机一般1000QPS。8C8G机器单机可承受7000QPS。
写在后面:
具体多少QPS跟业务强相关,只读接口读缓存,将压力给到缓存单机3000+没问题,写请求1000+也正常,也复杂些可能也就几百+QPS。
所以QPS和业务场景和设计相关性很大,比如可以通过浏览器本地缓存,用缓存做热点数据查询,写事务MQ异步处理等方式提升QPS。

========如下是笔试题:

轻松筹-主要是go,有些代码是go,后期还是要转go
上来先做一张卷子

1、函数内部static和global关键字的作用,php魔术方法都有哪些,它们的作用是什么?

https://www.cnblogs.com/DolphWang/p/9271601.html

PHP变量-----作用域、global、static等关键字

global:[用于在函数内使用全局变量]在php中function体内无法使用全局变量,如果要使用的话,需要使用global关键字先声明在使用

static:[用于保留局部变量一直存在]当函数运行完毕时,函数内的变量都会被消除,如果还需要使用不希望被删除的话,使用static关键字。仅在第一次声明变量的时候使用

2、说一说用过的php开源框架CI、ThinkPHP、Laravel、Yaf、Phalcon的优缺点以及框架如何载入类的


3、使用php下载网络照片,有哪些方法?


4、什么是CSRF攻击?xss攻击?如何防范?


5、列举常用的设计模式并说说明其使用场景


6、简单描述类的依赖注入和反射机制,简述接口金额抽象类的区别和使用场景


7、静态变量的试题

<?php
$count = 5;
function get_count() {
    static $count = 0;
    return $count++;
}
//echo $count;echo '<hr>';//5
++$count;
//echo $count;echo '<hr>';//6
get_count();//无
echo get_count();//1
?>
输出值是=1

8、为一个论坛系统设计一套数据库表,要求使用MYSQL数据库,可以自己设想一些产品需求。

9、算法题

算法一:在未排序的数组中找到第k个最大的元素。

请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。
===>普通快排。从大到小的下标=k-1的元素 或者 从小到大的下标为n-k的元素

算法二:给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。

示例1:输入:num1="2",num2="3", 输出:"6"
示例2:输入:num1="123",num2="456",输出:"56088"
说明:num1和num2的长度小于110,num1和num2只包含数字0-9,num1和num2均不以零开头,除非是数字0本身。 
不能使用任何标准库的大数类型(Biginteger)或直接将输入转换为整数来处理。
===>字符串转换换成数字+位运算实现加减乘除

算法三:给定n个非负整数表示每个宽度为1的柱子的高度图,计算按次排列的柱子,下雨之后能接多少雨水。(单调栈)

示例:输入:[0,1,0,2,1,0,1,3,2,1,2,1], 输出:6
===>单调栈

========如下是面试题:

1、sql注入与XSS攻击

sql注入 xss攻击 csrf与xss攻击的详解与区别

2、pdo PDO最全面的疑难杂症汇总

3、innodb事务隔离级别,默认哪级,具体说说 数据库四大特性+四种隔离+详细操作

4、php自动(懒)加载 php懒加载(自动加载)

4、require和include区别 php require()和include()的区别

5、php变量:了解php源码中变量的容器zval吗?

A、PHP使用的回收算法是引用计数法,每个php变量存在一个叫"zval"的变量容器中。
B、一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是"is_ref",是个bool值,用来标识这个变量是否是属于引用集合(reference set)。 第二个额外字节是"refcount",用以表示指向这个zval变量容器的变量(也称符号即symbol)个数。
C、把一个变量赋值给另一变量,将增加引用次数(refcount),当任何关联到某个变量容器的变量离开它的作用域(比如:函数执行结束),或者对变量调用了函数unset()时,"refcount"就会减1。
D、变量容器在"refcount"变成0时就被销毁。

6、php怎么进行变量的生命周期管理?

https://www.cnblogs.com/mysic/p/4706210.html待整理

7、cgi与fastcgi Nginx+Php-fpm运行原理详解

8、单点登录,如果是集群10台单点登录呢????????????


9、索引结构,B+叶子结点存什么?非叶子结点存什么,范围是?主键索引的数据都存在叶子结点,那text类型也存在里面吗?

答:叶子节点存的是所有数据,叶子节点间用双向链表连接。非叶子节点不存数据,只存关键词和指针。非叶和叶子节点的范围[m/2,m],text由于是大文本类型,所以存在磁盘里,其他类型存在内存里。详见:mysql索引原理+优缺+使用原则+各类B树(360面试题)


10、memcache与redis区别?只存k-v结构时,用哪种好?redis单核占满的时候如何获取数据缓存?i/o,内存,cpu之间的区别?缓存在哪?

存储大小和内存有关,单核多核跟cpu有关,memcache的内存碎片,redis怎么进行内存清理。redis是单核的,那在它清理内存时,就把单核占满了,那此时要获取数据缓存,怎么办?

i/o,内存,cpu之间的区别?缓存在哪?-内存
如果清缓存要500毫秒,在这500毫秒之内,缓存get或set操作,此时会用到cpu吗?


11、进程,线程,协程的区别?用协程的好处?简述I/O多路复用?

进程、线程、协程、I/O多路复用的全面总结


12、会议室预约,同一时段,被多人选,怎么解决并发?

秒杀系统:【面试】秒杀系统+高并发+(服务|缓存)雪崩

 

13、redis做高可用的存储方案怎么做? kafka如何保持高可用,哈希一致性有了解吗?

Redis高可用方案 kafka消息队列 哈希一致性

 

14、选择排序与堆排序,及其时间复杂度。

 

 

八、字节跳动

(8.1)实战面试题

1、随便写一个排序算法,说明它的时间复杂度和空间复杂度,并详细解释这个复杂度是怎么算出来的?

2、array_walk和array_map的区别,这里提到有个区别是,返回值的不同,前者返回bool,后者返回数组

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78184763

3、yii2的自动加载机制?vendor里的composer是怎么加载进来的?spl_autoload_register?

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/104149040

4、yii2的事件和行为?我说了行为可以用来自动填充mysql的created_at和updated_at,又问了mysql自己的机制也能填充

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/80185991

5、yii2的最基础的类是?开始说了\yii\base\Application,然后说这不对,是Object!

6、yii2的依赖注入和容器化?

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/99270133

7、redis的5种数据结构,其中string的底层结构是什么?

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79635872

8、kafka怎么保证消息不丢失?kafaka的offset怎么设计的,有什么作用?

9、mysql索引的原理,有哪个索引是必须的?主键索引是唯一的

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79627488

 

(8.2)面试前搜罗的头条的相关面试题

https://blog.csdn.net/weixin_42232490/article/details/82466250

1、http协议知道吗?

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78507762

2、cookie session介绍一下

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/90236289

3、session表结构怎么设计,储存在哪里? 你们的session cookie在项目里运用到哪里?

session的存储结构:session_id(主键),token,user_id,created_at,expires_in

存储位置当然是在服务器端,但不是保存在内存中,而是保存在文件或数据库中。默认情况下,php.ini 中设置的 SESSION 保存方式是 files(session.save_handler = files)

如果访问量大,可能产生的 SESSION 文件会比较多,这时可以设置分级目录进行 SESSION 文件的保存,效率会提高很多,设置方法为:session.save_path="N;/save_path",N 为分级的级数,save_path 为开始目录。当写入 SESSION 数据的时候,PHP 会获取到客户端的 SESSION_ID,然后根据这个 SESSION ID 到指定的 SESSION 文件保存目录中找到相应的 SESSION 文件,不存在则创建之,最后将数据序列化之后写入文件。读取 SESSION 数据是也是类似的操作流程,对读出来的数据需要进行解序列化,生成相应的SESSION 变量。

4、TCP/UDP的区别介绍一下

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78507826

5、三次握手和四次挥手,time_wait是什么状态

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78772276

time_wait4个问题:1.time_wait状态是什么,2.为什么会有time_wait状态,3.哪一方会有time_wait状态,4.怎样避免time_wait状态占用资源

1.time_wait状态是什么??????????图????????????

通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态。客户端主动关闭连接时,会发送最后一个ack后,然后会进入TIME_WAIT状态,再停留2个MSL时间(后有MSL的解释),进入CLOSED状态。TIME_WAIT状态维持时间:TIME_WAIT状态维持时间是两个MSL时间长度,也就是在1-4分钟。Windows操作系统就是4分钟。

MSL时间:就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间IP数据包将在网络中消失 。MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒。

2.为什么会有time_wait状态?

1)可靠地实现TCP全双工连接的终止:TCP协议在关闭连接的四次握手过程中,最终的ACK是由主动关闭连接的一端(后面统称A端)发出的,如果这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,因此A端必须维护状态信息(TIME_WAIT)允许它重发最终的ACK。如果A端不维持TIME_WAIT状态,而是处于CLOSED 状态,那么A端将响应RST分节,B端收到后将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢失情况,主动关闭连接的A端必须维持TIME_WAIT状态 。

2)允许老的重复分节在网络中消逝:TCP分节可能由于路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能会引起问题。在关闭“前一个连接”之后,马上又重新建立起一个相同的IP和端口之间的“新连接”,“前一个连接”的迷途重复分组在“前一个连接”终止后到达,而被“新连接”收到了。为了避免这个情况,TCP协议不允许处于TIME_WAIT状态的连接启动一个新的可用连接,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个新TCP连接的时候,来自旧连接重复分组已经在网络中消逝。

3.哪一方会有time_wait状态?

time_wait状态是一般有client的状态,并且会占用port。有时产生在server端,由于server主动断开连接或者发生异常。

4.怎样避免time_wait状态占用资源?

假设是client,我们一般不用操心,由于client一般选用暂时port。再次创建连接会新分配一个port。除非指定client使用某port,只是一般不须要这么做。

假设是server主动关闭连接后异常终止。则由于它总是使用用一个知名serverport号,所以连接的time_wait状态将导致它不能重新启动。只是我们能够通过socket的选项SO_REUSEADDR来强制进程马上使用处于time_wait状态的连接占用的port。 通过socksetopt设置后,即使sock处于time_wait状态,与之绑定的socket地址也能够马上被重用。

此外也能够通过改动内核參数/proc/sys/net/ipv4/tcp_tw/recycle来高速回收被关闭的socket,从而是tcp连接根本不进入time_wait状态,进而同意应用程序马上重用本地的socket地址。

6、B树 B+树区别说一下,数据库平时用到过什么 咱们先问MySQL MySQL索引原理知道吗

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79627488

7、问了两种索引的区别(没记住...)

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/91359570 + 2019面试里的 综合一下

8、乐观锁悲观锁区别说一下

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79653840

innodb和myisam的区别

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/104108698

9、数据库四种隔离状态,分别有什么问题

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/104115096

10、redis的数据结构,sortset底层,原理,怎么保证有序

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79635872

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/54988982

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/81264172

题目:https://blog.csdn.net/zujipi8736/article/details/87441981 【19.2.14视频面试】

11、了解http,https吗?http中的状态码:500,501,502,503,504是什么意思。介绍一下cookie和session。

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78507762

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78507826

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/61918954

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/63252447 面试会考http头部包含哪些

12、技术面,涉及数据库优化,redis的使用

13、手写数据库查询语句以及索引优化,redis等缓存的使用。

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78412679

14、抖音的后端核心开发岗

一面,项目经历,问的比较细;mysql索引的建立原则;一致性哈希;二面,设计题,好友关系的设计;

web后台开发实习生(投的是php)

1、输入一个域名到访问到你的主页面中间发生了什么,单个服务器和多个服务器的过程分别是什么

2、说说你理解的thinkPHP和smarty,尽量详细

3、LAMP之间的关系

4、apache对于php是个什么角色

5、除了apache还了解哪些服务器

6、一系列的项目问题,你写的功能点怎么实现,换一种方式怎么实现,怎么优化。这个跟简历有关

7、怎么精确统计在线人数,除了用session还能用什么

7、不用用户id标识session怎么实现单点登录

9、怎么控制代码之间的关联性

10、取出一系列数中最大的五个数

11、sql优化

===================算法题如下===================

算法1:链表

(1)变形的链表反转:

给定一个单链表的头节点 head,实现一个调整单链表的函数,使得每K个节点之间为一组进行逆序,并且从链表的尾部开始组起,头部剩余节点数量不够一组的不需要逆序。(不能使用队列或者栈作为辅助)例如:链表:1->2->3->4->5->6->7->8->null, K = 3。那么 6->7->8,3->4->5,1->2各位一组。调整后:1->2->5->4->3->8->7->6->null。其中 1,2不调整,因为不够一组。
详见:https://www.zhihu.com/question/339135205/answer/794671353

(2)[删除链表中重复的节点]

在一个排序的链表中,存在重复的节点,请删除该链表中重复的节点,重复的节点不保留,返回链表头指针.例如,链表1-2-3-3-4-4-5处理后为1-2-5       详见:算法题分类汇总 中的四3

(3)链表的合并

合并2个有序链表(P剑145);两个单链表生成相加链表(P左59)

 

算法2:字符串:从一个字符串中找出无重复的最大子串  详见:P剑236,P左284

 

算法3:数组与矩阵

(1)多个有序数组的合并

a.将所有的元素放到一个数组中,直接进行排序,复杂度为O(nlogn)。
b.归并排序的变形。两两归并,假设所有元素和为n,由于归并排序的复杂度为O(nlogn),则即使最后一路归并复杂度都至少了O(nlogn)。log为以2为底。
代码详见:https://blog.csdn.net/zujipi8736/article/details/87441981 里的其他解决方案那块儿
c.堆排序的变形,使用优先级队列,建立一个m的小堆,复杂度为O(m),每次从堆中取最小值,然后将该值从堆中取出,堆中加入该数的后一个数,当一个数组遍历完后,将无穷大加入到大小为m的堆中。继续构建堆。 复杂度为nlog(m)。
代码详见:https://blog.csdn.net/weixin_40659011/article/details/89303076 (看了几个小时,看不懂)

(2)满足条件的子数组

->原题:求出一维数组中满足给定和的所有元素组合。(n选m问题)
->进阶:输出数组中和为定值的所有两(三)个数的组合
->原题解答:先将数据按从大到小进行排序,然后使用回溯法遍历所有可能。注意去掉重复的结果。
如:arr=[4,3,2,2,1,1],target=4。这样输出就有4个不同的组合相加为4:4,3+1,2+2,and 2+1+1。
https://blog.csdn.net/cxxmaker/article/details/7165947
->进阶解答:左351

算法6:进制转换

(1)36进制加法

https://blog.csdn.net/HHHheziyan/article/details/95040851
https://blog.csdn.net/hishentan/article/details/25503917

(2)华为笔试题:N进制求和计算问题

https://blog.csdn.net/xiaodeguang/article/details/52333596?locationNum=5&fps=1

算法7:LRU页面置换算法

https://www.cnblogs.com/acgoto/p/9852704.html

 

九、快手

六险一金,食堂包三餐, 房补2千,年假7天,周末加班,双倍工资/调休

 

十、北京掌上先机

1、web开发中遇到哪些安全性问题?

答:sql攻击,csrf攻击,xss攻击及其解决方案 sql注入 xss攻击 xss与csrf的详解与区别

2、前后端分离有用吗?好处是什么?

答:后端逻辑得到保护,不用被暴露在浏览器上。前端可以过滤阻断无效请求

3、cgi协议,fastcgi协议,fpm  [面试]Nginx+Php-fpm运行原理详解

4、$_POST 什么情况下接收不到post提交过来的参数?

答:只能接收form表单提交过来,xml或者其他的接收不到

5、15*34=532,在什么进制下成立?

例1、求使15*4=112成立的进制条件。
答:假设进制为n,则(1*n^1+5)*4 = 1*n^2+1*n^1+2;

例2、求使567*456=150216成立的进制条件。
答:假设进制为n,则(5*n^2+6*n+7)*(4*n^2+5*n+6)=1*n^5+5*n^4+2*n^2+1*n+6;化解得:20n^4+49n^3+88n^2+71n+42 = n^5+5n^4+2n^2+n+6;无法计算。
那么,我们两边同时对n取余(看数字的个位数字)得:42%n=6(表达式一);
然后,对两边同时除以n再对n取余(看数字的十位数字)得:(71+42/n)%n = 1(表达式二);
联立表达式一、二,得出答案 n=18。

6、判断四个点能否构成矩阵

答:Xc=(x1+x2+x3+x4)/4;Yc=(y1+y2+y3+y4)/4;
然后这个中心点如果到四个顶点的距离一样的话,就能否成

7、sql优化方案 常考数据库优化

8、逻辑推断题:甲乙丙三人,甲说乙说谎,乙说丙说谎,丙说甲乙都说谎了。这三人中只有一人说了真话,是谁?==>乙

9、数组a有99个元素,元素值范围1~100

(1)数组a中只有99个无序且不重复的元素,再不排序的前提下,怎么找出那缺失的元素值?

答:1+2+..+100的值减去数组元素所有值的和,就是该缺失值啦!


(2)如果a中有小于100个的元素,请把这些缺失的元素找出来?

设置一个标记数组,把愿数组遍历一遍,把无序不重复的值,作为键名,如果数组中有键值,键值标记为1。然后再把标记数组遍历一遍,就能找到缺失的值。伪代码如下:

$a99 = {...};
$pos[100] = {0};
for ( $a99 as $v ) {
    $pos[$v] = 1;
}
$out = [];
if ( $pos as $key => $val ) {
    if ($val == 0) {
        $out[] = $key;
    }
}
var_dump($out); 

十一、滴滴出行

一面:

1、三次握手和四次挥手,可否只用两次握手?


2、php生命周期


3、mysql的innodb和myisam的区别?两者各自索引的区别?

表t(id,a,b,c) 
===> where a=1 
===> where a=1 and c=2 
===> a=1 and b=3 and c=2
我说加联合索引abc,问:acb可以吗?又问:上面第3个查询,mysql会把查询语句优化着查嘛?

4、mysql的事务和事务隔离机制?


5、mysql有哪三类日志?慢查询日志,binlog日志,还有啥?binlog日志用来做主从同步的,mysql是串行还是并行,mysql主从同步是串行还是并行?共享锁和排他锁的区别


6、什么事死锁,怎么解决?


7、26进制:a~z代表0-25,ba代表26,ca代表52,baa代表26*26(类比10进制的10,20,100),现在给定一个很大的10进制数,请转成26进制数?


8、滴滴打车订单数据的分库分表

滴滴打车,每天的订单量3千万,几乎3天订单量就上亿了,现在需要分表。分表后满足如下查询:
===> 根据用户id获取订单列表
===> 根据订单id获取该订单的详情
===> 根据司机id获取订单列表
答:按照用户去分表,一个用户每天最多打车1-2次,一年300次足够,一张表假如上限是600万,那么一张表中可以存2万用户,用户id可以是系统生成的,1-2万第一张表,2万零1-4万第二张表...
第二个查询:订单id中可以包含日期,用户id,就可以查到了
但是查询第三个咋办?

推荐答案:订单号的后4位,2位是用户id后2位,2位是司机id后2位。然后根据用户和司机的id去hash到对应的买家库表和卖家库表,然后维系一张用户与订单号的关联表,关联表过大也可以分库分表。详见:https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/105166470

 

二面:

1、PHP判断{函数/类/方法/属性}是否存在(滴滴面试题)

(1)判断类是否存在---class_exists

bool class_exists(string $class_name [, bool $autoload = true])

(2)判断系统函数或自己写的函数是否存在---function_exists

bool function_exists(string $function_name) 

(3)判断类里面的某个方法是否已经定义---method_exists

bool method_exists(mixed $object, string $method_name) 

(4)判断类里面的某个属性是否已经定义---property_exists

bool property_exists(mixed $class, string $property)

 

2、linux定时任务原理

crond服务:该命令可以定期来执行系统任务。
Cron每分钟做一次检查,看看哪个命令可执行。
图??????
从上图可以看到,有4次fork,这4次fork分别是:
1) 第一个fork,让Cron自己成为Daemon进程,即成为守护进程;
2) 第二个fork,当Cron检查到有命令需要执行时被创建,但注意它并不执行命令,执行命令由它的子进程来做;
3) 第三个fork,有些版本调用的是vfork,但有些版本却是fork,它是负责执行Cron命令的进程,即会调用execle()的进程;
4) 第四个fork不是必须的,只有为Cron命令配置了标准输入才会用
:*/1 * * * * /tmp/X/x%1234567890
像上面有个百分符“%”,后面跟一串,则会有第四个fork,它的作用是将“%”后面的内容作为标准输入传递给第三个fork出来的进程。
更多详见:https://blog.csdn.net/weixin_34416649/article/details/91760963


3、如何检测一台机器是否宕机?

详见:https://iask.sina.com.cn/b/1H4XmuB0yMDr.html


3.1、检测一台机器是否宕机的应用场景

(1)工作机器宕机,总控节点需要能够检测到并且将原有服务迁移到集群中的其它节点。
(2)总控节点宕机,总控节点的备份节点(一般称为Slave)需要能够检测到并替换成主节点继续对外服务。

3.2、检测一台机器是否宕机必须是可靠的

A机器往B机器发送心跳包,如果B机器不发送响应,A无法确定B机器是宕机了还是过于繁忙,由于A和B两台机器的时钟可能不同步,B机器也无法确定多久没有收到A机器的心跳包可以认为必须停止服务。因此,A机器没有办法确定B机器已经宕机或者采取措施强制B机器停止服务。工程实践中,由于机器之间会进行时钟同步,我们总是假设A和B两台机器的本地时钟相差不大,比如相差不超过0.5秒。
(1)Lease机制(检测一台机器是否宕机)
Lease机制就是带有超时时间的一种授权。假设总控节点需要检测工作节点是否宕机,总控节点可以给工作节点发放Lease授权,工作节点持有有效期内的Lease才允许提供服务,否则主动下线停止服务。工作节点的Lease快要到期的时候向总控节点重新申请Lease(一般称为renewLease),总控节点定时检测所有工作机的Lease授权是否合法,如果发现某台工作机Lease失效,可以将工作机上的服务迁移到集群中的其它机器,这时因为工作机发现自己Lease失效会主动停止服务。当然,这里需要注意,由于总控节点和工作机的时钟可能不一致且有网络延迟,总控节点上的Lease超时时间要长,也就是说,如果工作节点的Lease超时时间是12秒,总控节点可能需要13秒后才能确认工作节点已经停止了服务,从而避免数据不一致问题。
(2)(Heartbeat+DRBD) / 分布式锁服务(同构节点之间的主节点选举)
比如总控节点宕机,备份节点需要能够检测并升级为主节点继续对外服务。
a.Heartbeat+DRBD:Mysql数据库经常采用Heartbeat + DRBD (Distributed Replicated Block Device) + Mysql的高可用性方案,据说能够达到3个9的高可用性,主节点和备节点维持Heartbeat心跳,当提供服务的主节点出现故障时,备节点的Heartbeat检测到主节点没有心跳(例如,Ping不通主节点),备节点自动接管虚拟IP,升级为主节点提供Mysql读写服务。
b.分布式锁服务:由于Heartbeat检测机器主节点宕机不可靠,这个方案存在众所周知的脑裂问题,即集群中可能同时存在多个主节点同时提供服务。解决这个问题本质上还是需要引入仲裁节点,比如Heartbeat + DRBD方案中引入Fence节点使出现问题的节点从集群中脱离,或者引入分布式锁服务,比如Chubby的开源实现Zookeeper服务。
分布式锁服务实现主节点选举大致如下:主节点和备节点到Chubby中抢锁,抢到锁的节点在锁的有效期(Lease期)内提供服务,当主节点锁的Lease快要到期时,主节点申请延长锁的超时时间,正常情况下分布式锁服务总是优先满足主节点的请求,当主节点出现故障时,备节点能够抢到锁切换为主节点提供服务。
(3)Grace Period的机制(总控节点宕机)
假设总控节点通过Lease机制检测工作节点是否宕机,这种方案是可靠的,不过当总控节点宕机时,如果不采取任何措施,集群中的所有工作节点都将因为无法重新申请Lease而停止服务,这就是带有总控节点的设计固有的脆弱性,某个设计或者编码的错误都有可能造成严重的影响。解决这个问题一般会有一个叫做Grace Period的机制,工作节点Lease超时时将停止服务,但是工作节点并不一开始就重启或者下线,而是处于一种危险状态(称为Jeopardy),这种状态持续一个Grace Period,比如45秒。如果在Grace Period 内总控节点重启,工作节点和总控节点重新联系上从而可以切换为正常状态继续提供服务。

4、php多进程

PHP利用多进程处理任务:https://blog.csdn.net/weixin_33770878/article/details/92255083
-------------------------------
写代码来解决多进程/线程同时读写一个文件的问题。

//PHP是不支持多线程的,可以使用php的flock加锁函数实现。
$fp = fopen("/tmp/lock.txt", "w+");
if (flock($fp, LOCK_EX)) { // 进行排它型锁定
fwrite($fp, "Write something here\n");
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't lock the file !";
}
fclose($fp);

5、设计一个短信发送平台

(1).总共有20个左右的管理员;
(2).每个管理员每天都可能创建 0 -10个短信发送任务;
(3).每次创建需要上传“一段70字的文本 + 手机号码包(一个包含500-500万条手机号的txt文件)”。每个手机号码包内,手机号唯一。不同的号码包之间可能手机号有交集重复。
(4).过滤规则:每个手机号最近7天收到的短信数不能超过2条;最近30天内不能超过8条;
(5).每次发送完毕之后,显示一共多少条手机号,过滤了多少条,发送成功了多少条;
(6).假设短信发送api每次可以发送20个号码的短信,响应时间为5ms;
(7).希望尽快将短信发完。
设计一下需要用什么样的流程、是否用mysql 数据库?是否用redis?有几个进程?答:我刚开始算的时候,是算发短信需要开几个进程,其实没必要,问题不是考察这个。这个让console命令行慢慢跑就好。
notify表:id,batch_id,notify_type,sender,receiver,content,is_sendok,send_date,send_time,created_at,updated_at
freq表:id,batch_id,receiver,received_date
Redis存储:每天凌晨1点,分别从freq表跑前6天和前29天的每个手机号的频次,写入对应的hashMap
API接口:
--->1:过滤检改手机号在hashMap的2个key对应的值分别是否超过2和8,
--->2:过滤后的手机号每20个一批写入notify表
--->3:计算进程
console命令行:调用API接口执行发短信的脚本(一条一批),成功之后,写入notify表和freq表,并更新redis的hashMap的2个key

问题:写入(api接口/redis)一条需要3ms,500w条=3ms*500w=15000s/一小时3600s=4.2h,肯定要多进程处理,怎么开多进程?
解答:详见第4问的多进程。

三面:

1、有序数组的二分查找和旋转有序数组的二分查找

旋转有序数组的二分查找:https://www.cnblogs.com/cling-cling/p/4875961.html

有序数组的二分查找:

#include <iostream>
using namespace std;
int BSearch(int *arr, int len, int X){
    int L = 0, R = len - 1, m;
    while (L <= R) {//循环条件
        m = (L + R) / 2;
        if (arr[m] == X) {//找到了直接返回
            return m;
        } else if (arr[m] < X) {
            L = m + 1;
        } else {
            R = m - 1;
        }
    }
    return -1;//循环结束也没找到
}
int main()
{
	int len = 8;
    int arr[8] = {1,3,5,7,8,12,15,18};
    cout<<BSearch(arr, len, 7)<<endl;
    return 0;
}

旋转有序数组的二分查找

数组中没有重复元素

(1)arr[m]=X,返回m

(2)arr[m]<arr[R],m右侧有序。

(3)arr[m]>=arr[R],m左侧有序。

这里中位数和arr[L]比较也行。

代码详见下图:

数组中重复元素

(1)arr[m]=X,返回m

(2)arr[m]<arr[R],m右侧有序。

(3)arr[m]>arr[R],m左侧有序。

(4)arr[m]=arr[R],相等,特殊处理,R=R-1

这里中位数和arr[L]比较也行。

举例如下:

下标:0 1 2 3

元素:2 2 1 2

arr[4]={2 2 1 2}中查寻1,(中位数arr[1]=2) == (arr[R]=2), R=R-1,范围缩小至arr[0]到arr[2

代码详见下图:
#include <iostream>
using namespace std;
int BSearch(int *arr, int len, int X){
    int L = 0, R = len - 1, m;
    while (L <= R) {//循环条件
        m = (L + R) / 2;
        if (arr[m] == X) {//找到了直接返回
            return m;
        } else if (arr[m] < arr[R]) {//右侧有序
            if (arr[m] < X && X <= arr[R]) {
                L = m + 1;
            } else {
                R = m - 1;
            }
        } else {//左侧有序
            if (arr[L] <= X && X < arr[m]){
                R = m - 1;
            }
            else {
                L = m + 1;
            } 
        }
    }
    return -1;//循环结束也没找到
}
int main()
{
	int len = 8;
    int arr[len] = {3,4,5,6,7,0,1,2};
    cout<<BSearch(arr, len, 1)<<endl;
    return 0;
}
#include <iostream>
using namespace std;
int BSearch(int *arr, int len, int X){
    int L = 0, R = len - 1, m;
    while (L <= R) {//循环条件
        m = (L + R) / 2;
        if (arr[m] == X) {//找到了直接返回
            return m;
        } else if (arr[m] < arr[R]) {//右侧有序
            if (arr[m] < X && X <= arr[R]) {
                L = m + 1;
            } else {
                R = m - 1;
            }
        } else {//左侧有序
            if (arr[L] <= X && X < arr[m]){
                R = m - 1;
            }
            else {
                L = m + 1;
            } 
        }
    }
    return -1;//循环结束也没找到
}
int main()
{
	int len = 8;
    int arr[len] = {3,4,5,6,7,0,1,2};
    cout<<BSearch(arr, len, 1)<<endl;
    return 0;
}

 

2、分布式锁?

setnx,超时释放,getset

Zookeeper实现分布式锁 & 分布锁的对比  

Redis分布式锁

3、Yii2服务怎么分层的?---php框架分层模型
 

 

顺风车一面:

1、redis的

(1)zset的底层原理和操作和场景

zset=ziplist(元素长度<64B,元素数量<512个)+skiplist
set=intset(元素是整数,元素数量<512个)+hashtable
hash=ziplist+hashtable
list=ziplilst+linkedlist
string=int(<21B的数字)+embstr(<39B的短字符串)+raw(>39B的长字符串)

操作:
string:set/setnx/mset/msetnx,get/mget/getset,incr/incrby,decr/decrby,strlen
list:lpush/rpush,lpop/rpop,brpopllpush(弹出+插入),lrem(删),lrange(范围查)
hash:hset/hsetnx/hmset,hget/hmget/hgetall,hkeys(所有字段)/hlen(字段个数)
set:sadd(加),srem(指定删)/spop(随机删),smembers(列举所有),sinter(交集),sdiff(差集)
zset:zadd(加),zrange(范围查),zrank(排序),zcard(总个数),zcount(范围个数)

场景:
string:a.普通键值对;b.封锁某ip地址(访问超过几次)用incrb原子递增计数
list:最新消息排行
hash:存于公户对象数据:用户(姓名,学号,成绩,专业,性别)
set:a.存不重复的list列表数据,如微博好友存一个set中,求两人的共同好友可用sdiff;b.判断某成员是否在某集合
zset:a.推荐阅读栏的阅读量前10名的排行;b.需要精准设定过期时间的应用

问2:这8个底层数据结构的原理?
答:

问3:embstr和raw在SDS上区别?embstr优缺点?
【两者同:都是sds动态字符串
两者异:对于redis和sds,embstr是将这2个分配在一块内存,raw是对这2个各分配一块内存】
【embstr优:创建和释放只需分配一次内存
embstr缺:embstr是只读模式,无法直接改,真要改,先转换为raw再进行修改。】

问4:redis的hash结构,hash桶满了怎么办?

问5:还知道其他数据类型吗?
答:说了布隆过滤器,顺带说了:
redis缓存雪崩的解决--->一致性hash
redis缓存击穿的解决--->设置key用不过期
redis缓存穿透的解决--->布隆过滤器(bitmap中已存在--->存在/不存在;bitmap中不存在--->一定不存在)

问2:一致性hash的问题?=>hash形倾斜,为何倾斜?=>
答:a.比如12个机器分配在圆环的12个位置,比如4位置机器挂了,原本到4的流量都到5那了,造成5的负载很重;
b.机器本身个数不多


问3:布隆过滤器中为何bitmap中已存在--->存在/不存在?
答:布隆过滤器的核心实现是一个超大的位数组和几个哈希函数。假设某个元素A通过三个映射函数映射对应下标为4,5,6这3个点。虽然这3个点都为1,但它可能是由别的元素B经过哈希得到的位置,所有存在误判率。


(2)redis两种持久化方式?

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/104437448  Redis面试高频考点
RDB和AOF,详见:https://juejin.im/post/5d405370e51d4561fa2ebfe8  redis的AOF持久化

问2:RDB的持久化如果手动提交,用哪个?=> save命令

(3)redis高可用的哨兵和集群

问1:redis哨兵:https://juejin.im/post/5dc3a9fbf265da4d3c072eab《吊打面试官》系列-Redis哨兵、持久化、主从、手撕LRU

问2:知道codes吗?是redis集群的一种,还有其它的么?

codes类似于负载均衡nginx的一种,如果有10台redis机器负载均衡,则用codes充当nginx负载均衡的作用,codes接收请求,然后向后端分发。

问3:redis-cluster这种redis自带的集群有了解吗?


2、mysql的

(1)4大隔离机制

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/104115096  数据库四大特性+四种隔离+详细操作

(2)innodb和myisam两种存储引擎的区别?如何取舍?

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/104108698  innodb与myisam区别、内存碎片

3、分布式id的生成:数据分布在10台机器上,如何保证id唯一?===>雪花算法

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/105166614 订单号的生成(分布式ID生成器)

4、算法

(1)两大数的相加求和


(2)赛马决胜前三名

36匹马,6个赛道,每个赛道只容一匹马跑,请问最少需要比几次可以决胜出最快的前三匹?=>8次
step1:6次
分A至F6个组,每组取前3名,(A1,A2,A3),(B1,B2,B3)...(F1,F2,F3)

step2:1次
每组取第1名比赛(A1,B1,...,F1),假如,A1,B1,C1分别是前三名
===>则整组排除组内第1名未进前三的DEF组;C组中C1最多第三名,则排除C2和C3;
====>第一名是A1,则第2和第3名在(A2,A3,B1,B2,B3,C1)

step3:1次
(A2,A3,B1,B2,B3,C1)比赛,取前2名

 

顺风车二面:

 

顺风车三面:

 

 

 

 

 

十二、阿里

1、悲观锁

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/105987795

2、设计模式的分类

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79736735

3、字节与字符的区别

(1)定义:

字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位。
字符是指计算机中使用的文字和符号,比如1、2、3、A、B、C、~!·#¥%……—*()——+、等等。

(2)区别:

它们完全不是一个位面的概念,所以没有区别之分。不同编码里,字符和字节的对应关系不同。

编码字符与字节的对应关系
ASCII码一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。
UTF-8编码一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
Unicode编码一个英文等于两个字节,一个中文(含繁体)等于两个字节。符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。
UTF-16编码一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。
UTF-32编码世界上任何字符的存储都需要4个字节。

4、知道哪些服务器? 各自的区别?

(1)apache与nginx的区别。

      https://m.php.cn/apache/433727.html

(2)redis,robbitmq,kafka的区别。

https://www.cnblogs.com/hdu-2010/p/7690948.html
https://zhuanlan.zhihu.com/p/60288391

5、一维数组存储平衡二叉树

 https://blog.csdn.net/silentwolfyh/article/details/76946539

6、数组的最大子列和

 https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/70186606

7、mysql里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?

把Redis当缓存来用.提供一种简单实现缓存失效的思路: LRU(最近少用的淘汰) 即redis的缓存每命中一次,就给命中的缓存增加一定ttl(过期时间)(根据具体情况来设定, 比如10分钟).一段时间后, 热数据的ttl都会较大, 不会自动失效, 而冷数据基本上过了设定的ttl就马上失效了。计算一下 20W 数据大约占用的内存,然后设置一下 Redis 内存限制。

8、手撕多进程与多线程

  PHP中利用pcntl实现多进程

 

十三、一亩田

农产品BtoB,农产品产地-to-批发地,有维护季度技术月刊。

1、kafka高吞吐量的原因?

https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/104716221 的第86问
https://www.cnblogs.com/sujing/p/10960832.html kafka原理

2、字符集utf8_mb4和utf8的区别?

utf8mb4的编码,mb4就是most bytes 4,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。
3B=24B,2^24-1=1677万7216;3B=24B,2^24-1=1677万7216===> 千万级别
4B=32bit,2^32-1=42亿94967296=========================> 十亿级别
utf8的优缺点:
优:节约空间,能支持存储大部分中文汉字。
缺:3个字节的UTF-8最大能编码的Unicode字符是0xffff,也就是Unicode中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用utf8字符集存储。包括Emoji表情(Emoji是一种特殊的Unicode编码,常见于ios和android手机上),和很多不常用的汉字,以及任何新增的Unicode字符等等

3、主键索引和普通索引的区别?


4、1千万条记录,建立索引B+树,需要建几层?

假设B+树高为2,即存在一个根节点和若干个叶子节点,那么这棵B+树的存放总记录数为: 根节点指针数*单个叶子节点记录行数 
(1)单个叶子节点(页)中的记录数=16K/1K=16。(这里假设一行记录的数据大小为1k,实际上现在很多互联网业务数据记录大小通常就是1K左右)
(2)假设主键ID为bigint类型,长度为8B,而指针大小在InnoDB源码中设置为6B,这样一共14字节,我们一个页(16K=2^14=16384)中能存放多少这样的单元,其实就代表有多少指针,即:16384/14=1170
综上,2层B+树总记录数=(16K/14B=1170)*(16K/1K=16)=18720---万级别
同理,3层B+树总记录数=1170*1170*16=21942400--------------千万级别

所以在InnoDB中B+树高度一般为1-3层,它就能满足千万级的数据存储。在查找数据时一次页的查找代表一次IO,所以通过主键索引查询通常只需要1-3次IO操作即可查找到数据。
http://blog.itpub.net/69917606/viewspace-2655638/ 千万级别的数据库优化:水平拆分和垂直拆分+悲观锁和乐观锁

5、[Linux]有个文件,内容就三列,用户id,时间,url,示例:1,2020-07-14 15:48:27,/index。查询某用户每天请求的url个数

(1)查询id=1的用户的个数
$awk -F, '{if($1=="1") arr[$1]++}END{print arr[$1],$1}' access10.log
(2)查询各个用户的个数
$awk -F, '{arr[$1]++}END{for (i in arr) print arr[i],i}' access10.log|sort -k1 -r

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值