面试题答案
一键面试常见业务场景
- 高并发流量削峰:在电商促销、抢购等活动时,大量请求瞬间涌入。消息队列接收并暂存这些请求,缓存中间件(如Redis)快速响应读请求,从缓存中获取商品信息等数据。避免后端服务直接承受高并发压力,保护数据库等持久化存储,防止因大量请求导致系统崩溃。
- 异步任务处理:例如用户注册后发送邮件、短信通知等任务。消息队列接收注册成功的消息,将这些异步任务放入队列。缓存中间件可用于存储任务执行的一些临时状态或配置信息。任务处理系统从消息队列中消费任务,并根据缓存中的配置信息执行任务,提高系统整体的响应速度和处理效率。
- 数据同步:在分布式系统中,不同数据源之间的数据同步是常见需求。消息队列可以接收数据变更的消息,如数据库表数据的插入、更新等操作。缓存中间件用于存储最新的同步数据,通过消息队列将数据变更消息发送给负责同步的服务,该服务从消息队列获取消息,更新缓存中的数据,保证不同数据源之间数据的一致性。
消息队列向Redis写入数据的方式
- 选择消息队列:以RabbitMQ为例,它是一个广泛使用的消息队列。首先需要安装并配置好RabbitMQ服务。
- 生产者发送消息:在后端应用中,编写生产者代码,使用RabbitMQ的客户端库连接到RabbitMQ服务器,创建一个队列(例如命名为
data_to_redis
)。当有需要写入Redis的数据时,将数据封装成消息发送到该队列。例如在Python中使用pika
库:
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='data_to_redis')
data = {'key': 'value'}
channel.basic_publish(exchange='', routing_key='data_to_redis', body=str(data))
connection.close()
- 消费者接收消息并写入Redis:编写消费者代码,同样使用RabbitMQ客户端库连接到服务器并监听
data_to_redis
队列。当接收到消息时,解析消息内容,并使用Redis客户端库将数据写入Redis。还是以Python为例,使用redis - py
库:
import pika
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='data_to_redis')
def callback(ch, method, properties, body):
data = eval(body.decode('utf - 8'))
key = list(data.keys())[0]
value = data[key]
r.set(key, value)
channel.basic_consume(queue='data_to_redis', on_message_callback=callback, auto_ack=True)
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
上述代码中,生产者将数据发送到RabbitMQ队列,消费者从队列接收数据并写入Redis缓存中。在实际应用中,需要根据具体业务场景优化代码,如处理异常、批量操作等。