MST

星途 面试题库

面试题:Redis消息队列在MySQL社交互动系统中如何处理高并发点赞操作

在MySQL社交互动系统中,点赞操作较为频繁,容易产生高并发情况。假设使用Redis消息队列来处理点赞逻辑,阐述你会如何设计这个流程,以及如何保证数据的一致性和可靠性?
41.5万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

设计流程

  1. 点赞请求接收:当用户在社交互动系统中点击点赞按钮时,前端将点赞请求发送到后端服务器。
  2. 消息入队:后端服务器接收到点赞请求后,将点赞相关信息(如点赞用户ID、被点赞对象ID等)封装成消息,发送到Redis消息队列中。例如,可以使用Redis的RPUSH命令将消息添加到队列尾部。
  3. 消费处理:启动一个或多个消费者进程,从Redis消息队列中获取点赞消息。消费者使用LPOP命令从队列头部取出消息,并根据消息中的信息进行点赞逻辑处理。例如,在MySQL数据库中更新点赞数,可能执行类似UPDATE posts SET likes = likes + 1 WHERE post_id = {post_id}的SQL语句,其中{post_id}是从消息中获取的被点赞对象ID。
  4. 反馈机制:处理完点赞逻辑后,消费者可以向客户端返回点赞成功的响应。如果在处理过程中出现错误,如数据库更新失败等,消费者可以将错误信息返回给客户端。

保证数据一致性

  1. 事务处理:在MySQL数据库更新点赞数时,使用事务来确保数据的一致性。例如,在Python的pymysql库中,可以这样实现:
import pymysql

conn = pymysql.connect(host='localhost', user='user', password='password', database='social_db')
try:
    with conn.cursor() as cursor:
        # 开启事务
        conn.begin()
        sql = "UPDATE posts SET likes = likes + 1 WHERE post_id = %s"
        cursor.execute(sql, (post_id,))
        # 提交事务
        conn.commit()
except Exception as e:
    # 回滚事务
    conn.rollback()
    raise e
finally:
    conn.close()
  1. 幂等性处理:为了防止重复消费消息导致点赞数重复增加,处理点赞逻辑的代码需要具备幂等性。可以在数据库表中添加唯一约束,例如(user_id, post_id)组合唯一,这样即使重复消费相同点赞消息,数据库也不会重复更新点赞数。

保证数据可靠性

  1. 持久化配置:对Redis进行持久化配置,如开启AOF(Append - Only File)或RDB(Redis Database)持久化。AOF持久化将写操作追加到日志文件中,RDB持久化将数据库快照保存到磁盘。这样即使Redis重启,消息队列中的数据也不会丢失。
  2. 消息确认机制:消费者在成功处理点赞消息后,向Redis发送一个确认消息,例如将已处理的消息ID存储到另一个Redis集合中。如果消费者在处理消息过程中崩溃,重启后可以根据这个确认集合判断哪些消息已经处理过,避免重复处理。
  3. 监控与重试:建立监控机制,实时监测消息队列的长度、消费者的处理速度等指标。如果发现消息堆积或处理失败的情况,及时进行人工干预或自动重试。例如,可以设置一个重试次数的阈值,当处理点赞逻辑失败时,按照一定的时间间隔进行重试,直到达到阈值或成功处理。