面试题答案
一键面试缓存策略
- 客户端缓存:
- 强缓存:在HTTP响应头中设置
Cache - Control
字段,如Cache - Control: max - age = 3600
,表示资源在1小时内有效,客户端可直接从本地缓存读取,无需向服务器发送请求。同时也可设置Expires
字段,但它是基于服务器时间的绝对过期时间,不如Cache - Control
灵活。 - 协商缓存:通过
Last - Modified
和If - Modified - Since
,或者ETag
和If - None - Match
这两对字段实现。服务器在响应头中返回Last - Modified
(资源最后修改时间)或ETag
(资源的唯一标识),客户端下次请求时带上If - Modified - Since
或If - None - Match
,服务器根据这些字段判断资源是否有更新,若未更新则返回304状态码,客户端使用本地缓存。
- 强缓存:在HTTP响应头中设置
- 服务端缓存:
- 内存缓存:使用如Redis这样的内存数据库,将经常访问的数据缓存起来。对于API接口,可根据请求参数生成唯一的缓存键,将响应结果缓存到Redis中。例如,对于一个根据用户ID获取用户信息的API,可将
user:{user_id}
作为缓存键,用户信息作为值缓存。读取时先查询缓存,若存在则直接返回,不存在再查询数据库等持久化存储。 - 分布式缓存:在大型高并发系统中,可采用分布式缓存,如Memcached集群。它通过将数据分布在多个节点上,提高缓存的容量和性能。技术要点在于合理的缓存数据分片,保证数据均匀分布在各个节点,避免热点数据集中在某几个节点上。
- 内存缓存:使用如Redis这样的内存数据库,将经常访问的数据缓存起来。对于API接口,可根据请求参数生成唯一的缓存键,将响应结果缓存到Redis中。例如,对于一个根据用户ID获取用户信息的API,可将
连接复用
- HTTP长连接:在HTTP/1.1协议中,默认开启长连接(
Connection: keep - alive
)。服务器和客户端建立一次TCP连接后,可在该连接上进行多次HTTP请求和响应,避免了每次请求都重新建立TCP连接的开销。在后端实现时,确保Web服务器配置支持长连接,如在Nginx中,keepalive_timeout
参数可设置长连接的超时时间,合理设置该值既能避免资源浪费,又能保证连接复用。 - HTTP/2:HTTP/2协议采用多路复用技术,在一个TCP连接上可以同时发送多个请求和接收多个响应,并且请求和响应可以交错进行,进一步提高了连接的利用率。后端服务要支持HTTP/2,需要升级Web服务器软件,如Nginx从1.9.5版本开始支持HTTP/2,同时应用程序框架也要支持HTTP/2协议的特性,如正确处理多路复用的请求和响应。
其他优化要点
- 异步处理:对于一些耗时的操作,如数据库查询、文件读写等,采用异步处理方式。在后端可使用多线程、异步函数等技术。例如在Java中,使用
CompletableFuture
实现异步任务,在Python中使用asyncio
库实现异步I/O操作。这样服务器在处理耗时任务时不会阻塞其他请求的处理,提高整体的并发处理能力。 - 负载均衡:通过负载均衡器将请求均匀分配到多个后端服务器上,避免单个服务器负载过高。常见的负载均衡算法有轮询、加权轮询、最少连接数等。在后端实现时,可使用硬件负载均衡器(如F5)或软件负载均衡器(如Nginx、HAProxy)。技术要点在于合理配置负载均衡器的参数,如健康检查机制,确保将请求分配到健康的服务器上。
- 优化数据库查询:减少数据库的查询次数,对查询结果进行缓存(如前面提到的服务端缓存)。优化SQL语句,使用索引提高查询效率。例如,对于经常用于查询条件的字段建立索引,避免全表扫描。在高并发场景下,合理使用数据库连接池,减少连接创建和销毁的开销。