C++面试

1.redis缓存穿透、缓存击穿、缓存雪崩

Redis缓存穿透、缓存击穿和缓存雪崩是常见的缓存相关问题,下面我将对它们进行详细解释:

  1. 缓存穿透(Cache Penetration): 缓存穿透指的是在缓存中无法找到需要的数据,导致请求直接击穿缓存层,直接访问数据库。这通常发生在恶意用户或者攻击者故意请求不存在的数据,这样每次请求都会穿透缓存导致大量对数据库的访问。为了解决这个问题,可以在查询结果为空时,仍然将空结果缓存起来,但设置一个较短的过期时间,从而避免频繁查询数据库。

  2. 缓存击穿(Cache Breakdown): 缓存击穿指的是某个热点数据失效后,恰好有大量并发请求同时访问该热点数据,导致数据库负载急剧增加。通常情况下,缓存中的数据都是有过期时间的,当某个热点数据过期后,如果大量请求同时访问该数据,此时缓存为空,请求就会直接访问数据库。为了解决这个问题,可以采用互斥锁机制,在查询数据库之前先获得锁,如果获取锁失败,则等待一段时间后重试。

  3. 缓存雪崩(Cache Avalanche): 缓存雪崩指的是大规模缓存失效导致数据库压力过大,甚至宕机。这通常发生在缓存中的大量数据同时过期时,由于缓存层失效,所有请求都直接访问数据库。这种情况下,数据库可能无法承受如此大量的请求,导致系统瘫痪。为了避免缓存雪崩,可以采用以下策略:设置不同的过期时间,避免同时过期;引入多级缓存,分散请求;使用热点数据预热,提前将热点数据加载到缓存中。

2.GET、POST区别,问的比较细

区别:1、post请求更安全;post请求不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中,get请求的是静态资源,则会缓存,如果是数据,则不会缓存。2、post请求发送的数据更大,get请求有url长度限制。3、post请求能发送更多的数据类型,get请求只能发送ASCII字符。4、传参方式不同。5、get产生一个TCP数据包;post产生两个。

get请求:从指定的资源请求数据,用于获取数据,一般用于搜索排序和筛选之类的操作。

post请求:向指定的资源提交要被处理的数据,用于将数据发送给服务器,一般用于修改和写入数据。

get请求和post请求本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。

post请求和get请求的区别

(1)post请求更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中,get请求的是静态资源,则会缓存,如果是数据,则不会缓存)

(2)post请求发送的数据更大(get请求有url长度限制,http协议本身不限制,请求长度限制是由浏览器和web服务器决定和设置)

(3)post请求能发送更多的数据类型(get请求只能发送ASCII字符)

(4)传参方式不同(get请求参数通过url传递,post请求放在request body中传递)

(5)get请求产生一个TCP数据包;post请求产生两个TCP数据包(get请求,浏览器会把http header和data一并发送出去,服务器响应200返回数据;post请求,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 返回数据)

注意:在发送 POST 的时候都没有带 Expect 头,server 也自然不会发 100 continue。

post请求的过程:

(1)浏览器请求tcp连接(第一次握手)

(2)服务器答应进行tcp连接(第二次握手)

(3)浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)

(4)服务器返回100 Continue响应

(5)浏览器发送数据

(6)服务器返回200 OK响应

get请求的过程:

(1)浏览器请求tcp连接(第一次握手)

(2)服务器答应进行tcp连接(第二次握手)

(3)浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)

(4)服务器返回200 OK响应

网络环境好的情况下,发一次包和发两次包的时间差别基本可以忽略。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。

3.HTTP和TCP什么关系

HTTP和TCP的关系_http tcp_勇气和坚持的博客-CSDN博客

4.TCP报文包括哪些部分

TCP报文结构_StudyWinter的博客-CSDN博客

 

你可能感兴趣的:(面经,缓存,redis,数据库,c++,面试)