高并发redis-mysql架构设计

本文介绍了一种高并发场景下Redis与Mysql结合使用的架构设计方案,包括针对非事务处理的设计思路、DAO方法及单个SQL的处理流程。特别关注了如何在不同操作类型下(如新增、修改、删除和查询)保证数据的一致性和高可用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

高并发redis-mysql架构设计


流程

总体设计

  1. 针对非事务
  2. 针对dao方法
  3. 针对单个sql
    在这里插入图片描述

dao代理

在这里插入图片描述

在这里插入图片描述

  1. 方法请求:
    处理指定注解的方法,如果该方法没有注解,就走一般流程(AOP实现),(要考虑到除了注解还有配置方式)
    如果注解解析异常返回,设置执行对象的状态30001

  2. dao代理接口

    1. 操作类型解析,如果异常就不执行下面的步骤,设置执行对象的状态30002,并返回给方法请求
    2. 操作类型解析成功后,获取到执行对象—>初始化补偿表状态30000
  3. 操作类型解析,解析方法的请求类型,和请求参数,解析成功后,设置执行对象的初始状态30000。

    1. 组装key,默认提供key生成规则,和自定义key生成规则(提供可扩展接口)
    2. 新增类型:如果redis没有对应的主键,同步mysql的主键+1,如果有主键值,主键值+1,这一版本不做
    3. 修改类型:根据key更新数据,不考虑维护键关系
    4. 删除类型:根据key删除数据,不考虑维护键关系
    5. 查询类型:根据key查询数据,不考虑维护键关系,且不初始化
  4. 执行对象

    1. 发送请求给redis处理器,并等待返回的执行对象,根据返回对象更新补偿表,如果连接异常,设置执行对象的状态30003
    2. 发送请求给MQ(异步),如果连接异常,设置执行对象的状态30004
    3. 发送请求补偿表,如果连接异常,设置执行对象的状态30013
  5. 整体做事务(redis事务)

Redis处理器设计

在这里插入图片描述
在这里插入图片描述

  1. dao代理:

    1. 发送请求给redis处理器,并等待返回的执行对象,根据返回对象更新补偿表,如果连接异常,设置执行对象的状态30003
  2. Redis处理器:(要考虑reids处理器的高可用)

    1. 返回执行对象给dao代理
  3. 请求类型解析curd

    1. 如果解析异常,设置执行对象的初始状态30005
    2. 新增类型:如果redis没有对应的主键,同步mysql的主键+1,如果有主键值,主键值+1,这一版本不做
    3. 修改类型:根据key更新数据,不考虑维护键关系
    4. 删除类型:根据key删除数据,不考虑维护键关系
    5. 查询类型:根据key查询数据,不考虑维护键关系
  4. 同步mysql

    1. 只要考虑查询的情况
    2. 如果查询查不到数据,请求sql处理器获取数据,按照key生成规则,同步数据到redis
  5. 执行redis读写

    1. 对redis操作,不管成功失败,都对执行对象设置对应的状态码
  6. 更新补偿表

    1. 根据执行redis读写后的执行对象,更新补偿表,这里注意防止dao代理的重复更新补偿表。
  7. 整体做事务(redis事务)

sql处理器设计

在这里插入图片描述
在这里插入图片描述

  1. sql处理器

    1. 请求MQ连接,消费MQ里面的消息(任务id),只要消费,MQ消息就丢弃一条
    2. 获取到任务id,到补偿表获取任务id对应的具体信息
  2. 执行

    1. 解析消息
    2. 考虑现有的数据库Dao接口,不改动代码情况下,执行调用dao。(反射实现,或者定义一个消费消息表(redis))
      1. 消费消息表设计:MQ解析任务id,通过任务id从消费消息表中解析获取具体的dao()
      2. 反射实现:核心参数
        1. 任务id
        2. 全类名
        3. 方法名
        4. 参数
    3. 只执行redis处理器处理成功的数据,(查补偿表对应的状态数据)
    4. 不管成功或者失败,通过执行结果更新补偿表,(定时修复处理那边需要这里的数据)
    5. 控制sql的执行频率(线程池)
      1. 执行频率:检测sql的cpu,内存,连接数,动态设置执行频率,默认
      2. 用户自定义执行频率
  3. 补偿表

    1. 根据执行结果,更新补偿表
  4. 整体做事务(redis事务)

定时修复处理器

在这里插入图片描述

  1. 定时修复处理器

    1. 获取补偿表的数据,这里有存在连接异常。如果连接异常,切换任一台机器的补偿表(补偿表的高可用)
    2. 对数据就行解析处理
    3. 修复的数据来源sql处理器和redis处理器
  2. sql处理器

    1. 修复数据
    2. 修复状态
      1. 成功:删除补偿表数据
      2. 失败
        1. (sql执行失败,非连接问题):

          1. 记录执行的sql
          2. 给人发送邮件(配置方式,web管理方式,权限配置)
          3. 给人发送短信(配置方式,web管理方式,权限配置)
          4. 将要修复的数据从补偿表中迁移到其他表(修复错误补偿表)
          5. 提供人工修复接口(接口要做权限,安全配置)
        2. (sql执行失败,连接问题)

          1. 连接问题,mysql连接失败,给响应的人员发送短信通知
        3. 修复数据是分层次的,先让运营人员调用修复接口修复,还不能成功,在让开发人员去修复。

  3. 整体做事务(redis事务)

执行对象设计(executeO)

核心字段

Integer operationType:操作类型,curd,目前新增不做   
String taskId:任务id,跟踪整个流程  
Class classFullName:代理的class,反射  
String method:代理的方法,反射
Objectp[] args:代理的方法参数,反射
Integer status:状态,与补偿表的补偿机制有关
String key:redis的key
String description:描述
object  returnMessage:返回的消息体
Class  returnType:返回的消息类型,封装返回的消息
Long  createId:创建人ID 
Date  createTime:创建时间
Long  modifyId:修改人ID
Date  modifyTime:修改时间

key生成规则策略

提供对外接口,先扫描有没有用户自定义策略,如果有就加载自定义策略,否则加载默认策略。bean或者配置的方式都可以
执行该接口的方法生成key

  1. 默认策略,前缀+按照参数名称排序生成key+后缀.
    1. 案例: order_id+(price+userName)+order
  2. 用户定义策略(实现某个接口就可以)

启动阶段

将相关的数据同步到redis中
注意限流(多线程)

补偿表设计

字段
	 
	状态
	备注(mysql处理数据的时候,备注结果)
	任务id
	操作类型
	参数
	类名
	方法名

MQ设计

只记录任务id

异常状态状态

30000:补偿表初始化状态
30001:注解解析异常
30002:操作类型解析异常
30003:请求redis处理器异常,连接异常
30004:请求MQ异常,连接异常
30005:redis请求类型解析异常
30006:redis连接异常
30007:redis数据删除异常
30008:redis数据更新异常
30009:补偿表连接异常异常
30010:执行sql异常
30011:redis处理器执行成功
30012:sql处理器执行成功
30013:初始化补偿表异常

各个状态生成条件或影响

30000:补偿表初始化状态

生成条件:只有操作类型是修改或者删除,并且成功创建了执行对象
影响:只有初始化补偿表,后面模块才能更新
动作:初始化补偿表

30001:注解解析异常

生成条件:解析方法注解的时候发生
影响:dao代理无法执行下去,这一个过程出现异常直接返回给方法调用。
动作:

30002:操作类型解析异常

生成条件:dao代理解析操作类型阶段
影响:dao代理无法执行下去,这一个过程出现异常直接返回给方法调用。
动作:

30003:请求redis处理器异常,连接异常

生成条件:执行对象创建成功,连接redis处理器时候
影响:补偿表有初始化,但后面redis处理器,sql处理器,修复处理器没法更新对应的任务,补偿表的key应该有失效机制(过期)。
动作:重连机制,重连无效,调用补偿表key失效机制

30004:请求MQ异常,连接异常

生成条件:redis处理器已经返回正确的数据后,连接MQ
影响:这个时候补偿表状态已经更新为30011。需求sql同步结果
动作:重连机制,重连无效,更新补偿表状态为手动补偿30014,返回redis处理器的执行结果

30005:redis请求类型解析异常

生成条件:redis处理器解析请求类型的时候
影响:补偿表有初始化,但后面redis处理器,sql处理器,修复处理器没法更新对应的任务,补偿表的key应该有失效机制(过期)
动作:调用补偿表key失效机制

30006:redis连接异常

生成条件:redis连接
影响:补偿表有初始化,但后面redis处理器,sql处理器,修复处理器没法更新对应的任务,补偿表的key应该有失效机制(过期)。
动作:重连机制,重连无效,调用补偿表key失效机制

30007:redis数据删除异常

生成条件:redis处理器删除操作的时候。
影响:补偿表有初始化,但后面redis处理器,sql处理器,修复处理器没法更新对应的任务,补偿表的key应该有失效机制(过期)。。
动作:调用补偿表key失效机制

30008:redis数据更新异常

生成条件:redis处理器更新操作的时候。
影响:补偿表有初始化,但后面redis处理器,sql处理器,修复处理器没法更新对应的任务,补偿表的key应该有失效机制(过期)。
动作:调用补偿表key失效机制

30009:补偿表连接异常异常

生成条件:连接补偿表的时候,目前补偿表放在redis中,也就是该异常是redis连接异常
影响:可能发生在初始化接口,也可能发生在其他更新补偿表阶段
动作:重连机制,重连无效,调用补偿表key失效机制,

30010:执行sql异常

生成条件:sql处理器执行阶段
影响:已产生了redis处理的正确数据,需要同步sql
动作:更新补偿表状态为手动补偿30014,返回redis处理器的执行结果

30011:redis处理器执行成功

生成条件:redis处理器执行成功,获取正确数据
影响:影响dao代理是否发送MQ,影响sql处理器是否同步sql,影响修复处理器是否修复数据。
动作:

30012:sql处理器执行成功

生成条件:sql处理器执行成功,获取正确数据
影响:影响修复处理器是否修复数据。
动作:

30013:初始化补偿表异常

生成条件:dao代理初始化补偿表
影响:针对更新和删除操作
动作:

30014:补偿表手动补偿异常

生成条件::sql处理器执行阶段
影响:定时修复处理器处理这种异常
动作:

30014:补偿表更新异常

生成条件:补偿表更新状态的时候
影响:可能redis,sql数据不同步
动作:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值