[建议收藏]缓存雪崩的处理办法
1. Mysql优化器的参考标准
mysql的索引是由mysql的server层的优化器决定的
2.Memcache和Redis单个key大小限制
Memcache单个key(变量)存放的数据有1M的限制
Redis单个key(变量)存放的数据有1G的限制
3.缓存雪崩的处理办法
事前:进行系统压力测试,在负载均衡层做限流处理,过载丢弃请求或者进入队列
事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。
事中:本地缓存 + 限流降级,避免 MySQL 被打死。
事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。
缓存穿透、缓存并发、缓存雪崩、缓存抖动、热点缓存、缓存双写一致性等问题
4.分布式id算法?
雪花算法是 twitter 开源的分布式 id 生成算法,采用 Scala 语言实现,是把一个 64 位的 long 型的 id,1 个 bit 是不用的,用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。雪花算法SnowFlake生成唯一ID
1 bit:不用,为啥呢?因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。
41 bit:表示的是时间戳,单位是毫秒。41 bit 可以表示的数字多达 2^41 - 1,也就是可以标识 2^41 - 1 个毫秒值,换算成年就是表示69年的时间。
10 bit:记录工作机器 id,代表的是这个服务最多可以部署在 2^10台机器上哪,也就是1024台机器。但是 10 bit 里 5 个 bit 代表机房 id,5 个 bit 代表机器 id。意思就是最多代表 2^5个机房(32个机房),每个机房里可以代表 2^5 个机器(32台机器)。
12 bit:这个是用来记录同一个毫秒内产生的不同 id,12 bit 可以代表的最大正整数是 2^12 - 1 = 4096,也就是说可以用这个 12 bit 代表的数字来区分同一个毫秒内的 4096 个不同的 id。
5.Redis内存淘汰机制
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
7. 常见MQ选型
ActiveMQ 基于 Java 开发的, RabbitMQ 是基于 erlang 开发的。
特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|---|
单机吞吐量 | 万级,比 RocketMQ、Kafka 低一个数量级 | 同 ActiveMQ | 10 万级,支撑高吞吐 | 10 万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景 |
topic 数量对吞吐量的影响 | topic 可以达到几百/几千的级别,吞吐量会有较小幅度的下降,这是 RocketMQ 的一大优势,在同等机器下,可以支撑大量的 topic | topic 从几十到几百个时候,吞吐量会大幅度下降,在同等机器下,Kafka 尽量保证 topic 数量不要过多,如果要支撑大规模的 topic,需要增加更多的机器资源 | ||
时效性 | ms 级 | 微秒级,这是 RabbitMQ 的一大特点,延迟最低 | ms 级 | 延迟在 ms 级以内 |
可用性 | 高,基于主从架构实现高可用 | 同 ActiveMQ | 非常高,分布式架构 | 非常高,分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用 |
消息可靠性 | 有较低的概率丢失数据 | 基本不丢 | 经过参数优化配置,可以做到 0 丢失 | 同 RocketMQ |
功能支持 | MQ 领域的功能极其完备 | 基于 erlang 开发,并发能力很强,性能极好,延时很低 | MQ 功能较为完善,还是分布式的,扩展性好 | 功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用 |
8. 树数据结构分类
有序树的定义:若将树中每个结点的各子树看成是从左到右有次序的(即不能互换),则称该树为有序树(Ordered Tree)
无序树的定义:若将树中每个结点的各子树从左到右是没有次序的(即可以互换),则称该树为无序树
9. 数据,数据元素,数据项,数据对象的详细理解
1.数据(Data):数据就是用户输入到计算机被计算机程序处理的一些符号,比如图片还有声音等....
2.数据元素(Data Element):是数据的基本单位,数据元素用于完整的描述一个对象,比如一个学生表,学生表也是由 数据元素和数据项组成的.
3.数据项(Data ltem):是组成数据元素的!例如 学生表 的中的 "学号 姓名 性别"等数据项.
4.数据对象:是性质相同的数据元素的集合,是数据的一个子集,例如:整数数据对象的集合 N={1,2,3,4,5,6,7,...};
10. 301和302跳转的区别?PHP如何显示301,302,403,404跳转?
301 Moved Permanently 永久重定向
302 Moved Temporarily 临时重定向(POST改为GET)
307 Temporary Redirect 临时重定向(保持POST)
301一般用作永久跳转,除非用户清浏览器缓存,否则不会修改跳转地址;
302和307可以在后端修改跳转地址,不同在于302会把POST转为GET请求,307可以保持POST
//301跳转
header("HTTP/1.1 301 Moved Permanently");
Header("Location: http://www.baidu.com");
//302
Header("Location: http://www.baidu.com");
//403
header('HTTP/1.0 403 Forbidden');
//404
header('HTTP/1.1 404 Not Found');
header("status: 404 Not Found");
11. 复合索引的使用条件?
复合索引只有在前面的字段为精确查询时,才会用上后面的复合索引,一旦出现不精确查询,则不会使用复合索引。
select * from test where a=10 and b>10 order by c
使用了a_b索引,order by c不使用索引
12. sql语句从执行到返回结果中间花费时间最长的环节是哪步?
查询结果的数据量越大返回时间越长,远远超过其他环节的占用时间。
13.PHP模式修饰符
i:正则表达式匹配时不区分大小写
m:不加m时,被匹配的字符串被当成整体一行处理,^匹配开始位置,$匹配结束位置或匹配最后一个换行符;
加m时,被匹配的字符串通过换行符当成多行处理,每行都与^和$包围的正则进行匹配 s:正则表达式中的点号(.)将表示任何字符,包括换行符
x:正则表达式中除转义外的空字符,其它空字符将被忽略
e:只用在正则替换的函数比如preg_replace()中,表示用一个函数替换内容。该修饰符在高版本php中已不再使用,已被preg_replace_callback()所替代
A:匹配时会从字符串开始位置进行匹配
D:不加D时,$匹配结束位置或匹配最后一个换行符;
加D时,仅匹配结束位置; 如果设定了修饰符m则会忽略修饰符D U:不加U时,是贪婪匹配,会最大量的找匹配部分;
加U时,是非贪婪匹配,只找最小的匹配部分
14. HTTP常用方法及作用
一台服务器要与HTTP1.1兼容,只要为资源实现GET和HEAD方法即可
GET是最常用的方法,通常用于请求服务器发送某个资源。
HEAD与GET类似,但服务器在响应中值返回首部,不返回实体的主体部分
PUT让服务器用请求的主体部分来创建一个由所请求的URL命名的新文档,或者,如果那个URL已经存在的话,就用干这个主体替代它
POST起初是用来向服务器输入数据的。实际上,通常会用它来支持HTML的表单。表单中填好的数据通常会被送给服务器,然后由服务器将其发送到要去的地方。
TRACE会在目的服务器端发起一个环回诊断,最后一站的服务器会弹回一个TRACE响应并在响应主体中携带它收到的原始请求报文。TRACE方法主要用于诊断,用于验证请求是否如愿穿过了请求/响应链。
OPTIONS方法请求web服务器告知其支持的各种功能。可以查询服务器支持哪些方法或者对某些特殊资源支持哪些方法。
DELETE请求服务器删除请求URL指定的资源
15. 常见header请求头
- | - | 示例 |
---|---|---|
vary | 告诉代理服务器/缓存/CDN,如何判断请求是否一样 | Vary: Accept-Encoding,User-Agent |
Rang | 请求一段内存,如0到2000字节,可用于断点下载 | Rang bytes=0-2000 |
Referer | 来源地址 | |
Upgrade | 切换协议版本 | Upgrade: HTTP/2.0, SHTTP/1.3 |
User-Agent | 用户信息 | User-Agent: Mozilla/5.0 (Linux; X11) |
X-Requested-With | null 传统请求;XMLHttpRequest Ajax请求 |
16.外部排序使用的数据结构
外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。
外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装人内存的部分,分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行归并排序。大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下,那么如何减少树的深度(当然是不能减少查询的数据量),一个基本的想法就是:采用多叉树结构(由于树节点元素数量是有限的,自然该节点的子树数量也就是有限的)。这样我们就提出了一个新的查找树结构——多路查找树。根据平衡二叉树的启发,自然就想到平衡多路查找树结构,也就是B-tree(B树结构)
17. PHP三大模块
内核、zend引擎、以及扩展层
参考:[PHP内核]
18.opcode是什么?
19.字母如何转二进制?
A的ASCII码是65,16进制对应41,二进制对应01000001
a的ASCII码是97,16进制对应61,二进制对应01100001
20. Apache和Nginx的区别?
21.PHP的魔术方法,魔术常量,超全局变量
魔术方法
__construct
__destruct
__call
__callStatic
__get
__set
__isset
__clone
__unset
__sleep
__wakeup
__toString
__invoke //反射:当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
__set_stat
魔术常量:所谓的魔术常量就是PHP预定义的一些常量,这些常量会随着所在的位置而变化。
__LINE__ 获取文件中的当前行号。
__FILE__ 获取文件的完整路径和文件名。
__DIR__ 获取文件所在目录。
__FUNCTION__ 获取函数名称(PHP 4.3.0 新加)。
__CLASS__ 获取类的名称(PHP 4.3.0 新加)。
__METHOD__ 获取类的方法名(PHP 5.0.0 新加)。
__NAMESPACE__ 当前命名空间的名称(区分大小写)。
__TRAIT__ Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 *Foo\Bar*)。
$GLOBALS :储存全局作用域中的变量
$_SERVER :获取服务器相关信息
$_REQUEST :获取POST和GET请求的参数
$_POST : 获取表单的POST请求参数
$_GET : 获取表单的GET请求参数
$_FILES :获取上传文件的的变
$_ENV : 获取服务器端环境变量的数组
$_COOKIE:获取浏览器的cookie
$_SESSION : 获取session
22.Linux新用户配置文件的目录
/etc/skel/目录是用来存放新用户配置文件的目录,当我们添加新用户的时候,这个目录下的所有文件会自动被复制到新添加的用户的家目录下。这个目录下的所有文件都是隐藏文件(以.点开头的文件)。
23. 国标码,区位码,机内码,机器码的区别?
【区位码】区位码在GB-2312中预留了一些空位,便于补充和扩展
【机内码】汉字ASCII码。指计算机内部存储,处理加工和传输汉字时所用的由0和1符号组成的代码。