面试题答案
一键面试读写操作处理逻辑
- 写操作
- 先更新数据库,再删除缓存:先执行MySQL的更新操作,确保数据库数据准确。成功后删除对应的Redis缓存数据。若删除缓存失败,可重试或记录日志后续处理。这样当下次读操作时,因缓存无数据会从数据库读取并更新缓存,保证一致性。
- 使用事务(针对数据库操作):在对MySQL进行写操作时,将多个相关操作放在一个事务中,确保要么全部成功,要么全部失败,防止部分更新导致数据不一致。
- 读操作
- 先从缓存读,缓存不存在则从数据库读并更新缓存:读数据时先尝试从Redis缓存获取。若缓存命中,直接返回数据。若缓存未命中,从MySQL数据库读取数据,返回给客户端同时更新Redis缓存,下次读操作就能从缓存获取。
技术手段
- 消息队列(MQ):在写操作更新数据库成功后,发送一条消息到MQ。由MQ的消费者负责删除缓存。这样可避免写操作因删除缓存失败导致的不一致,且通过MQ的重试机制保证缓存删除成功。
- 缓存失效策略:为Redis缓存设置合理的过期时间。若出现缓存与数据库不一致情况,过期后缓存数据被淘汰,读操作会重新从数据库获取并更新缓存。
- 双写一致性解决方案框架:如阿里的Canal,基于MySQL的binlog日志,模拟MySQL slave的交互协议,把binlog日志解析为数据库的变更事件,然后同步到Redis等缓存,确保数据一致性。