该系统采用了Redis来实现某些特定功能(如当前热销药品排名等),同时将药品关系数据放到内存以提高商品查询的性能,但必然…
简答题
该系统采用了Redis来实现某些特定功能(如当前热销药品排名等),同时将药品关系数据放到内存以提高商品查询的性能,但必然会造成Redis和MySQL的数据实时同步问题。(1)Redis的数据类型包括String、Hash、List、Set和ZSet等,请说明实现当前热销药品排名的功能应该选择使用哪种数据类型。(2)请用200字以内的文字解释说明解决Redis和MySQL数据实时同步问题的常见方案。
答案:(1)应该选择ZSet(有序集合)数据类型,因为ZSet可以按分数排序,适合排名场景。(2)常见方案:双写、消息队列、binlog订阅。
解析
参考答案
(1) 选 ZSet。以药品ID为 member,销量或热度为 score,用 ZINCRBY 更新,ZREVRANGE 取 TopN。
(2) 同步方案:双写、消息队列、binlog订阅。双写简单但一致性差;MQ 解耦、可重试,但需防丢消息;binlog 订阅(Canal、Debezium)实时性好、业务无侵入,配合幂等与补偿。
得分点解析
- ZSet 适合排名:按 score 自动排序,范围查询高效。
- 双写:同时写 Redis 和 MySQL,实现简单,但并发失败易不一致。
- MQ:写库后发消息异步更新 Redis,解耦削峰,需可靠投递与幂等。
- binlog 订阅:监听 MySQL 变更日志,实时且业务解耦,需处理顺序与延迟。
延伸
可加过期时间、延迟双删、补偿任务,追求最终一致。