面试题答案
一键面试更新策略
- 实时更新:在MySQL商品销量数据更新的事务中,紧接着同步更新Redis有序集合。这样能保证数据的实时一致性,但可能对MySQL事务性能有一定影响。例如,在电商系统中用户下单成功,在更新MySQL中商品销量的同时,立即更新Redis中的有序集合。
- 异步更新:利用消息队列(如RabbitMQ、Kafka)。当MySQL商品销量更新后,发送一条消息到消息队列。有专门的消费者监听队列,从队列中获取消息并更新Redis有序集合。这种方式能减少对MySQL事务的影响,提升系统整体性能,缺点是可能存在短暂的数据不一致。比如在一些日志记录系统中,使用异步方式更新相关统计数据。
可能用到的技术手段
- Redis命令:使用
ZADD
命令来更新有序集合。ZADD
可以向有序集合中添加成员,若成员已存在则更新其分数(这里分数可对应商品销量)。例如ZADD product_rankings <new_sales_count> <product_id>
,其中product_rankings
是有序集合的键,<new_sales_count>
是更新后的销量,<product_id>
是商品ID。 - 数据库触发器(可选):在MySQL中可以创建触发器,当商品销量数据所在表的
UPDATE
操作发生时,触发一个动作,比如向消息队列发送消息(如果采用异步更新策略)。不过要注意触发器可能增加数据库维护成本。 - 分布式锁(可选):如果系统是分布式的,在更新Redis有序集合时可能会出现并发问题。可以使用分布式锁(如基于Redis的SETNX实现的分布式锁),保证同一时间只有一个服务实例进行更新操作,避免数据不一致。