面试题答案
一键面试缓存策略
- 缓存策略的选择与设计:
- 选择:可以选用分布式缓存如Redis。它支持多种数据结构,读写速度极快,能应对高并发。对于读多写少的场景,适合使用Redis的缓存机制,将经常访问的数据存储在缓存中。比如商品详情接口,商品信息变动频率低,但查询频繁,可缓存商品详情数据。
- 设计:设置合理的缓存过期时间,避免缓存雪崩(大量缓存同时过期),可采用随机过期时间;考虑缓存穿透(查询不存在的数据一直穿透到数据库)问题,可在缓存中设置空值缓存,避免无效查询直达数据库;对于缓存击穿(热点数据缓存过期瞬间大量请求直达数据库),可使用互斥锁,保证只有一个请求去数据库加载数据并回写缓存。
- 优点:
- 极大提高接口响应速度,减少数据库压力,因为直接从缓存获取数据比从数据库查询快得多。
- 提高系统并发处理能力,缓存分担了大量请求,使系统能承载更多并发。
- 缺点:
- 数据一致性问题,缓存和数据库数据存在短暂不一致情况,尤其在写操作后。
- 缓存空间成本,如果缓存数据量巨大,需要足够的内存空间,增加硬件成本。
- 适用场景:读多写少场景,如电商商品展示、新闻资讯展示等;对数据一致性要求不是特别高的场景。
数据库操作优化
- 数据库操作的优化:
- 查询优化:分析SQL语句,使用索引来加速查询。例如对于根据用户ID查询用户信息的接口,如果经常根据用户ID查询,就在用户ID字段上建立索引。避免全表扫描,减少查询数据量,只查询需要的字段,而不是使用SELECT *。
- 连接池:使用数据库连接池技术,如HikariCP。它能复用数据库连接,减少连接创建和销毁的开销,提高数据库操作效率。
- 分库分表:当数据量巨大时,进行水平分库分表。比如按用户ID的哈希值对用户表进行分表,可降低单表数据量,提高查询性能。
- 优点:
- 直接提升数据库查询性能,提高接口响应速度。
- 连接池复用连接,减少资源消耗,提升系统整体性能。
- 分库分表能应对大数据量场景,避免数据库性能瓶颈。
- 缺点:
- 索引维护成本,创建过多索引会增加写操作的开销,因为每次写操作都要更新索引。
- 连接池配置不当可能导致性能问题,如连接数设置不合理。
- 分库分表增加了系统复杂度,数据的跨库跨表查询和维护变得更困难。
- 适用场景:各种涉及数据库操作的场景,尤其是数据量较大、查询频繁的业务场景。
异步处理机制
- 异步处理机制的应用:
- 消息队列:引入消息队列如Kafka、RabbitMQ。对于一些非关键且耗时的操作,如订单创建后的积分计算、日志记录等,将这些任务封装成消息发送到消息队列,由消费者异步处理。
- 线程池:在微服务内部使用线程池处理一些异步任务。例如,在处理文件上传接口时,文件上传成功后,使用线程池异步处理文件的压缩、格式转换等操作。
- 优点:
- 提高接口响应速度,将耗时任务异步处理,主线程可快速返回响应。
- 提高系统的并发处理能力,能同时处理更多请求,增强系统的吞吐量。
- 解耦业务逻辑,不同的异步任务可以独立开发、维护和扩展。
- 缺点:
- 增加系统复杂度,需要处理消息队列的可靠性、顺序性等问题,线程池也需要合理配置参数。
- 可能出现数据不一致问题,比如异步任务处理失败未及时察觉和处理。
- 适用场景:有耗时操作且对响应时间敏感的场景;业务逻辑可解耦的场景,如订单相关的后续非实时任务处理。