面试题答案
一键面试缓存选型
- Redis:
- 理由:Redis 是一个高性能的键值对存储数据库,支持多种数据结构,如字符串、哈希表、列表、集合等。对于金融交易系统,它可以灵活存储不同类型的交易数据。其读写性能极高,能够满足系统对高可用性和性能的要求。此外,Redis 支持主从复制、哨兵模式和集群模式,可用于实现高可用和数据冗余,应对故障恢复。
- Memcached:
- 可作为补充:Memcached 也是高性能的分布式缓存系统,主要用于缓存简单的键值对数据。在金融交易系统中,对于一些访问频率极高但数据结构简单(如一些固定的配置参数)的数据,可以使用 Memcached 进行缓存,以减轻 Redis 的负载。
数据分区策略
- 按交易类型分区:
- 实现方式:根据不同的交易类型(股票交易、期货交易、外汇交易等)进行数据分区。例如,以交易类型作为 Redis 键的前缀,如
stock_
、futures_
、forex_
等。每个前缀下存储该交易类型相关的所有缓存数据。 - 优点:便于管理和维护不同交易类型的数据,不同交易类型的缓存数据可以独立进行更新、扩展等操作。同时,按交易类型分区可以根据各交易类型的访问频率和数据更新策略,对不同分区进行针对性的优化。
- 实现方式:根据不同的交易类型(股票交易、期货交易、外汇交易等)进行数据分区。例如,以交易类型作为 Redis 键的前缀,如
- 一致性哈希分区:
- 实现方式:使用一致性哈希算法将数据分配到不同的 Redis 节点上。在系统中引入虚拟节点概念,通过对节点和数据键进行哈希计算,将数据均匀分布到各个节点。例如,假设有 3 个 Redis 节点,为每个节点生成 100 个虚拟节点,对数据键计算哈希值,然后映射到虚拟节点,进而找到对应的真实 Redis 节点。
- 优点:当添加或移除 Redis 节点时,数据的迁移量较小,能够保证系统的稳定性和高性能。尤其适用于系统需要动态扩展或收缩缓存资源的场景。
缓存更新机制
- 读写更新策略:
- 写后更新:在进行数据更新操作时,先更新数据库,然后再更新缓存。例如,当股票交易完成后,首先在数据库中记录交易信息,然后更新 Redis 中与该股票交易相关的缓存数据,如股票价格、交易量等。
- 写前更新:对于一些对数据一致性要求极高的场景,可以采用写前更新。即先更新缓存,再更新数据库。但这种方式存在一定风险,如果数据库更新失败,可能导致缓存和数据库数据不一致,需要通过重试机制或补偿操作来解决。
- 基于时间的更新:
- 设置过期时间:对于不同类型的交易数据,根据其数据更新策略设置不同的过期时间。例如,外汇交易市场实时性强,相关汇率缓存数据的过期时间可以设置较短,如几分钟;而一些股票交易的基本信息(如公司概况等)更新频率较低,过期时间可以设置较长,如一天或一周。
- 定期刷新:除了设置过期时间让缓存自动过期外,还可以采用定期任务主动刷新缓存数据。例如,每天凌晨对一些隔夜数据进行刷新,确保缓存数据的准确性。
故障恢复
- 主从复制与哨兵模式:
- 主从复制:在 Redis 中,设置主节点和多个从节点。主节点负责处理写操作,并将数据同步到从节点。当主节点出现故障时,从节点可以继续提供读服务,保证系统的可用性。例如,在股票交易系统中,主节点处理交易数据的写入和缓存更新,从节点为前端交易界面提供实时数据读取服务。
- 哨兵模式:引入哨兵节点来监控主从节点的状态。哨兵节点定期向主从节点发送心跳包,当发现主节点故障时,哨兵节点会自动进行选举,将一个从节点提升为主节点,并通知其他从节点进行复制关系的调整。这样可以实现自动故障恢复,减少人工干预。
- 数据持久化:
- RDB 持久化:Redis 支持 RDB(Redis Database)持久化方式,它将内存中的数据以快照的形式保存到磁盘上。在故障恢复时,可以通过加载 RDB 文件快速恢复数据。例如,每隔一段时间(如 1 小时)生成一个 RDB 文件,在系统重启或故障恢复时,加载最近的 RDB 文件,减少数据丢失。
- AOF 持久化:AOF(Append - Only File)持久化方式将写操作以日志的形式追加到文件中。在故障恢复时,通过重放 AOF 日志文件来恢复数据。AOF 日志文件记录了每一个写操作,因此数据的完整性更高。可以根据业务需求设置 AOF 日志的刷盘策略,如每秒刷盘,以平衡性能和数据安全性。