微信小程序 推荐里的请问你为什么这么厉害游戏里的月光宝盒怎么召唤啊?

希望此文会给大家带来帮助,觉得写的不错的,对你有帮助的请动动你的手关注我和点赞分享,祝愿正在找工作的你,能找一份满意的工作!

还将大量面试题整理成了一个PHP面试手册,是PDF版的。

关注微信公众号 “PHP大神” 回复“面试题”可以下载更多php相关面试题 ,整理不易请多关注,如有错误请多包涵哈!

18. 公众号全局唯一票据

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

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

3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。

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

1、click:点击推事件用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
2、view:跳转URL用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。
3、scancode_push:扫码推事件用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后显示扫描结果(如果是URL,将进入URL),且会将扫码的结果传给开发者,开发者可以下发消息。
4、scancode_waitmsg:扫码推事件且弹出“消息接收中”提示框用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后,将扫码的结果传给开发者,同时收起扫一扫工具,然后弹出“消息接收中”提示框,随后可能会收到开发者下发的消息。
5、pic_sysphoto:弹出系统拍照发图用户点击按钮后,微信客户端将调起系统相机,完成拍照操作后,会将拍摄的相片发送给开发者,并推送事件给开发者,同时收起系统相机,随后可能会收到开发者下发的消息。
6、pic_photo_or_album:弹出拍照或者相册发图用户点击按钮后,微信客户端将弹出选择器供用户选择“拍照”或者“从手机相册选择”。用户选择后即走其他两种流程。
7、pic_weixin:弹出微信相册发图器用户点击按钮后,微信客户端将调起微信相册,完成选择操作后,将选择的相片发送给开发者的服务器,并推送事件给开发者,同时收起相册,随后可能会收到开发者下发的消息。
8、location_select:弹出地理位置选择器用户点击按钮后,微信客户端将调起地理位置选择工具,完成选择操作后,将选择的地理位置发送给开发者的服务器,同时收起位置选择工具,随后可能会收到开发者下发的消息。
9、media_id:下发消息(除文本消息)用户点击media_id类型按钮后,微信服务器会将开发者填写的永久素材id对应的素材下发给用户,永久素材类型可以是图片、音频、视频、图文消息。请注意:永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id。
10、view_limited:跳转图文消息URL用户点击view_limited类型按钮后,微信客户端将打开开发者在按钮中填写的永久素材id对应的图文消息URL,永久素材类型只支持图文消息。请注意:永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id。
请注意!!! 3到8的所有事件,仅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用户,旧版本微信用户点击后将没有回应,开发者也不能正常接收到事件推送。9和10,是专门给第三方平台旗下未微信认证(具体而言,是资质认证未通过)的订阅号准备的事件类型,它们是没有事件推送的,能力相对受限,其他类型的公众号不必使用。

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

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

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

模板消息填写时,必须严格遵守以下规则,否则也不能审核通过:
1、模板内容长度不能超过200个字符,且必须有至少10个固定文字或标点
2、模版内容中,参数是可以在发送时赋值的,参数必须以“{ {”开头,以“.DATA} }”结尾)
3、内容示例是将模板内容中的参数分别举例后的模板内容的副本,必须严格填写,用以帮助审核人员详细理解模板的用途
4、参数中可以通过增加“\n”,来实现换行,所以,一般建议将参数紧贴上一行,在需要时用“\n”自行换行。通过该技巧,可以让模板消息的拓展能力变得非常强。
5、模版内容中,第一句话需要为礼貌性、称谓性的用语,这句话统一用{ {first.DATA} }参数来概括,以免此后称谓习惯等修改后,需修改模版。
6、模版内容的中部必须为2到5个“关键词名称:关键词内容参数”(中文冒号)的组合排列,这样显示在微信客户端中体验最佳。
7、模版内容中,末尾必须有{ {remark.DATA} }参数,该参数的作用是,用户可以自行添加多行需要的内容。例如,模版中有姓名、时间这2个关键词,但你需要姓名、时间、地点3个,则可以将地点这个关键词的内容放入remark参数中(需要时可通过\n来换行)。这样就达到了用remark参数来扩充关键词的作用,极大增强了模版的通用性。
8、直接相连在一起的参数,应简化为一个,避免模板内容过于复杂,因为赋值到两个参数中的内容可以简化地赋值到一个参数中。
9、为了保持行业通用性,模板标题和模板内容中,不允许带有品牌等关键词,以免影响通用性。

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

公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。素材管理接口对所有认证的订阅号和服务号开放。通过本接口,公众号可以新增临时素材(即上传临时多媒体文件)。
1、临时素材media_id是可复用的。
2、媒体文件在微信后台保存时间为3天,即3天后media_id失效。
3、上传临时素材的格式、大小限制与公众平台官网一致。
语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
4、需使用https调用本接口。

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

模板消息用来帮助公众号进行业务通知,是开发者在模板内容中设定参数(参数必须以“{ {”开头,且以“.DATA} }”结尾),并在调用时为这些参数赋值并发送的消息。
模板消息的定位是用户触发后的通知消息,不允许在用户没做任何操作或未经用户同意接收的前提下,主动下发消息给用户。
目前在特殊情况下允许主动下发的消息只有故障类和灾害警示警告类通知,除此之外都要经过用户同意或用户有触发行为才能下发模板消息。
公众号只能在模板库中按照自己的行业来选择模板。如果模板库中暂时没有你想要的模板,则请你仔细阅读以下内容后,在满足要求的情况下,可以为你所在的行业贡献新模板,帮助充实模板库。

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

①模板消息不能主动下发给没有接受过服务的接收者(故障报警、灾害报警和不涉及营销推广的通知除外)
例:某用户仅仅是关注公众号,没有和公众号及其所属主体有任何交互行为,却无故收到该公众号下发的模板消息,属于违规行为
②模板消息的发送频率不能太高骚扰接收者
例:某用户点击公众号的自定义菜单一次或其它触发操作,连续收到3条或更多重复模板消息,属于违规行为
①模板消息内容不能做营销、推广、诱导分享及诱导下载APP
例:某用户购买某商品后,公众号下发模板推销其它商品,与用户此次接受的服务无关,属于违规
②模板内容与模板标题或关键词无关联
例:标题是刷卡成功通知,模板内容却是推销商品或活动通知,属于违规
③模板内容是营销性质的群发活动公告通知
例:标题小区物业通知,模板内容却是群发活动的营销信息
综合上述两项原则后判断,主动下发、内容涉及恶意营销、频率过高恶意骚扰、以及模板参数内容乱填写将被封接口处罚。对于多次使用同一模板违规的,将回收违规模板,不允许再使用,违规处罚将通过微信公众平台站内信告知运营者。

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

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

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

1.1 要求用户分享,分享后方可进行下一步操作,分享后方可知道答案等;
1.2 含有明示或暗示用户分享的文案、图片、按钮、弹层、弹窗等的,如:分享给好友、邀请好友一起完成任务等;
1.3 通过利益诱惑,诱导用户分享、传播外链内容或者微信公众帐号文章的,包括但不限于:现金奖励、实物奖品、虚拟奖品(红包、优惠券、代金券、积分、话费、流量、信息等)、集赞、拼团、分享可增加抽奖机会、中奖概率,以积分或金钱利益诱导用户分享、点击、点赞微信公众帐号文章等;

28. 企业号、服务号、订阅号区别

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

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

1、引导用户进入授权页面同意授权,获取code
3、如果需要,开发者可以刷新网页授权access_token,避免过期

30. 描述小程序的框架

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

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

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

32. 浏览器内核有哪些?

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

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

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

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

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

38. 索引使用经典场景

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

2.数据类型出现隐式转换
3.多列索引查询条件不包括最左部分,即不满足左原则
4.使用索引比全表扫面慢
5.使用索引比全表扫描慢

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

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

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

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

44. 使用过 Redis 分布式锁么,它是什么回事?

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

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

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

46. 使用过 Redis 做异步队列么,你是怎么用的?

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

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

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

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,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。

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

关注微信公众号 “PHP大神” 回复“面试题”可以下载更多php相关面试题 ,整理不易请多关注,如有错误请多包涵哈!

不用念咒,直接回到过去——

今天,微信公众平台后台更新:所有帐号都可以在图文编辑查看图文历史版本

1.在图文素材编辑界面,选择右上角的“图文历史版本”。

2.进入图文历史版本列表,编辑时间、编辑者、操作内容一览无余。

3.运营者可以选择需要查看的历史编辑版本,在历史列表上轻松切换。

需要提醒的是,目前,用户只能看到新版本上线后操作过程中的历史编辑记录,不包含上线前的编辑记录。

图文“剁手党”们是不是高兴坏了?派爷再给你们播送三个福音

1、图文素材编辑提供本地草稿:

还在为误操作或浏览器崩溃离开丢失本地草稿而猛拍大腿?

现在,没有保存本地草稿到服务器、主动关闭编辑页面或浏览器崩溃导致编辑页面关闭,可以再次进入该素材:

重新进入未保存的图文,会自动出现“有未保存的草稿”的提示,可通过此界面查看草稿。

2素材版本冲突时增加详细提示

你是否遇到过这种情况:多个浏览器操作中,旧素材一不小心就覆盖了新素材的草稿……

现在,当进入一个旧版本(与服务器最新的版本对比)素材草稿时,会自动出现弹框提示用户详细的操作信息

这里,派爷推荐你选择编辑新内容。如果选择查看当前内容,你就会进入一个只读的草稿页面,此时的草稿是只能复制不能编辑的。

3、多个本地草稿定时自动同步:

在图文素材编辑里,每隔1分钟草稿会自动保存N个窗口同时编辑手忙脚乱、本地素材太多经常混淆,从此挥手告别这些问题,群发内容不再怕出错。

从此,图文编辑有“迹”可循。多人同时操作,多个电脑同时浏览时再也不怕素材内容丢失了~

此次能力的开放,运营者们,是不是感到多年的“剁手症”终于有救了?

说说在编辑图文的时候,你有过哪些恨不得“剁手”的黑历史?

希望此文会给大家带来帮助,觉得写的不错的,对你有帮助的请动动你的手关注我和点赞分享,祝愿正在找工作的你,能找一份满意的工作!

还将大量资料整理成了一个PHP面试手册,是PDF版的,文章结尾有获取方式,整理不易请多点赞支持,谢谢!

是一种电子商务类型的网络购物商业模式,B是BUSINESS的简称,C是CUSTOMER的简称,第一个B指的是商品或服务的供应商,第二个B指的是从事电子商务的企业,C则是表示消费者。
中文名 电子购物平台模式
模 式 供应商对企业,企业对消费者
即Online To Offline(在线离线/线上到线下),是指将线下的商务机会与互联网结合,让互联网成为线下交易的平台,这个概念最早来源于美国。O2O的概念非常广泛,既可涉及到线上,又可涉及到线下,可以通称为O2O。主流商业管理课程均对O2O这种新型的商业模式有所介绍及关注。例如:云家园、云家政、e家洁、小区管家
p2p金融又叫P2P信贷。
其中,P2P是 peer-to-peer 或 person-to-person 的简写,意思是:个人对个人。P2P金融指个人与个人间的小额借贷交易,一般需要借助电子商务专业网络平台帮助借贷双方确立借贷关系并完成相关交易手续。借款者可自行发布借款信息,包括金额、利息、还款方式和时间,实现自助式借款;借出者根据借款人发布的信息,自行决定借出金额,实现自助式借贷。
举例说明:MB月光宝盒平台
目前做P2P最多的属于P2P互联网金融平台,简单的意思就是个人对个人通过平台来连接达到解决双方的需求。
是指建立在信息技术基础上,以系统化的管理思想,为企业决策层及员工提供决策运行手段的管理平台。ERP系统集中信息技术与先进的管理思想於一身,成为现代企业的运行模式,反映时代对企业合理调配资源,最大化地创造社会财富的要求,成为企业在信息时代生存、发展的基石。
即客户关系管理,是指企业用CRM技术来管理与客户之间的关系。在不同场合下,CRM可能是一个管理学术语,可能是一个软件系统。通常所指的CRM,指用计算机自动化分析销售、市场营销、客户服务以及应用等流程的软件系统。它的目标是通过提高客户的价值、满意度、赢利性和忠实度来缩减销售周期和销售成本、增加收入、寻找扩展业务所需的新的市场和渠道。CRM是选择和管理有价值客户及其关系的一种商业策略,CRM要求以客户为中心的企业文化来支持有效的市场营销、销售与服务流程
说起OA(Office Automation,办公自动化),总体上讲,它是指一切可满足于企事业单位的、综合型的、能够提高单位内部信息交流、共享、流转处理的和实现办公自动化和提高工作效率的各种信息化设备和应用软件。
它不是孤立存在的,而是与企事业单位其它各类管理系统(如行政管理系统、人力资源管理系统、CRM系统、销售管系统、ERP系统、财务系统、销售会员管理系统)密切相关、有机整合。一个独立存在的OA办公自动化系统生命力及作用是薄弱的。——这也是目前最全面、最被认可的OA的概念。

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

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

  • 什么是依赖注入?依赖注入是控制反转的一种实现,实现代码解耦,便于单元测试。因为它并不需要了解自身所依赖的类,而只需要知道所依赖的类实现了自身所需要的方法就可以了。
  • 解决那些问题,依赖之间的解耦,单元测试,方便Mock

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

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

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

3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。

1、click:点击推事件用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
2、view:跳转URL用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。
3、scancode_push:扫码推事件用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后显示扫描结果(如果是URL,将进入URL),且会将扫码的结果传给开发者,开发者可以下发消息。
4、scancode_waitmsg:扫码推事件且弹出“消息接收中”提示框用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后,将扫码的结果传给开发者,同时收起扫一扫工具,然后弹出“消息接收中”提示框,随后可能会收到开发者下发的消息。
5、pic_sysphoto:弹出系统拍照发图用户点击按钮后,微信客户端将调起系统相机,完成拍照操作后,会将拍摄的相片发送给开发者,并推送事件给开发者,同时收起系统相机,随后可能会收到开发者下发的消息。
6、pic_photo_or_album:弹出拍照或者相册发图用户点击按钮后,微信客户端将弹出选择器供用户选择“拍照”或者“从手机相册选择”。用户选择后即走其他两种流程。
7、pic_weixin:弹出微信相册发图器用户点击按钮后,微信客户端将调起微信相册,完成选择操作后,将选择的相片发送给开发者的服务器,并推送事件给开发者,同时收起相册,随后可能会收到开发者下发的消息。
8、location_select:弹出地理位置选择器用户点击按钮后,微信客户端将调起地理位置选择工具,完成选择操作后,将选择的地理位置发送给开发者的服务器,同时收起位置选择工具,随后可能会收到开发者下发的消息。
9、media_id:下发消息(除文本消息)用户点击media_id类型按钮后,微信服务器会将开发者填写的永久素材id对应的素材下发给用户,永久素材类型可以是图片、音频、视频、图文消息。请注意:永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id。
10、view_limited:跳转图文消息URL用户点击view_limited类型按钮后,微信客户端将打开开发者在按钮中填写的永久素材id对应的图文消息URL,永久素材类型只支持图文消息。请注意:永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id。
请注意!!! 3到8的所有事件,仅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用户,旧版本微信用户点击后将没有回应,开发者也不能正常接收到事件推送。9和10,是专门给第三方平台旗下未微信认证(具体而言,是资质认证未通过)的订阅号准备的事件类型,它们是没有事件推送的,能力相对受限,其他类型的公众号不必使用。

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

模板消息填写时,必须严格遵守以下规则,否则也不能审核通过:
1、模板内容长度不能超过200个字符,且必须有至少10个固定文字或标点
2、模版内容中,参数是可以在发送时赋值的,参数必须以“{ {”开头,以“.DATA} }”结尾)
3、内容示例是将模板内容中的参数分别举例后的模板内容的副本,必须严格填写,用以帮助审核人员详细理解模板的用途
4、参数中可以通过增加“\n”,来实现换行,所以,一般建议将参数紧贴上一行,在需要时用“\n”自行换行。通过该技巧,可以让模板消息的拓展能力变得非常强。
5、模版内容中,第一句话需要为礼貌性、称谓性的用语,这句话统一用{ {first.DATA} }参数来概括,以免此后称谓习惯等修改后,需修改模版。
6、模版内容的中部必须为2到5个“关键词名称:关键词内容参数”(中文冒号)的组合排列,这样显示在微信客户端中体验最佳。
7、模版内容中,末尾必须有{ {remark.DATA} }参数,该参数的作用是,用户可以自行添加多行需要的内容。例如,模版中有姓名、时间这2个关键词,但你需要姓名、时间、地点3个,则可以将地点这个关键词的内容放入remark参数中(需要时可通过\n来换行)。这样就达到了用remark参数来扩充关键词的作用,极大增强了模版的通用性。
8、直接相连在一起的参数,应简化为一个,避免模板内容过于复杂,因为赋值到两个参数中的内容可以简化地赋值到一个参数中。
9、为了保持行业通用性,模板标题和模板内容中,不允许带有品牌等关键词,以免影响通用性。
公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。素材管理接口对所有认证的订阅号和服务号开放。通过本接口,公众号可以新增临时素材(即上传临时多媒体文件)。
1、临时素材media_id是可复用的。
2、媒体文件在微信后台保存时间为3天,即3天后media_id失效。
3、上传临时素材的格式、大小限制与公众平台官网一致。
语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
4、需使用https调用本接口。
模板消息用来帮助公众号进行业务通知,是开发者在模板内容中设定参数(参数必须以“{ {”开头,且以“.DATA} }”结尾),并在调用时为这些参数赋值并发送的消息。
模板消息的定位是用户触发后的通知消息,不允许在用户没做任何操作或未经用户同意接收的前提下,主动下发消息给用户。
目前在特殊情况下允许主动下发的消息只有故障类和灾害警示警告类通知,除此之外都要经过用户同意或用户有触发行为才能下发模板消息。
公众号只能在模板库中按照自己的行业来选择模板。如果模板库中暂时没有你想要的模板,则请你仔细阅读以下内容后,在满足要求的情况下,可以为你所在的行业贡献新模板,帮助充实模板库。
①模板消息不能主动下发给没有接受过服务的接收者(故障报警、灾害报警和不涉及营销推广的通知除外)
例:某用户仅仅是关注公众号,没有和公众号及其所属主体有任何交互行为,却无故收到该公众号下发的模板消息,属于违规行为
②模板消息的发送频率不能太高骚扰接收者
例:某用户点击公众号的自定义菜单一次或其它触发操作,连续收到3条或更多重复模板消息,属于违规行为
①模板消息内容不能做营销、推广、诱导分享及诱导下载APP
例:某用户购买某商品后,公众号下发模板推销其它商品,与用户此次接受的服务无关,属于违规
②模板内容与模板标题或关键词无关联
例:标题是刷卡成功通知,模板内容却是推销商品或活动通知,属于违规
③模板内容是营销性质的群发活动公告通知
例:标题小区物业通知,模板内容却是群发活动的营销信息
综合上述两项原则后判断,主动下发、内容涉及恶意营销、频率过高恶意骚扰、以及模板参数内容乱填写将被封接口处罚。对于多次使用同一模板违规的,将回收违规模板,不允许再使用,违规处罚将通过微信公众平台站内信告知运营者。

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

1.1 要求用户分享,分享后方可进行下一步操作,分享后方可知道答案等;
1.2 含有明示或暗示用户分享的文案、图片、按钮、弹层、弹窗等的,如:分享给好友、邀请好友一起完成任务等;
1.3 通过利益诱惑,诱导用户分享、传播外链内容或者微信公众帐号文章的,包括但不限于:现金奖励、实物奖品、虚拟奖品(红包、优惠券、代金券、积分、话费、流量、信息等)、集赞、拼团、分享可增加抽奖机会、中奖概率,以积分或金钱利益诱导用户分享、点击、点赞微信公众帐号文章等;
企业号 服务号 订阅号
消息次数限制 最高每分钟可群发 200 次 每月主动发送消息不超过 4 条 每天群发一条
验证关注者身份 通讯录成员可关注 不论什么微信用户扫码就可以关注 不论什么微信用户扫码就可以关注
消息保密 消息可转发、分享。支持保密消息,防成员转发 消息可转发、分享 消息可转发、分享
高级接口权限 支持 支持 不支持
定制应用 可依据须要定制应用,多个应用聚合成一个企业号 不支持。新增服务号须要又一次关注。 不支持,新增服务号须要又一次关注。
1、引导用户进入授权页面同意授权,获取code
3、如果需要,开发者可以刷新网页授权access_token,避免过期
框架特征:响应式的数据绑定 (MINA 用响应式数据绑定的方式,在视图层和逻辑层之间进行通信。从某种程度上,可以看成是 MVVM 模式。)
结构:MINA 程序包含一个描述整体程序的 app 和多个描述各自页面的 page。
一个 MINA 程序主体部分由三个文件组成,必须放在根目录下。
一个 MINA 页面由四个文件组成。如下图

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

1、Trident内核:代表作品是IE,因IE捆绑在Windows中,所以占有极高的份额,又称为IE内核或MSHTML,此内核只能用于Windows平台,且不是开源的。
? ? 代表作品还有腾讯、Maxthon(遨游)、360浏览器等。但由于市场份额比较大,曾经出现脱离了W3C标准的时候,同时IE版本比较多,
? ??存在很多的兼容性问题。
2、Gecko内核:代表作品是Firefox,即火狐浏览器。因火狐是最多的用户,故常被称为firefox内核它是开源的,最大优势是跨平台,在Microsoft Windows、Linux、MacOs X等主 ??要操作系统中使用。
? ?Mozilla是网景公司在第一次浏览器大战败给微软之后创建的。有兴趣的同学可以了解一下浏览器大战
3、Webkit内核:代表作品是Safari、曾经的Chrome,是开源的项目。
4、Presto内核:代表作品是Opera,Presto是由Opera Software开发的浏览器排版引擎,它是世界公认最快的渲染速度的引擎。在13年之后,Opera宣布加入谷歌阵营,弃用了 ? ?Presto
5、Blink内核:由Google和Opera Software开发的浏览器排版引擎,2013年4月发布。现在Chrome内核是Blink。谷歌还开发了自己的JS引擎,V8,使JS运行速度极大地提高了
相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼。
php-fpm是 FastCGI 的实现,并提供了进程管理的功能。
master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。
反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器
客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理 的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容 原本就是它自己的一样。
1.保护和隐藏原始资源服务器
2.负载均衡(需要多个)
3.过配置缓存功能加速Web请求:可以缓存真实Web服务器上的某些静态资源,减轻真实Web服务器的负载压力
通常的代理服务器,只用于代理内部网络对 Internet 的连接请求,客户机必须指定代理服务器,并将本来要直接发送到 Web 服务器上的 http 请求发送到代理服务器中。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。
正向代理,也就是传说中的代理,他的工作原理就像一个跳板, 简单的说, 我是一个用户,我访问不了某网站,但是我能访问一个代理服务器 这个代理服务器呢,他能访问那个我不能访问的网站 于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容 代理服务器去取回来,然后返回给我
正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
1.访问本无法访问的服务器
2.正向代理提速(现在不流行)
过滤进入应用的HTTP请求对象(Request)和完善离开应用的HTTP响应对象(Reponse)的作用, 而且可以通过应用多个中间件来层层过滤请求、逐步完善相应。这样就做到了程序的解耦,如果没有中间件那么我们必须在控制器中来完成这些步骤,这无疑会造成控制器的臃肿。
中间件的设计使用了装饰器模式

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

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

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

先拿 setnx 来争抢锁,抢到之后,再用 expire 给锁加一个过期时间防止锁忘记了释放。
这时候对方会告诉你说你回答得不错,然后接着问如果在 setnx 之后执行 expire 之前进程意外 crash 或者要重启维护了,那会怎么样?
这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。紧接着你需要抓一抓自己得脑袋,故作思考片刻,好像接下来的结果是你主动思考出来的,然后回答:我记得 set 指令有非常复杂的参数,这个应该是可以同时把 setnx 和 expire 合成一条指令来用的!对方这时会显露笑容,心里开始默念:摁,这小子还不错。
使用 keys 指令可以扫出指定模式的 key 列表。
对方接着追问:如果这个 redis 正在给线上的业务提供服务,那使用 keys 指令会有什么问题?
这个时候你要回答 redis 关键的一个特性:redis 的单线程的。keys 指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用 scan 指令,scan 指令可以无阻塞的提取出指定模式的 key 列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用 keys 指令长。
一般使用 list 结构作为队列,rpush 生产消息,lpop 消费消息。当 lpop 没有消息的时候,要适当 sleep 一会再重试。
如果对方追问可不可以不用 sleep 呢?list 还有个指令叫 blpop,在没有消息的时候,它会阻塞住直到消息到来。
如果对方追问能不能生产一次消费多次呢?使用 pub/sub 主题订阅者模式,可以实现 1:N 的消息队列。
如果对方追问 pub/sub 有什么缺点?在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如 rabbitmq 等。
如果对方追问 redis 如何实现延时队列?我估计现在你很想把面试官一棒打死如果你手上有一根棒球棍的话,怎么问的这么详细。但是你很克制,然后神态自若的回答道:使用 sortedset,拿时间戳作为 score,消息内容作为 key 调用 zadd 来生产消息,消费者用 zrangebyscore 指令获取 N 秒之前的数据轮询进行处理。
到这里,面试官暗地里已经对你竖起了大拇指。但是他不知道的是此刻你却竖起了中指,在椅子背后。

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

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,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。

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

关注微信公众号:PHP大神,然后回复“面试手册”即可免费获取更多相关资料~

我要回帖

更多关于 微信小程序 推荐 的文章

 

随机推荐