php面试题

缓存

  • Nosql(Not only SQL)系列缓存包括Memcached、MongoDB、Redis、Cas-sandra、Tokyo Tyrant等产品
  • 缓存组件都是同时结合内存和硬盘的,当内存满后,将部分数据持久化到硬盘,或定期dump把内存的数据写入硬盘,防止数据丢失
  • 缓存三要素:命中率、缓存更新政策、缓存最大数据量

Memcached

  • 本质上就是一个内存key-value缓存;
  • 协议简单,使用的是基于文本行的协议;
  • 不支持数据的持久化,服务器关闭之后数据全部丢失;
  • Memcached简洁而强大,便于快速开发,上手较为容易;
  • 互不通信的Memcached之间具有分布特征 ;
  • 没有安全机制。

Redis

  • 有丰富的数据类型:如String、List、Set、Sorted Set、Hash等
  • 支持两种数据持久化方式:Snapshotting(快照)和Append-Only file(追加)
  • 支持主从复制

缓存如何保证一致性

方案一:采用延时双删策略

基本思路: 在写库前后都进行删除缓存操作,并且设置合理的超时时间
基本步骤: 先删除缓存–再写数据库—休眠一段时间—再次删除缓存
该方案的弊端: 集合双删策略+缓存超时策略设置,这样最差的结果就是在超时时间内数据存在不一致,又增加了写请求的耗时。

方案二:一步更新缓存(基于订阅Binlog的同步机制)

读取binlog后分析 ,利用消息队列,推送更新各台的redis缓存数据。

Redis热门问题

图片

数据库

数据库应用优化

  • 数据库的优化:一方面是SQL程序语句的优化,另一方面是数据库服务器和配置的优化
  • 查询语句的优化:一些普通遵循的的原则,以及怎样对查询语句进行性能分析

基本语句优化10个原则

  • 尽量避免在列上进行运算,这样会导致索引失效
  • 使用JOIN时,应该用小结果驱动大结果。同时把复杂的JOIN查询拆分成多个查询
  • 注意LIKE的使用,避免%%
  • 仅列出需要查询的字段,这对速度不会有明显影响,主要考虑节省内存
  • 使用批量插入语句节省交互
  • limit的基数比较大时使用between
  • 不要使用rand函数获取多条随机记录
  • 避免使用NULL
  • 不要做无谓的排序操作,而应尽可能在索引中完成排序

MySQL数据库索引的设计原则

  • 选择唯一性索引
  • 为经常需要排序、分组和联合操作的字段建立索引
  • 为常作为查询条件的字段建立索引
  • 限制索引的数目
  • 尽量使用数据量少的索引
  • 尽量使用前缀来索引
  • 使用最频繁的列放到联合索引的左侧
  • 在多个字段都要创建索引的情况下,联合索引优于单值索引

事务隔离级别

  • 脏读
    读取到其他事务还没有提交的数据
  • 不可重复读
    同一事务内查询,由于别的事务将数据修改or删除,导致执行两次查询结果可能不一样。
  • 幻读
    通常针对插入操作,与不可重复读的区别是不可重复读,是由于数据变更导致数据变少。幻读是因为后一次insert操作导致数据增加,先前没有读取到。
    隔离级别隔离强度逐渐增强,性能逐渐下降
隔离级别脏读不可重复读幻读
读未提交(Read Uncommited)可能可能可能
读已提交(Read Commited)不可能可能可能
可重复读(Repeatable Read)不可能不可能其他引擎可能(innodb 利用间隙锁)
串行化(Serializable)不可能不可能不可能

数据库的优化方案核心本质有三种: 减少数据量、用空间换性能、选择合适的存储系统,这也对应了开篇讲解的慢的三个原因:数据总量、高负载、查找的时间复杂度。

  • 减少数据量
    减少数据量类型共有四种方案:数据序列化存储、数据归档、中间表生成、分库分表。
  • 分库分表
    垂直拆分更多是从业务角度进行拆分
    水平拆分更多是从技术角度进行拆分
  • 用空间换性能
    分布式缓存、一主多从

php-fpm进程数设置多少合适

问题:一个4CPU 8个G的服务器,请问一般配置多少个FPM进程。
经过查找有几下几种答案,以供参考。
1、一般都会推荐设置为n或者n×2 或才nx4(n为cpu数量)
2、按照可用内存/30m (30m为fpm每个进程内存),配置不超过总的70%就基本可以,不考虑其他服务的情况下。

负载均衡

并发

clickhouse

列式存储数据库,可以做用户行为分析

clickhouse特点

列式存储:
支持5种数据库引擎:
Ordinary:默认引擎
MySQL:MySQL引擎,Mysql引擎用于将远程mysql库中的表映射到clickhouse中,并允许clickhouse对表进行select和insert操作,以方便clickhouse和mysql之间进行数据的交换。
Dictionary:字典引擎
Memory:内存引擎,用于存放临时数据
Lazy:日志引擎
MaterializeMySQL:MySQL数据同步;将MySQL数据全量或增量方式同步到clickhouse中,解决mysql服务并发访问压力过大的问题

不足:

  • 不支持事务、异步删除与更新
  • 不适用高并发场景

衡量一个应用指标

  • TPS:Transactions Per Second(每秒传输的事物处理个数),即服务器每秒处理的事务数。

一般的,评价系统性能均以每秒钟完成的技术交易的数量来衡量。系统整体处理能力取决于处理能力最低模块的TPS值。

Tps即每秒处理事务数,包括了

1)用户请求服务器

2)服务器自己的内部处理

3)服务器返回给用户

这三个过程,每秒能够完成N个这三个过程,Tps也就是N;

  • QPS:Queries Per Second,意思是每秒查询率。指一台服务器每秒能够响应的查询次数,用于衡量特定的查询服务器在规定时间内所处理流量多少,主要针对专门用于查询的服务器的性能指标

  • 区别:

    QPS 基本类似于 TPS,但是不同的是,对于一个事务访问,会形成一个 “ T ”;但一次 " T " 中,可能产生多次对服务器的请求,服务器对这些请求,就可计入 QPS 之中。

    (1)如果是对一个查询接口压测,且这个接口内部不会再去请求其它接口,那么 TPS = QPS,否则,TPS ≠ QPS

    (2)如果是容量场景,假设 N 个接口都是查询接口,且这个接口内部不会再去请求其它接口,QPS = N * TPS

1、当QPS小于50时
优化方案:为一般小型网站,不用考虑优化
2、当QPS达到100时,遇到数据查询瓶颈
优化方案: 数据库缓存层,数据库的负载均衡
3、当QPS达到800时, 遇到带宽瓶颈
优化方案:CDN加速,负载均衡
4、当QPS达到1000时
优化方案: 做html静态缓存
5、当QPS达到2000时
优化方案: 做业务分离,分布式存储

高并发解决方案案例
  • 流量优化
    防盗链处理(去除恶意请求)

  • 前端优化
    减少HTTP请求[将css,js等合并]
    添加异步请求(先不将所有数据都展示给用户,用户触发某个事件,才会异步请求数据)
    启用浏览器缓存和文件压缩
    CDN加速
    建立独立的图片服务器(减少I/O)

  • 服务端优化
    页面静态化
    并发处理
    队列处理
    控制大文件的下载,建议将大文件放在另外一台服务器上

  • 数据库优化
    数据库缓存
    分库分表,分区
    读写分离
    负载均衡
    查询尽量不用select *
    避免相关子查询
    给经常查询的添加索引
    web服务器优化
    nginx反向代理实现负载均衡
    lvs实现负载均衡

  • PV(Page View):综合浏览量,即页面浏览量或者点击量,一个访客在24小时内访问的页面数量

  • 吞吐量(fetches/sec) :单位时间内处理的请求数量 (通常由QPS和并发数决定)

  • 响应时间:从请求发出到收到响应花费的时间

RPC协议

  • RPC(Remote Procedure Call)是一种远程过程调用的协议,是分布式常用的一种通信方式
  • RPC 主要是基于 TCP/IP 协议的,而 HTTP 服务主要是基于 HTTP 协议的。 HTTP 协议是在传输层协议 TCP 之上的,所以效率来看的话,RPC 当然是要更胜一筹啦,RPC主要是用在大型网站里面,因为大型网站里面系统繁多,业务线复杂,而且效率优势非常重要的一块,这个时候RPC的优势就比较明显了。
  • OSI 的七层网络结构模型

第一层:应用层。定义了用于在网络中进行通信和传输数据的接口。
第二层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等。(实际无)
第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断。(实际无)
第四层:传输层。管理着网络中的端到端的数据传输。
第五层:网络层。定义网络设备间如何传输数据。
第六层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输。
第七层:物理层。这一层主要就是传输这些二进制数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值