面试题答案
一键面试缓存数据的选择
- 热点数据:优先缓存经常被访问的数据,例如电商平台中热门商品的详情信息、新闻网站的头条新闻等。通过统计分析系统日志或使用流量监控工具,找出访问频率高的数据进行缓存。
- 低频变动数据:对于更新频率较低的数据,如地区列表、商品分类等,缓存这类数据能有效减少数据库查询压力,同时无需频繁更新缓存。
- 计算结果:对于需要复杂计算才能得出的结果,如复杂报表数据、推荐算法结果等,将计算结果进行缓存,下次请求相同数据时可直接从缓存获取,提高响应速度。
缓存过期时间设置
- 根据数据更新频率:更新频繁的数据设置较短的过期时间,如实时股价信息,可能几分钟就需要更新一次;而相对稳定的数据,如国家列表,可设置较长的过期时间,如几天甚至几周。
- 分层过期:对于一些相关联的数据,可以采用分层过期策略。例如,商品的基本信息设置较长过期时间,而商品的库存信息设置较短过期时间。这样既保证了大部分数据的缓存可用性,又能及时更新关键变动数据。
- 随机过期:为避免大量缓存同时过期导致数据库压力瞬间增大,对部分缓存设置随机的过期时间,在一个基础时间范围内进行随机波动,如基础过期时间为1小时,随机波动范围为±10分钟。
缓存更新机制
- 读写更新:在数据发生写操作(插入、更新、删除)时,同时更新缓存。这种方式能保证缓存与数据库数据的一致性,但在高并发场景下,可能会出现缓存和数据库更新顺序不一致的问题。例如,先更新数据库,再更新缓存时,如果在这两个操作之间有读请求,可能会读到旧的缓存数据。
- 失效更新:在数据发生写操作时,不更新缓存,而是直接删除缓存。下次读请求时,发现缓存不存在,再从数据库读取并重新写入缓存。这种方式简单,但可能会在缓存失效期间多次读取数据库,增加数据库压力。
- 异步更新:通过消息队列等异步机制,在数据发生写操作后,将更新缓存的任务发送到消息队列中,由专门的消费者异步处理缓存更新。这种方式能降低对业务流程的影响,提高系统的并发处理能力,但需要处理消息队列的可靠性和数据一致性问题。
处理缓存与数据库数据一致性问题
- 读写锁:在进行数据读写操作时,使用读写锁来保证同一时间只有一个写操作或多个读操作可以进行。写操作时获取写锁,读操作时获取读锁,写锁优先级高于读锁,以确保写操作完成后缓存和数据库数据一致,且读操作不会读到不一致的数据。
- 版本控制:在数据库表中增加版本号字段,每次数据更新时,版本号递增。缓存数据中也保存版本号,读操作时先比较缓存和数据库的版本号,如果不一致则从数据库重新读取并更新缓存。
- 重试机制:对于缓存更新失败的情况,采用重试机制,确保缓存最终能与数据库数据一致。可以设置重试次数和重试间隔时间,若多次重试仍失败,则记录日志并进行人工干预。
- 缓存双写:在更新数据库后,先更新主缓存,再通过异步任务更新从缓存,确保多个缓存副本的数据一致性。同时,监控缓存更新状态,及时发现并处理更新失败的情况。