面试题答案
一键面试缓存架构设计
缓存层次设计
- 前端缓存:在客户端(如交易终端)设置缓存,缓存一些用户特定且不常变化的数据,如用户的个性化交易界面配置等。这样可以减少对后端服务的请求,加快响应速度。
- 应用层缓存:在应用服务器上设置本地缓存,例如使用 Ehcache 等。缓存热点数据,如最近频繁交易的股票基本信息、用户常用交易策略等。此层缓存可以快速响应大部分本地请求,减轻后端缓存和数据库压力。
- 分布式缓存:采用 Redis 等分布式缓存,缓存全局共享且频繁访问的数据,如市场实时行情数据(如股票价格、外汇汇率等)。分布式缓存可以通过集群方式扩展,满足高并发读写需求。
数据同步机制
- 主动推送:对于实时性要求极高的数据(如股票的实时价格变动),由数据源(如证券交易所接口)主动推送数据到分布式缓存,然后分布式缓存通过消息队列(如 Kafka)通知应用层缓存和前端缓存更新。
- 定时拉取:对于更新频率较低的数据(如期货合约的一些基本信息),应用层缓存定时从数据库拉取数据更新,并同步到分布式缓存和前端缓存。
缓存更新策略
- 写后更新:在交易发生时,先更新数据库,然后再更新缓存。这样可以保证数据库的一致性,但可能在短时间内出现缓存与数据库数据不一致的情况。
- 失效策略:对于更新频率高的数据,设置较短的缓存过期时间。当缓存过期后,再次请求时从数据库读取并更新缓存。
- 读写锁:在对缓存数据进行写操作时,加写锁,禁止其他读操作;写操作完成后,释放写锁。读操作时加读锁,允许多个读操作并发进行,但禁止写操作。
缓存与数据库一致性处理
- 事务机制:在进行交易操作时,将数据库更新和缓存更新放在一个事务中,确保要么都成功,要么都失败。
- 异步补偿:如果在更新缓存时出现失败,通过消息队列记录失败的操作,后续异步进行重试,保证缓存最终与数据库一致。
性能瓶颈及应对策略
性能瓶颈
- 缓存穿透:大量不存在的数据请求穿透缓存直接到达数据库,导致数据库压力过大。
- 缓存雪崩:缓存中大量数据同时过期,导致大量请求直接打到数据库,造成数据库过载。
- 缓存击穿:高并发情况下,缓存中某个热点数据过期瞬间,大量请求同时访问该数据,导致数据库压力激增。
应对策略
- 缓存穿透:
- 使用布隆过滤器,在请求到达缓存前,先通过布隆过滤器判断数据是否存在,不存在则直接返回,避免请求穿透到数据库。
- 对查询结果为空的数据也进行缓存,设置较短的过期时间。
- 缓存雪崩:
- 为缓存数据设置随机过期时间,避免大量数据同时过期。
- 启用二级缓存,当一级缓存失效时,二级缓存可以继续提供服务,减轻数据库压力。
- 缓存击穿:
- 对热点数据设置永不过期,或者在更新数据时采用双缓存策略,即新旧缓存交替使用,避免在更新瞬间出现缓存失效问题。
- 使用互斥锁,在缓存过期时,只有一个请求能获取锁去查询数据库并更新缓存,其他请求等待,从而避免大量请求同时访问数据库。