问答题

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

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

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

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

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

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

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

该系统采用了Redis来实现某些特定功能(如当前热销药品排名等),同时将药品关系数据放到内存以提高商品查询的性能,但必然会造成Redis和MySQL的数据实时同步问题。(1)Redis的数据类型包括String、Hash、List、Set和ZSet等,请说明实现当前热销药品排名的功能应该选择使用哪种数据类型。(2)请用200字以内的文字解释说明解决Redis和MySQL数据实时同步问题的常见方案。
【正确答案】

(1)热销药品排名适合用:ZSet

(2)

1.对强一致要求比较高的,应采用实时同步方案,即查询缓存查询不到再从数据库中查询,然后保存到缓存;更新缓存时,先更新数据库,再将缓存的设置过期(建议不要去更新缓存内容,直接设置缓存过期)。

2.对于并发程度较高的,可采用异步队列的方式同步,可采用kafka 等消息中间件处理消息生产和消费。

3.使用阿里的同步工具canal,canal实现方式是模拟 mysql slave和 master的同步机制,监控DB bitlog的日志更新来触发缓存的更新。

4.采用UDF自定义函数的方式,面对mysql的API进行编程,利用触发器进行缓存同步。

【答案解析】zset和 set类似,都是存储无序不重复的数据。但是zset会带有一个分数score,可以根据score去排序。