[PHP面试题]跳槽面试必背-自己最近5年的整理(二)

 

看完这些还怕进不了大厂/p>

[PHP面试题]跳槽面试必背-自己最近5年的整理(一)

[PHP面试题]跳槽面试必背-自己最近5年的整理(三)

PHP经典面试题集(含答案)

面试12家公司,收获9个offer,2020年PHP 面试问题

100 个常见的 PHP 面试题和答案分享

PHP 面试遇到的问题,后期会不定期更新一下,大家也可以把认为经典的问题评论留言,感谢大家!

 

51.express 如何获取 get post 参数的/p>

我的官方群点击进入

get req.query post // 引入表单处理模块 var bodyParser = require(‘body-parser’); / 设置 url 解析 规则 // app.use(bodyParser.json()); // for parsing application/json 可以加 可以 不加 // 必须加 app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form- urlencoded // 处理 post 参数 req.body

 

52.socket 如何发送和接收消息/p>

// 发送消息 socket.emit(‘jyzj’, ‘您多大了); // 点击按钮 发送消息 document.getElementById(‘btn’).onclick = function () { socket.emit(‘s80’, ‘渣男’); // socket.emit(‘jyzj’, ‘打狗棍法!天下无狗!’); }; // 监听回答 socket.on(‘action’, function (msg) { alert(‘xxx: ‘ + msg); }); // 接收消息的方法 socket.on(‘event’,function(msg){ 接收到消息的业务逻辑操作 }); socket.on(‘s80’, function (msg) { console.log(‘接收的消息’+msg); socket.emit(‘action’, ‘我就是渣男,不服来砍我!’); // 关于emi方法的备注 // console.log(io);console.log(socket); // 结果一样 // 使用socket.emit 和io.emit是一个方法. // 但是常用是socket.emit })

 

53. b2b2c o2o p2p CRM ERP OA 分别是什么/p>

 

54. 微信订阅 和服务 的区别/p>

这个有人知道嘛/p>


我的官方群点击进入

 

区福利安排PHP进阶架构资料,免费获取

【 群福利】30G-PHP进阶资料,助力大家都能30K


 

55. 如何完成微信的接口配置以及配置失败的原因/p>

填写的URL需要正确响应微信发送的Token验证

失败原因未删除里面的html文件

 

56. 如何获取微信发送的内容/p>

$postStr = file_get_contents(“php://input”);

 

57.php 是单线程还是多线程

单线程

 

58. 什么是依赖注入,解决了那些问题

1.什么是依赖注入

依赖注入是控制反转的一种实现,实现代码解耦,便于单元测试。因为它并不需要了解自身所依赖的类,而只需要知道所依赖的类实现了自身所需要的方法就可以了。

2.解决那些问题

依赖之间的解耦

单元测试,方便Mock

理解依赖注入与控制反转 | Laravel China 区…

 

59. 什么是控制反转

控制反转 是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection, DI), 还有一种叫”依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

 

60. 服务器之间如何共享 session

1.通过数据库mysql共享session a.采用一台专门的mysql服务器来存储所有的session信息。 用户访问随机的web服务器时,会去这个专门的数据库服务器check一下session的情况,以达到session同步的目的。 缺点就是:依懒性太强,mysql服务器无法工作,影响整个系统; b.将存放session的数据表与业务的数据表放在同一个库。如果mysql做了主从,需要每一个库都需要存在这个表,并且需要数据实时同步。 缺点:用数据库来同步session,会加大数据库的负担,数据库本来就是容易产生瓶颈的地方,如果把session还放到数据库里面,无疑是雪上加霜。上面的二种方法,第一点方法较好,把放session的表独立开来,减轻了真正数据库的负担 。但是session一般的查询频率较高,放在数据库中查询性能也不是很好,不推荐使用这种方式。 2.通过cookie共享session 把用户访问页面产生的session放到cookie里面,就是以cookie为中转站。 当访问服务器A时,登录成功之后将产生的session信息存放在cookie中;当访问请求分配到服务器B时,服务器B先判断服务器有没有这个session,如果没有,在去看看客户端的cookie里面有没有这个session,如果cookie里面有,就把cookie里面的sessoin同步到web服务器B,这样就可以实现session的同步了。 缺点:cookie的安全性不高,容易伪造、客户端禁止使用cookie等都可能造成无法共享session。 3.通过服务器之间的数据同步session   使用一台作为用户的登录服务器,当用户登录成功之后,会将session写到当前服务器上,我们通过脚本或者守护进程将session同步到其他服务器上,这时当用户跳转到其他服务器,session一致,也就不用再次登录。   缺陷:速度慢,同步session有延迟性,可能导致跳转服务器之后,session未同步。而且单向同步时,登录服务器宕机,整个系统都不能正常运行。 4.通过NFS共享Session   选择一台公共的NFS服务器(Network File Server)做共享服务器,所有的Web服务器登陆的时候把session数据写到这台服务器上,那么所有的session数据其实都是保存在这台NFS服务器上的,不论用户访问那太Web服务器,都要来这台服务器获取session数据,那么就能够实现共享session数据了。   缺点:依赖性太强,如果NFS服务器down掉了,那么大家都无法工作了,当然,可以考虑多台NFS服务器同步的形式。 5.通过memcache同步session   memcache可以做分布式,如果没有这功能,他也不能用来做session同步。他可以把web服务器中的内存组合起来,成为一个”内存池”,不管是哪个服务器产生的sessoin都可以放到这个”内存池”中,其他的都可以使用。   优点:以这种方式来同步session,不会加大数据库的负担,并且安全性比用cookie大大的提高,把session放到内存里面,比从文件中读取要快很多。   缺点:memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。 6.通过redis共享session   redis与memcache一样,都是将数据放在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

 

61.session 和 cookie 的区别

cookie session 位置 浏览器 服务器 特点 方便和js交换 高效安全 获取用户信息 不依赖浏览器环境 风险 用户禁用cookie 替代 url参数

 

62.cookie 禁用后如何使用 session

1、设置php.ini的session.use_trans_sid = 1或者打开enable-trans-sid选项,让PHP自动跨页传递session id。 2、手动通过URL传值、隐藏表单传递session id。 3、用文件、数据库等形式保存session_id,在跨页过程中手动调用。

 

63.PSR 规范

psr-1是基本代码规范 psr-2是代码风格规范 psr-3是日志接口规范 psr-4是为了解决自动加载 psr-6是缓存接口规范 psr-7是HTTP消息接口规范 psr.phphub.org/

 

64.git 高级命令

git rebase 在新位置重新提交 git revert 撤销commit git reset 丢弃提交 git stash 临时存放工作目录的改动 git reflog 找回分支 git-scm.com/docs Pro Git(中文版)

 

65.PHP 如何实现多继承

1.接口单继承

2.接口多继承

3.trait

4.PHP 默认并不支持多线程,要使用多线程需要安装 pthread 扩展,而要安装 pthread 扩展

php.net/manual/zh/language.oop5.tra…

www.cnblogs.com/jkko123/p/6351604….

trait 示例

<hp trait ezcReflectionReturnInfo { function getReturnType() { /*1*/ } function getReturnDescription() { /*2*/ } } class ezcReflectionMethod extends ReflectionMethod { use ezcReflectionReturnInfo; /* … */ } class ezcReflectionFunction extends ReflectionFunction { use ezcReflectionReturnInfo; /* … */ } gt;

 

66. 进程,协程,线程

进程是程序执行是的一个实例,进程能够分配给cpu和内存等资源。进程一般包括指令集和系统资源,其中指令集就是你的代码,系统资源就是指cpu、内存以及I/O等。 进程是一个程序在一个数据集中的一次动态执行过程,可以简单理解为“正在执行的程序”,它是CPU资源分配和调度的独立单位。 进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。 进程的局限是创建、撤销和切换的开销比较大。 线程是进程的一个执行流,线程不能分配系统资源,它是进程的一部分,比进程更小的独立运行的单位。 解释一下:进程有两个特性:一是资源的所有权,一个是调度执行(指令集),线程是调度执行中的一部分,是指进程执行过程的路径,也叫程序执行流。线程有时候也叫轻量级进程。 线程是在进程之后发展出来的概念。 线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。一个进程可以包含多个线程。 线程的优点是减小了程序并发执行时的开销,提高了操作系统的并发性能,缺点是线程没有自己的系统资源,只拥有在运行时必不可少的资源,但同一进程的各线程可以共享进程所拥有的系统资源,如果把进程比作一个车间,那么线程就好比是车间里面的工人。不过对于某些独占性资源存在锁机制,处理不当可能会产生“死锁”。 协程是一种用户态的轻量级线程,又称微线程,英文名Coroutine,协程的调度完全由用户控制。人们通常将协程和子程序(函数)比较着理解。 子程序调用总是一个入口,一次返回,一旦退出即完成了子程序的执行。 协程的起始处是第一个入口点,在协程里,返回点之后是接下来的入口点。在python中,协程可以通过yield来调用其它协程。通过yield方式转移执行权的协程之间不是调用者与被调用者的关系,而是彼此对称、平等的,通过相互协作共同完成任务。其运行的大致流程如下: 第一步,协程A开始执行。 第二步,协程A执行到一半,进入暂停,通过yield命令将执行权转移到协程B。 第三步,(一段时间后)协程B交还执行权。 第四步,协程A恢复执行。 协程的特点在于是一个线程执行,与多线程相比,其优势体现在: * 协程的执行效率非常高。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。 * 协程不需要多线程的锁机制。在协程中控制共享资源不加锁,只需要判断状态就好了。 Tips:利用多核CPU最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。 进程,线程,协程-阿里云开发者 区 www.php.cn/php-weizijiaocheng-39314…

 

67.php 反射

http://php.net/manual/zh/book.reflection.php

 

 

69. 自定义菜单

1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。

2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“…”代替。

 

70. 写出四个自定义菜单按钮类型

 

71. 写出四个接受消息类型

写出四个接收消息类型( 文本消息 图片消息 语音消息 视频消息 小视频消息 地理位置消息 链接消息 )。

 

72. 模板内容中部必须为多少个个 “关键词名称:关键词内容参数” 的组合排列

 

73. 在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过 ( media_id ) 来进行的。

 

74. 模板消息不允许在用户没做任何操作或未经用户同意接收的前提下,主动下发消息给用户

 

75. 模板消息内容不能做营销、推广

 

76. 对于临时素材,每个素材会在开发者上传或粉丝发送到微信服务器 3 天后自动删除

媒体文件在微信后台保存时间为3天,即3天后media_id失效。

 

77. 含有明示或暗示用户分享的文案、图片、按钮、弹层、弹窗,不属于诱导分享

 

78. 企业 、服务 、订阅 区别

企业 服务 订阅 消息次数限制 最高每分钟可群发 200 次 每月主动发送消息不超过 4 条 每天群发一条 验证关注者身份 通讯录成员可关注 不论什么微信用户扫码就可以关注 不论什么微信用户扫码就可以关注 消息保密 消息可转发、分享。支持保密消息,防成员转发 消息可转发、分享 消息可转发、分享 高级接口权限 支持 支持 不支持 定制应用 可依据须要定制应用,多个应用聚合成一个企业 不支持。新增服务 须要又一次关注。 不支持,新增服务 须要又一次关注。

 

 

80. 页授权用户消息流程步骤

1、引导用户进入授权页面同意授权,获取code 2、通过code换取 页授权access_token(与基础支持中的access_token不同) 3、如果需要,开发者可以刷新 页授权access_token,避免过期 4、通过 页授权access_token和openid获取用户基本信息(支持UnionID机制)

 

81. 描述小程序的框架

框架名称:MINA (MINA IS NOT APP) 是在微信中开发小程序的框架。 框架结构 :MINA 框架由两部分组成。视图层 (View) 和逻辑层 (App Service)。 框架特征:响应式的数据绑定 (MINA 用响应式数据绑定的方式,在视图层和逻辑层之间进行通信。从某种程度上,可以看成是 MVVM 模式。) 结构:MINA 程序包含一个描述整体程序的 app 和多个描述各自页面的 page。 一个 MINA 程序主体部分由三个文件组成,必须放在根目录下。 Paste_Image.png 一个 MINA 页面由四个文件组成。如下图

 

82. 检测是否是微信浏览器

判断浏览器是否是微信内置浏览器主要通过UserAgent或者WeiXinJSBridge两种方式进行

 

83. 浏览器内核有哪些/p>

1、Trident内核:代表作品是IE,因IE捆绑在Windows中,所以占有极高的份额,又称为IE内核或MSHTML,此内核只能用于Windows平台,且不是开源的。 代表作品还有腾讯、Maxthon(遨游)、360浏览器等。但由于市场份额比较大,曾经出现脱离了W3C标准的时候,同时IE版本比较多, 存在很多的兼容性问题。 2、Gecko内核:代表作品是Firefox,即火狐浏览器。因火狐是最多的用户,故常被称为firefox内核它是开源的,最大优势是跨平台,在Microsoft Windows、Linux、MacOs X等主 要操作系统中使用。 ozilla是 景公司在第一次浏览器大战败给微软之后创建的。有兴趣的同学可以了解一下浏览器大战 3、Webkit内核:代表作品是Safari、曾经的Chrome,是开源的项目。 4、Presto内核:代表作品是Opera,Presto是由Opera Software开发的浏览器排版引擎,它是世界公认最快的渲染速度的引擎。在13年之后,Opera宣布加入谷歌阵营,弃用了 resto 5、Blink内核:由Google和Opera Software开发的浏览器排版引擎,2013年4月发布。现在Chrome内核是Blink。谷歌还开发了自己的JS引擎,V8,使JS运行速度极大地提高了

 

84.php-fpm 是什么

PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是一个PHPFastCGI管理器,对于PHP 5.3.3之前的php来说,是一个补丁包 [1] ,旨在将FastCGI进程管理整合进PHP包中。如果你使用的是PHP5.3.3之前的PHP的话,就必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。 相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼。 php-fpm是 FastCGI 的实现,并提供了进程管理的功能。 进程包含 master 进程和 worker 进程两种进程。 master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。 使用PHP-FPM来控制PHP-CGI的FastCGI进程 /usr/local/php/sbin/php-fpm{start|stop|quit|restart|reload|logrotate} –start 启动php的fastcgi进程 –stop 强制终止php的fastcgi进程 –quit 平滑终止php的fastcgi进程 –restart 重启php的fastcgi进程 –reload 重新平滑加载php的php.ini –logrotate 重新启用log文件

 

85.ngnix 反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部 络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器 客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理 的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容 原本就是它自己的一样。 作用: 1.保护和隐藏原始资源服务器 2.负载均衡(需要多个) 3.过配置缓存功能加速Web请求:可以缓存真实Web服务器上的某些静态资源,减轻真实Web服务器的负载压力 通常的代理服务器,只用于代理内部 络对 Internet 的连接请求,客户机必须指定代理服务器,并将本来要直接发送到 Web 服务器上的 http 请求发送到代理服务器中。当一个代理服务器能够代理外部 络上的主机,访问内部 络时,这种代理服务的方式称为反向代理服务。 blog.csdn.net/tsummerb/article/det…

 

86.Nginx 正向代理

正向代理,也就是传说中的代理,他的工作原理就像一个跳板, 简单的说, 我是一个用户,我访问不了某 站,但是我能访问一个代理服务器 这个代理服务器呢,他能访问那个我不能访问的 站 于是我先连上代理服务器,告诉他我需要那个无法访问 站的内容 代理服务器去取回来,然后返回给我 正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。 1.访问本无法访问的服务器 2.正向代理提速(现在不流行) 3.缓存作用 4.客户端访问授权 5.隐藏访问者的行踪 访问 google.com 这个例子 www.php.cn/php-weizijiaocheng-39315…

 

87. 什么是中间件

过滤Http请求 过滤进入应用的HTTP请求对象(Request)和完善离开应用的HTTP响应对象(Reponse)的作用, 而且可以通过应用多个中间件来层层过滤请求、逐步完善相应。这样就做到了程序的解耦,如果没有中间件那么我们必须在控制器中来完成这些步骤,这无疑会造成控制器的臃肿。 请求->中间件->中间件->应用->中间件->中间件->响应 中间件的设计使用了装饰器模式 www.php.cn/php-weizijiaocheng-38647…

 

88.trait 优先级

在trait继承中,优先顺序依次是:来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。

For example: class A{ public function sayHello(){ echo “A”; } } trait B{ public function sayHello(){ parent::sayHello(); echo “B”; } } class C extends A{ use B; } $c=new C(); $c->sayHello(); 上述打印结果是:AB

 

89. 索引使用经典场景

1.匹配全值 2.匹配范围 3.最左前缀 4.搜索索引 5.匹配列前缀

 

90. 存在却不能使用的场景

1.以%开头的LIKE文件 2.数据类型出现隐式转换 3.多列索引查询条件不包括最左部分,即不满足左原则 4.使用索引比全表扫面慢 5.使用索引比全表扫描慢 6.用or分开的条件 7.条件索引使用函数

 

91. 软件开发流程

需求分析 1.相关系统分析员向用户初步了解需求,然后用相关的工具软件列出要开发的系统的大功能模块,每个大功能模块有哪些小功能模块,对于有些需求比较明确相关的界面时,在这一步里面可以初步定义好少量的界面。 2.系统分析员深入了解和分析需求,根据自己的经验和需求用WORD或相关的工具再做出一份文档系统的功能需求文档。这次的文档会清楚列出系统大致的大功能模块,大功能模块有哪些小功能模块,并且还列出相关的界面和界面功能。 3.系统分析员向用户再次确认需求。 概要设计 首先,开发者需要对软件系统进行概要设计,即系统设计。概要设计需要对软件系统的设计进行考虑,包括系统的基本处理流程、系统的组织结构、模块划分、功能分配、接口设计、运行设计、数据结构设计和出错处理设计等,为软件的详细设计提供基础。 详细设计 在概要设计的基础上,开发者需要进行软件系统的详细设计。在详细设计中,描述实现具体模块所涉及到的主要算法、数据结构、类的层次结构及调用关系,需要说明软件系统各个层次中的每一个程序(每个模块或子程序)的设计考虑,以便进行编码和测试。应当保证软件的需求完全分配给整个软件。详细设计应当足够详细,能够根据详细设计 告进行编码。 编码 在软件编码阶段,开发者根据《软件系统详细设计 告》中对数据结构、算法分析和模块实现等方面的设计要求,开始具体的编写程序工作,分别实现各模块的功能,从而实现对目标系统的功能、性能、接口、界面等方面的要求。在规范化的研发流程中,编码工作在整个项目流程里最多不会超过1/2,通常在1/3的时间,所谓磨刀不误砍柴功,设计过程完成的好,编码效率就会极大提高,编码时不同模块之间的进度协调和协作是最需要小心的,也许一个小模块的问题就可能影响了整体进度,让很多程序员因此被迫停下工作等待,这种问题在很多研发过程中都出现过。编码时的相互沟通和应急的解决手段都是相当重要的,对于程序员而言,bug永远存在,你必须永远面对这个问题,大名鼎鼎的微软,可曾有连续三个月不发补丁的时候吗来没有! 测试 测试编写好的系统。交给用户使用,用户使用后一个一个的确认每个功能。软件测试有很多种:按照测试执行方,可以分为内部测试和外部测试;按照测试范围,可以分为模块测试和整体联调;按照测试条件,可以分为正常操作情况测试和异常情况测试;按照测试的输入范围,可以分为全覆盖测试和抽样测试。以上都很好理解,不再解释。总之,测试同样是项目研发中一个相当重要的步骤,对于一个大型软件,3个月到1年的外部测试都是正常的,因为永远都会有不可预料的问题存在。完成测试后,完成验收并完成最后的一些帮助文档,整体项目才算告一段落,当然日后少不了升级,修补等等工作,只要不是想通过一锤子买卖骗钱,就要不停的跟踪软件的运营状况并持续修补升级,直到这个软件被彻底淘汰为止。 软件交付 在软件测试证明软件达到要求后,软件开发者应向用户提交开发的目标安装程序、数据库的数据字典、《用户安装手册》、《用户使用指南》、需求 告、设计 告、测试 告等双方合同约定的产物。 《用户安装手册》应详细介绍安装软件对运行环境的要求、安装软件的定义和内容、在客户端、服务器端及中间件的具体安装步骤、安装后的系统配置。 《用户使用指南》应包括软件各项功能的使用流程、操作步骤、相应业务介绍、特殊提示和注意事项等方面的内容,在需要时还应举例说明。 验收 用户验收。 维护 根据用户需求的变化或环境的变化,对应用程序进行全部或部分的修改。

 

92. 消息队列 MQ

“消息队列”是在消息的传输过程中保存消息的容器。 在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。 RabbitMQ支持消息的持久化,也就是数据写在磁盘上,为了数据安全考虑,我想大多数用户都会选择持久化。消息队列持久化包括3个部分:   (1)exchange持久化,在声明时指定durable => 1   (2)queue持久化,在声明时指定durable => 1   (3)消息持久化,在投递时指定delivery_mode => 2(1是非持久化) 如果exchange和queue都是持久化的,那么它们之间的binding也是持久化的。如果exchange和queue两者之间有一个持久化,一个非持久化,就不允许建立绑定。

 

93. 千万级别的数据库经纬度,批量替换成地址

1.拆表百万为一单位

2.批量提交和读取使用yield协程异步操作

 

94.Redis 有哪些数据结构/p>

字符串 String、字典 Hash、列表 List、集合 Set、有序集合 SortedSet。 如果你是 Redis 中高级用户,还需要加上下面几种数据结构 HyperLogLog、Geo、Pub/Sub。 如果你说还玩过 Redis Module,像 BloomFilter,RedisSearch,Redis-ML,面试官得眼睛就开始发亮了。

 

95. 使用过 Redis 分布式锁么,它是什么回事/p>

先拿 setnx 来争抢锁,抢到之后,再用 expire 给锁加一个过期时间防止锁忘记了释放。 这时候对方会告诉你说你回答得不错,然后接着问如果在 setnx 之后执行 expire 之前进程意外 crash 或者要重启维护了,那会怎么样这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。紧接着你需要抓一抓自己得脑袋,故作思考片刻,好像接下来的结果是你主动思考出来的,然后回答:我记得 set 指令有非常复杂的参数,这个应该是可以同时把 setnx 和 expire 合成一条指令来用的!对方这时会显露笑容,心里开始默念:摁,这小子还不错。

 

 

96. 假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来/p>

使用 keys 指令可以扫出指定模式的 key 列表。 对方接着追问:如果这个 redis 正在给线上的业务提供服务,那使用 keys 指令会有什么问题这个时候你要回答 redis 关键的一个特性:redis 的单线程的。keys 指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用 scan 指令,scan 指令可以无阻塞的提取出指定模式的 key 列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用 keys 指令长。

 

97. 使用过 Redis 做异步队列么,你是怎么用的/p>

一般使用 list 结构作为队列,rpush 生产消息,lpop 消费消息。当 lpop 没有消息的时候,要适当 sleep 一会再重试。 如果对方追问可不可以不用 sleep 呢ist 还有个指令叫 blpop,在没有消息的时候,它会阻塞住直到消息到来。 如果对方追问能不能生产一次消费多次呢用 pub/sub 主题订阅者模式,可以实现 1:N 的消息队列。 如果对方追问 pub/sub 有什么缺点消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如 rabbitmq 等。 如果对方追问 redis 如何实现延时队列估计现在你很想把面试官一棒打死如果你手上有一根棒球棍的话,怎么问的这么详细。但是你很克制,然后神态自若的回答道:使用 sortedset,拿时间戳作为 score,消息内容作为 key 调用 zadd 来生产消息,消费者用 zrangebyscore 指令获取 N 秒之前的数据轮询进行处理。 到这里,面试官暗地里已经对你竖起了大拇指。但是他不知道的是此刻你却竖起了中指,在椅子背后。

 

98. 如果有大量的 key 需要设置同一时间过期,一般需要注意什么/p>

如果大量的 key 过期时间设置的过于集中,到过期的那个时间点,redis 可能会出现短暂的卡顿现象。一般需要在时间上加一个随机值,使得过期时间分散一些。

 

99.Redis 如何做持久化的/p>

bgsave 做镜像全量持久化,aof 做增量持久化。因为 bgsave 会耗费较长时间,不够实时,在停机的时候会导致大量丢失数据,所以需要 aof 来配合使用。在 redis 实例重启时,优先使用 aof 来恢复内存的状态,如果没有 aof 日志,就会使用 rdb 文件来恢复。 如果再问 aof 文件过大恢复时间过长怎么办告诉面试官,Redis 会定期做 aof 重写,压缩 aof 文件日志大小。如果面试官不够满意,再拿出杀手锏答案,Redis4.0 之后有了混合持久化的功能,将 bgsave 的全量和 aof 的增量做了融合处理,这样既保证了恢复的效率又兼顾了数据的安全性。这个功能甚至很多面试官都不知道,他们肯定会对你刮目相看。 如果对方追问那如果突然机器掉电会怎样决于 aof 日志 sync 属性的配置,如果不要求性能,在每条写指令时都 sync 一下磁盘,就不会丢失数据。但是在高性能的要求下每次都 sync 是不现实的,一般都使用定时 sync,比如 1s1 次,这个时候最多就会丢失 1s 的数据。 如果对方追问 bgsave 的原理是什么给出两个词汇就可以了,fork 和 cow。fork 是指 redis 通过创建子进程来进行 bgsave 操作,cow 指的是 copy on write,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。

 

100.Pipeline 有什么好处,为什么要用 pipeline/p>

可以将多次 IO 往返的时间缩减为一次,前提是 pipeline 执行的指令之间没有因果相关性。使用 redis-benchmark 进行压测的时候可以发现影响 redis 的 QPS 峰值的一个重要因素是 pipeline 批次指令的数目。

 

喜欢我的文章就关注我吧,持续更新中…..

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的官方群点击此处。

转自链接:9 Quick Tips for Auth in Laravel

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年7月23日
下一篇 2020年7月23日

相关推荐