面试题答案
一键面试缓存设计思路
- 数据分类缓存
- 商品库存:使用分布式缓存(如Redis),以商品ID作为键,库存数量作为值。对于高销量商品可设置单独的缓存区域,提高访问效率。
- 商品价格:同样以商品ID为键,价格信息为值存储在缓存中。可与库存缓存放在同一缓存系统,但设置不同的命名空间以便管理。
- 订单状态:以订单ID为键,订单状态为值缓存。订单状态相对库存和价格变化频率较低,可设置较长的缓存时间。
- 缓存架构 采用多级缓存架构,如本地缓存(如Guava Cache)结合分布式缓存。本地缓存用于处理部分高频读请求,减少对分布式缓存的压力,分布式缓存用于保证数据的一致性和共享性。
缓存更新策略
- 读写锁策略
- 在更新数据时,先获取写锁,阻止其他读操作。更新数据库后,同步更新缓存,然后释放写锁。读操作时获取读锁,多个读操作可同时进行,但写操作进行时,读操作需等待写锁释放。
- 异步更新策略 对于非强一致性要求的数据更新,采用异步更新缓存的方式。例如,在订单状态更新后,将更新缓存的任务放入消息队列(如Kafka),由专门的消费者从队列中取出任务并更新缓存。这样可减少对业务流程的阻塞,提高系统响应速度。
- 先更新数据库,再更新缓存 在更新数据时,先确保数据库更新成功,然后立即更新缓存。为防止更新缓存失败,可记录失败日志并进行重试机制,或者采用补偿机制,如通过定时任务检查数据库和缓存的一致性并进行修复。
缓存失效机制
- 设置过期时间
- 为缓存数据设置合理的过期时间。对于商品库存,由于变化频繁,过期时间可设置较短,如几分钟;商品价格过期时间可稍长,如几小时;订单状态过期时间可根据业务需求设置为一天或更长。
- 主动失效 当数据库数据发生变化时,主动使相关缓存数据失效。例如,商品库存更新后,立即删除对应商品ID的缓存。可通过数据库的触发器或应用程序主动调用缓存删除接口来实现。
- 缓存淘汰策略
- 在缓存空间不足时,采用合适的淘汰策略,如LRU(最近最少使用)。Redis默认支持多种淘汰策略,可根据实际情况选择,确保重要数据不会被过早淘汰。