面试题答案
一键面试数据读取流程
- 应用发起读请求:应用程序向系统发起读取数据的请求。
- 查询Redis缓存:首先检查Redis中是否存在所需数据。若存在,直接从Redis读取数据并返回给应用,此过程速度极快,可大幅减少响应时间。
- Redis未命中处理:若Redis中未找到数据,则向MySQL数据库发起查询请求。从MySQL读取数据后,将数据存入Redis缓存,以便后续相同请求可直接从Redis获取,同时返回数据给应用程序。
缓存更新策略
- 读写时同步更新:
- 写操作:当对MySQL进行数据写入(插入、更新、删除)操作时,同时更新Redis缓存中的相应数据,保证缓存与数据库数据一致性。
- 优点:能实时保证缓存和数据库数据的一致性。
- 缺点:增加了写操作的复杂度和耗时,因为每次写操作都需要同时操作两个存储系统。
- 失效策略:
- 写操作:对MySQL进行数据更新操作时,只更新数据库,不立即更新Redis缓存,而是设置该缓存数据的过期时间。当数据过期后,下次读取时从MySQL重新加载数据并更新缓存。
- 优点:写操作简单,仅需操作数据库,提升写操作性能。
- 缺点:在缓存过期前,可能存在数据不一致问题,特别是在高并发场景下,若缓存过期瞬间有大量请求,可能导致MySQL压力剧增(缓存击穿问题)。
- 异步更新:
- 写操作:对MySQL进行写操作后,通过消息队列(如Kafka、RabbitMQ等)异步通知更新Redis缓存。应用程序完成数据库写操作后,将更新缓存的任务发送到消息队列,由专门的消费者从队列中取出任务并更新Redis缓存。
- 优点:减少了写操作的阻塞时间,提高写性能,同时能保证最终一致性。
- 缺点:引入了消息队列,增加了系统复杂度,可能存在消息丢失、重复消费等问题,需要额外的机制来保证消息的可靠性和幂等性。