[建议收藏]缓存雪崩的处理办法

2022-08-18 08:39:11 浏览数 (1)

1. Mysql优化器的参考标准

mysql的索引是由mysql的server层的优化器决定的

2.Memcache和Redis单个key大小限制

Memcache单个key(变量)存放的数据有1M的限制

Redis单个key(变量)存放的数据有1G的限制

3.缓存雪崩的处理办法

事前:进行系统压力测试,在负载均衡层做限流处理,过载丢弃请求或者进入队列

事前:redis 高可用,主从 哨兵,redis cluster,避免全盘崩溃。

事中:本地缓存 限流降级,避免 MySQL 被打死。

事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

缓存雪崩、击穿、穿透,该如何避免?

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内存淘汰机制

  • noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。
  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。

Redis过期--淘汰机制的解析和内存占用过高的解决方案

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

代码语言:javascript复制
//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. 复合索引的使用条件?

复合索引只有在前面的字段为精确查询时,才会用上后面的复合索引,一旦出现不精确查询,则不会使用复合索引。

代码语言:javascript复制
select * from test where a= and b> 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是什么?

opcode 是Php脚本编译后的中间码,Zend引擎将源文件转换成opcode代码,然后在虚拟机上运行

缓存opcode 后 可以加快网站的运行速度

用apc 或者xcache 缓存可以缓存php的opcode

19.字母如何转二进制?

A的ASCII码是65,16进制对应41,二进制对应01000001

a的ASCII码是97,16进制对应61,二进制对应01100001

20. Apache和Nginx的区别?

  • Nginx是轻量级,比apache占用更少的内存以及资源,全面了解Nginx主要应用场景‍
  • apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程

21.PHP的魔术方法,魔术常量,超全局变量

魔术方法

代码语言:javascript复制
__construct 
__destruct 
__call 
__callStatic 
__get 
__set 
__isset 
__clone 
__unset 
__sleep 
__wakeup 
__toString 
__invoke //反射:当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
__set_stat

魔术常量:所谓的魔术常量就是PHP预定义的一些常量,这些常量会随着所在的位置而变化。

代码语言:javascript复制
__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 名包括其被声明的作用区域(例如 *FooBar*)。

超全局变量(9个)

代码语言:javascript复制
$GLOBALS :储存全局作用域中的变量
$_SERVER :获取服务器相关信息
$_REQUEST :获取POST和GET请求的参数
$_POST : 获取表单的POST请求参数
$_GET : 获取表单的GET请求参数
$_FILES :获取上传文件的的变
$_ENV : 获取服务器端环境变量的数组
$_COOKIE:获取浏览器的cookie
$_SESSION : 获取session

22.Linux新用户配置文件的目录

/etc/skel/目录是用来存放新用户配置文件的目录,当我们添加新用户的时候,这个目录下的所有文件会自动被复制到新添加的用户的家目录下。这个目录下的所有文件都是隐藏文件(以.点开头的文件)。

23. 国标码,区位码,机内码,机器码的区别?

【国标码】指国家标准汉字编码:GB-2312

【区位码】区位码在GB-2312中预留了一些空位,便于补充和扩展

【机内码】汉字ASCII码。指计算机内部存储,处理加工和传输汉字时所用的由0和1符号组成的代码。

【机器码】计算机直接使用的程序语言,其语句就是机器指令码。

0 人点赞