面试题答案
一键面试1. Redis与MySQL的部署方式
- MySQL部署:采用主从复制架构,主库负责写操作,从库负责读操作,以提高读性能和数据冗余备份。主从之间通过二进制日志(binlog)进行数据同步。例如,可以部署一主多从,主库处理商品数据的增删改,从库分担大量价格区间查询的读压力。
- Redis部署:采用集群模式,如Redis Cluster。通过将数据分片存储在多个节点上,提高数据存储和查询的性能及可扩展性。每个节点负责一部分数据的存储和读写,集群会自动管理数据的分布和故障转移。
2. 数据同步机制
- MySQL到Redis:利用MySQL的binlog,通过中间件如Canal来监听binlog日志变化。当商品数据在MySQL中有价格更新、新增商品等操作时,Canal捕获这些变化,并将相关数据同步到Redis。例如,当商品价格更新时,Canal获取到价格变化信息,然后将对应商品的价格及相关唯一标识(如商品ID)同步到Redis有序集合中。
- Redis到MySQL:在Redis中提供一个异步任务队列,当Redis中商品价格等数据有变化(如缓存数据被更新)时,将更新操作封装成任务放入队列。然后有一个后台线程不断从队列中取出任务,批量写入MySQL,确保MySQL数据与Redis数据的一致性。
3. 缓存失效策略
- 定期删除:设置一个定时器,每隔一段时间(如10分钟)扫描Redis有序集合,删除过期时间超过设定阈值(如1小时)的商品数据。
- 惰性删除:当查询Redis有序集合中的商品数据时,检查该数据是否过期。若过期,则从有序集合中删除,并从MySQL中重新加载最新数据到Redis。
4. Redis故障处理
- 保证可用性:采用Redis Sentinel(哨兵)机制作为Redis Cluster的高可用解决方案。Sentinel会不断监控Redis节点的健康状况,当发现某个主节点出现故障时,自动进行故障转移,选举一个从节点成为新的主节点,确保Redis服务的可用性。在应用层,配置多个Redis连接地址,当一个连接出现故障时,能够快速切换到其他可用的Redis节点。
- 保证数据完整性:在Redis出现故障时,应用程序先使用MySQL进行价格区间查询,同时记录下所有查询请求。当Redis恢复后,根据记录的查询请求,从MySQL中批量获取数据并重新同步到Redis,确保Redis数据的完整性。另外,利用Redis的持久化机制(RDB和AOF),在故障恢复时尽可能恢复故障前的数据状态。
5. 关键技术点及创新之处
- 关键技术点:
- Redis有序集合:利用其有序性和score值的特性,能够高效地进行价格区间查询。通过将商品价格作为score,商品ID等唯一标识作为member,可快速定位符合价格区间的商品。
- MySQL binlog与Canal:实现MySQL数据到Redis的实时同步,确保Redis缓存数据的及时性和准确性。
- Redis Cluster和Sentinel:分别提供数据的分布式存储和高可用性,保障系统在大数据量和高并发情况下的稳定运行。
- 创新之处:
- 双向数据同步机制:不仅实现从MySQL到Redis的数据同步,还通过异步任务队列实现从Redis到MySQL的反向同步,确保数据在两个存储之间的一致性,避免数据冲突和丢失。
- 故障恢复与数据完整性保障:通过记录查询请求,在Redis恢复后重新同步数据,结合Redis持久化机制,能更全面地保证数据完整性,减少故障对业务的影响。