• Redis延迟双删-架构案例2021(三十二)


    • 数据库设计

    某医药销售企业因业务发展,需要建立线上药品销售系统,为用户提供便捷的互联网药品销售服务、该系统除了常规药品展示、订单、用户交流与反馈功能外,还需要提供当前热销产品排名、评价分类管理等功能。

    通过对需求的分析,在数据管理上初步决定采用关系数据库(MySQL)和数据库缓存(Redis)的混合架构实现。

    经过规范化设计之后,该系统的部分数据库表结构如下所示。

    供应商(供应商ID,供应商名称,联系方式,供应商地址);

    药品(药品ID,药品名称,药品型号,药品价格,供应商ID);

    药品库存(药品ID,当前库存数量);

    订单(订单号码,药品ID,供应商ID,药品数量,订单金额);

    【问题1】(9分)

    在系统初步运行后,发现系统数据访问性能较差。经过分析,刘工认为原来数据库规范化设计后,关系表过于细分,造成了大量的多表关联查询,影响了性能。例如当用户查询商品信息时,需要同时显示该药品的信息、供应商的信息、当前库存等信息。

    为此,刘工认为可以采用反规范化设计来改造药品关系的结构,以提高查询性能。修改后的药品关系结构为:

    药品(药品ID,药品名称,药品型号,药品价格,供应商ID,供应商名称,当前库存数量);

    请用200字以内的文字说明常见的反规范化设计方法,并说明用户查询商品信息应该采用哪种反规范化设计方法。

    答案:

    表的反规范化设计由四种:

    1. 增加冗余列:复制某一列数据。
    2. 增加派生列:增加派生列,比如平均值,求和等。
    3. 表合并:把两个不同表的列合并成一个表。
    4. 表分割:把写不常用的列拆分成新的表,比如个人信息的地址,拆分成单独的表,减少查询压力,这也是垂直拆分的一种。

    【问题2】(9分)

    王工认为,反规范化设计可提高查询的性能,但必然会带来数据的不一致性问题。请用200字以内的文字说明在反规范化设计中,解决数据不一致性问题的三种常见方法,并说明该系统应该采用哪种方法。

    答案:

    1. 采用事务来保证冗余列在不同的表保证一致性,要么全部成功,要么全部失败。
    2. 采用定时器批量处理,适用于数据不实时更新。
    3. 适用数据库的触发器,在更新时候会自动更新其他表。

    1的话可能改动比较大,综合实际情况,供应商改动都不大,这时候一般采用定时器就好。

    【问题3】(7分)

    该系统采用了Redis来实现某些特定功能(如当前热销药品排名等),同时将药品关系数据放到内存以提高商品查询的性能,但必然会造成Redis和MySQL的数据实时同步问题。

    ( )Redis的数据类型包括String、Hash、List、Set和ZSet等,请说明实现当前热销药品排名的功能应该选择使用哪种数据类型。

    ( )请用200字以内的文字解释说明解决Redis和MySQL数据实时同步问题的常见方案。

    答案:

    Zset非常适合排名使用。

    常见redis和数据库同步方案,被动同步和主动同步。

    1. 被动同步:当每次新增和修改的时候,去更新redis,当没值的时候,查询数据库把值赋值到redis,当修改的时候,也修改redis的数据。(有不同步问题采用延迟双删解决)

    (延迟双删是在存入数据库之后,睡眠一段时间,再把redis数据删掉,保证后面redis数据和数据库的一致)

    1. 主动同步:主动在程序读取mysql的binlog日志,把日志里的数据写入到redis。

    • web系统架构设计

    某公司拟开发一个智能家居管理系统,该系统的主要功能需求如下:1)用户可使用该系统客户端实现对家居设备的控制,且家居设备可向客户端反馈实时状态;2)支持家居设备数据的实时存储和查询;3)基于用户数据,挖掘用户生活习惯,向用户提供家居设备智能化使用建议。

    基于上述需求,该公司组建了项目组,在项目会议上,张工给出了基于家庭网关的传统智能家居管理系统的设计思路,李工给出了基于云平台的智能家居系统的设计思路。经过深入讨论,公司决定采用李工的设计思路。

    【问题1】(8分)

    请用400字以内的文字简要描述基于家庭网关的传统智能家居管理系统和基于云平台的智能家居管理系统在网关管理、数据处理和系统性能等方面的特点,以说明项目组选择李工设计思路的原因。

    答案:

    网关管理:云平台更强,可实现远程网关管理,对不同地点的多种设备管理,管理能力更强。

    数据处理:数据一般通过网关上传到云数据库,这样更容易处理和分析数据,以及更安全和容灾性。

    系统性能:在云平台上处理,更强数据处理能力,性能更好。

    【问题2】(12分)

    请从下面给出的(a)~(j)中进行选择,补充完善图5-1中空( )~( )处的内容,协助李工完成该系统的架构设计方案。

    (a)Wi-FI

    (b)蓝牙

    (c)驱动程序

    (d)数据库

    (e)家庭网关

    (f)云平台

    (g)微服务

    (h)用户终端

    (i)鸿蒙

    (j)TCP/IP

    答案:

    (1)填写h用户端

    (2)填写i鸿蒙

    (3)填写g微服务应该填写f(云平台)

    (4)填写d数据库

    (5)填写f云平台应该填写e家庭网关

    (6)填写c驱动程序

    【问题3】(5分)

    该系统需实现用户终端与服务端的双向可靠通信,请用300字以内的文字从数据传输可靠性的角度对比分析TCP和UDP通信协议的不同,并说明该系统应采用哪种通信协议。

    答案:

    应该选择TCP保证传输的可靠性。

    TCP是一种面向连接、可靠的、基于字节流传输层通信协议。TCP之所以可靠,因为建立了三次握手动作,当丢包的时候,则能重传保证可靠。

    UDP则是一种面向无连接的通信传输协议,丢包了不会重传,不能保证通信可靠性。

  • 相关阅读:
    Linux下修改jar包中的配置文件application.conf
    在win7 上安装 Visual Studio 2019 步骤 及 vs2019离线安装包
    Python调试学习资料
    【Java网络编程】
    分布式应用之zookeeper集群+消息队列Kafka
    2020ICPC南京站
    在.NET 8 RC1 版本中 MAUI、ASP.NET Core 和 EF8 的新特性
    猿创征文|【单片机】keil和Proteus使用教程
    前端 Websocket + Stomp.js 的使用
    Docker 入门指南
  • 原文地址:https://blog.csdn.net/ke1ying/article/details/133027025