面试题答案
一键面试缓存分片策略
- 哈希分片
- 原理:通过对缓存键值进行哈希运算,将数据均匀分布到不同的缓存节点上。例如,使用常见的MD5、SHA - 1等哈希函数,对键值计算哈希值,然后对缓存节点数量取模,决定数据存储在哪一个节点。
- 优点:简单易实现,能较均匀地分布数据,有效避免数据倾斜。在大规模缓存系统中,能让各个节点负载相对均衡。
- 缺点:当缓存节点数量发生变化(如增加或减少节点)时,会导致大量数据的重新分布,即产生哈希雪崩,影响缓存命中率。
- 一致性哈希分片
- 原理:将哈希空间组织成一个首尾相接的环(0 - 2^32 - 1)。每个缓存节点在环上有一个对应的位置(通过对节点标识进行哈希计算得到)。对于要缓存的数据,同样对其键值进行哈希计算,确定在环上的位置,然后顺时针查找,找到的第一个缓存节点就是该数据的存储位置。
- 优点:当缓存节点增加或减少时,受影响的数据范围相对较小,能较好地应对节点动态变化,减少数据迁移量,从而提高缓存命中率。
- 缺点:实现相对复杂,可能存在数据分布不均匀的情况(例如节点分布不均匀时)。
缓存更新机制
- 写后更新(Write - Behind)
- 原理:应用程序在写入数据时,先将数据写入缓存,然后异步地将数据更新到持久化存储(如数据库)。这样可以减少写入操作的响应时间,因为应用程序无需等待数据库更新完成。
- 优点:适合高并发写场景,能显著提高系统的写入性能。
- 缺点:存在数据一致性问题,在缓存数据更新后但还未同步到数据库期间,如果发生系统故障,可能导致数据丢失。
- 示例:在电商系统的商品库存更新场景中,当用户下单后,先快速更新缓存中的库存数量,然后通过异步任务慢慢更新数据库中的库存。这样在高并发下单时,系统响应速度更快,同时只要异步任务稳定,能保证最终数据一致性。
- 写前更新(Write - Through)
- 原理:应用程序在写入数据时,先更新持久化存储(如数据库),然后再更新缓存。这样可以保证数据的强一致性。
- 优点:数据一致性强,能确保缓存和数据库中的数据始终保持一致。
- 缺点:写入性能相对较低,因为每次写入都需要等待数据库操作完成,在高并发写场景下可能成为性能瓶颈。
- 示例:在金融交易系统中,涉及金额等关键数据的更新,必须保证数据的强一致性,所以采用写前更新机制,先更新数据库记录,再更新缓存,以防止出现数据不一致导致的资金问题。
- 失效策略(Write - Invalidate)
- 原理:应用程序在写入数据时,只更新持久化存储(如数据库),然后使相关的缓存数据失效。下次读取该数据时,缓存中不存在数据,就会从数据库中读取并重新缓存。
- 优点:实现相对简单,能在一定程度上保证数据一致性,同时写操作性能相对写前更新有所提高。
- 缺点:可能导致缓存命中率下降,因为每次写操作后缓存数据都失效,下次读取需要重新从数据库加载。
- 示例:在新闻发布系统中,当编辑发布新文章时,更新数据库中的文章内容,并使缓存中的文章相关数据(如文章详情页缓存)失效。这样在新文章发布后,用户访问时会从数据库获取最新内容并重新缓存。
预取策略
- 基于访问模式预取
- 原理:通过分析系统的历史访问数据,找出数据的访问模式。例如,某些用户在查看订单详情后,经常会接着查看订单的物流信息。那么在缓存订单详情数据时,可以预先将相关的物流信息也缓存下来。
- 优点:能有效提高缓存命中率,减少后续请求对数据库的访问,提高系统响应速度。
- 缺点:依赖准确的历史数据和分析,对于访问模式变化较大的系统,预取的准确性可能降低。
- 示例:在视频网站中,用户观看完某一集视频后,常常会接着观看下一集。系统可以根据这个模式,在用户观看当前集时,预先将下一集的视频数据缓存到临近的缓存节点,当用户请求下一集时,直接从缓存获取,大大提高缓存命中率和播放流畅度。
- 基于时间预取
- 原理:根据业务场景和数据变化规律,在数据即将过期或可能被大量访问前,提前从数据库中获取并更新缓存。例如,一些电商商品的价格可能每天固定时间更新,在这个时间点前,提前预取新价格数据并更新缓存。
- 优点:能保证缓存数据的及时性和有效性,提高缓存命中率,减少因缓存过期导致的数据库压力。
- 缺点:需要准确把握数据变化的时间规律,设置不当可能导致预取过早或过晚,影响效果。
- 示例:在酒店预订系统中,酒店房间价格可能每天凌晨更新。系统可以在凌晨前几分钟,预取最新的房间价格数据并更新缓存,这样在新的一天开始大量用户查询房价时,能直接从缓存获取最新价格,提高缓存命中率。
高并发读写场景下的综合应用
以一个社交平台的用户信息读写场景为例:
- 缓存分片策略:采用一致性哈希分片,将用户ID作为键值进行哈希计算,分布到不同的缓存节点上。这样当新的缓存节点加入或已有节点故障时,只有部分用户的缓存数据需要迁移,能维持较高的缓存命中率。
- 缓存更新机制:对于用户发布新动态这种写操作,采用写后更新机制。先快速将新动态写入缓存,让其他用户能立即看到,同时通过异步任务将动态持久化到数据库。对于用户修改重要信息(如手机号)这种需要强一致性的操作,采用写前更新机制,先更新数据库,再更新缓存。
- 预取策略:通过分析用户行为发现,用户在查看自己的好友列表后,经常会查看好友的详细资料。因此,在缓存用户好友列表时,同时预取好友的基本资料(如昵称、头像等)并缓存。这样在高并发的用户信息读写场景下,通过综合运用这些方法,可以显著提高缓存命中率,提升系统性能。