【系统架构设计师-案例题-分布式系统设计】24年下半:Redis(1)数据库缓存设计 文章目录题目背景题目 1Cache-Aside 读数据流程设计题目描述答案与解析题目 2Cache-Aside 写数据流程设计题目描述答案与解析重点: 理解先更新库再删除缓存的原理题目 3多线程下的数据一致性问题题目描述答案与解析题目背景为了提升某购物网站的用户使用体验采用数据库缓存技术将经常访问的商品信息存储在一个临时高速数据存储层中这个临时存储层使得未来对这些数据的请求响应比通过访问主数据库更快。为了确保快速、及时获取最新数据项目组决定采用缓存数据技术开展项目设计经讨论决定采用Cache-Aside策略作为缓存手段。题目 1Cache-Aside 读数据流程设计题目描述使用 Cache-Aside 缓存策略当用户查询商品信息时此请求会从应用程序服务器发送请求到数据库服务器通过缓存系统处理然后返回所请求的信息请补充完善图1中 (1) ~ (5) 处的内容协助设计师完成缓存系统中的数据读取模块的设计方案。答案与解析答案(1)查询数据并判断是否命中(2)缓存命中返回数据(3)缓存未命中向数据库读数据(4)更新缓存(5)返回数据核心概念解释Cache-Aside (旁路缓存) 读策略通俗类比图书馆借书缓存 你的书桌拿取方便但空间有限数据库 图书馆书架书全但拿取慢读流程先看书桌上有没有(1) 查询缓存。如果有直接看(2) 命中返回。如果书桌上没有就得去书架上找(3) 读数据库。找到后顺手把书带回书桌放好方便下次看(4) 更新缓存。最后开始阅读(5) 返回数据。详细分析Cache-Aside 模式是最常用的缓存策略。其核心逻辑是“懒加载”只有当数据被需要且缓存中没有时才从数据库加载到缓存。应用层先请求缓存。缓存命中直接返回数据结束流程。缓存未命中应用层去查询数据库。回填应用层获取到数据后并发起一个写操作将数据写入缓存。返回将数据返回给用户。考点Cache-Aside 模式、缓存读流程题目 2Cache-Aside 写数据流程设计题目描述使用 Cache-Aside 缓存策略当用户更新商品信息时此请求会从应用服务器发送至数据库服务器并进行缓存处理请补充完善图2中 (1) 和 (2) 处的内容协助工程师完成缓存系统中的数据更新模块的设计方案。答案与解析重点: 理解先更新库再删除缓存的原理答案(1)写入数据更新数据库(2)删除缓存失效缓存详细分析在 Cache-Aside 模式中写操作的标准流程是先更新数据库然后删除缓存。为什么是删除而不是更新缓存如果是更新缓存在并发写的情况下可能出现先后顺序错乱导致缓存中保留的是旧数据脏数据。删除缓存是一种懒操作下次读取时自然会去数据库拉取最新的保证了最终一致性。为什么先更新数据库再删除缓存如果先删除缓存再更新数据库。在两者之间另一个线程读取数据发现缓存空了去读数据库旧值然后写入缓存。紧接着数据库更新完成。这样缓存里就一直是旧数据了。虽然先更库再删存也存在极端并发问题读操作在读旧值和写缓存之间刚好插入了一个写操作但概率极低因为写缓存通常比查库快得多。考点Cache-Aside 模式、缓存与数据库一致性题目 3多线程下的数据一致性问题题目描述李工设计了多线程并发数据访问方案采用线程1执行数据更新线程2执行数据读取。王工认为这样的设计方案会存在数据不一致现象请说明李工所设计的方案为什么会出现数据库与缓存中的数据不一致的情况并给出3种或以上的解决方案。答案与解析答案原因分析根本原因在于 Cache-Aside 策略的非原子性。更新操作写库删存和读取操作读存读库写存在多线程环境下无法保证严格的时序一致性导致出现短暂的数据状态不一致窗口。解决方案任选3种锁机制引入读写锁保证更新期间无法读取。异步队列方式同步利用消息中间件如 Kafka进行重试或顺序处理。通过数据库插件完成数据同步如监听 MySQL Binlog 自动更新缓存。延迟双删策略先删缓存 - 更新数据库 - 休眠片刻 - 再删缓存。详细分析针对线程 1 写数据、线程 2 读缓存时可能出现的数据不一致问题以下是几种主流解决方案的详细解析异步队列方式同步消息中间件原理利用 Kafka/RabbitMQ 等消息队列。当线程 1 更新完数据库后发一个消息到队列。有一个消费者线程专门盯着队列收到消息后去更新或删除缓存。优点解耦保证最终一致性这里做了trade off且带有重试机制如果删缓存失败可以重试。通过数据库插件完成数据同步Binlog 监听原理使用如 Canal 等工具伪装成数据库的从库监听主库的 Binlog操作日志。一旦发现数据库有变动工具自动解析日志并去更新缓存。优点代码侵入性小完全由后台服务自动完成同步应用层不需要关心缓存更新逻辑。锁机制读写锁原理在代码层加锁。更新数据时加写锁此时任何人都不能读读数据时加读锁。优点强一致性绝对不会读到脏数据。缺点并发性能大大降低锁竞争可能导致系统变慢。延迟双删策略原理为了防止先删缓存再更库期间被别人读了旧值又写回缓存。我们可以在更完库之后等一会延迟再删一次缓存。确保把刚才那个空档期可能产生的脏数据删掉。考点并发控制、分布式系统一致性、缓存更新策略