面试题答案
一键面试- 生产者端:
- 持久化消息:
- 在MySQL中记录待发送到Redis消息队列的消息,比如在一张
message_queue
表中,记录消息的唯一标识、内容、状态等信息。状态初始为“待发送”。 - 发送消息前,先插入数据库记录,利用MySQL的事务机制保证记录的可靠性。
- 在MySQL中记录待发送到Redis消息队列的消息,比如在一张
- 确认发送:
- 发送消息到Redis队列后,生产者等待Redis的确认响应。如果在一定时间内未收到确认,重新发送消息。例如在Python中使用
redis - py
库,r = redis.Redis()
,result = r.rpush('queue_name', message)
,根据result
判断是否发送成功。若未成功,可重试多次。
- 发送消息到Redis队列后,生产者等待Redis的确认响应。如果在一定时间内未收到确认,重新发送消息。例如在Python中使用
- 持久化消息:
- 消费者端:
- 消息预取控制:
- 消费者从Redis队列获取消息时,不要一次获取过多。比如在使用
rpop
获取消息时,合理设置每次获取的数量。如果一次获取过多,在处理过程中出现故障,可能导致大量消息丢失。
- 消费者从Redis队列获取消息时,不要一次获取过多。比如在使用
- 处理消息并持久化标记:
- 消费者获取消息后,先将消息处理结果记录到MySQL,例如在
message_queue
表中添加“处理结果”字段,标记消息已处理。可以利用MySQL事务保证处理结果记录的原子性。 - 处理完消息并持久化标记后,再从Redis队列中删除该消息。例如在Python中,处理完消息后执行
r.lrem('queue_name', 1, message)
删除已处理的消息。
- 消费者获取消息后,先将消息处理结果记录到MySQL,例如在
- 故障恢复:
- 若消费者在处理消息过程中发生故障,重启后,检查MySQL中状态为“待处理”的消息,重新从Redis队列获取并处理。通过消息的唯一标识确保不会重复处理已处理成功的消息。
- 消息预取控制:
- Redis配置:
- 持久化策略:
- 合理配置Redis的持久化策略,如使用AOF(Append - Only File)模式,AOF会以日志的形式记录每次写操作,在Redis重启时可以重新执行AOF文件中的命令来恢复数据。配置
appendonly yes
开启AOF模式,并合理设置appendfsync
策略,例如appendfsync everysec
,每秒执行一次同步操作,保证数据的可靠性。
- 合理配置Redis的持久化策略,如使用AOF(Append - Only File)模式,AOF会以日志的形式记录每次写操作,在Redis重启时可以重新执行AOF文件中的命令来恢复数据。配置
- 主从复制与哨兵机制:
- 采用主从复制保证数据冗余,当主节点发生故障时,从节点可以接管工作。配置多个从节点,例如在
redis.conf
中设置slaveof <master_ip> <master_port>
。 - 引入哨兵机制,自动监控主从节点的健康状况,当主节点故障时自动进行故障转移。配置哨兵的
redis - sentinel.conf
文件,设置monitor mymaster <master_ip> <master_port> <quorum>
,quorum
表示判断主节点下线至少需要的哨兵数量。
- 采用主从复制保证数据冗余,当主节点发生故障时,从节点可以接管工作。配置多个从节点,例如在
- 持久化策略: