当前位置: 首页 > news >正文

系统架构设计师案例分析题——数据库缓存篇

一.核心知识

1.redis和MySQL的同步方案怎么做的?

  • 读数据:先查询缓存,缓存不存在则查询数据库,然后将数据新增到缓存中
  • 写数据:新增时,先新增数据库,数据库成功后再新增缓存;更新和删除时,先更新或者删除数据库中的数据,再删除缓存或者修改缓存的过期时间

2.实现Redis和MySQL之间的同步的方法

  • 利用触发器
  • 通过数据库插件
  • 异步队列方式同步,可采用消息中间件处理
  • 实现同步方案,先查缓存,查不到再从DB查询,并保存到缓存,更新缓存时先更新数据库,再讲缓存设置过期

3.Redis分布式存储常见方案

中从模式、哨兵模式、集群模式

4.Redis集群切片的常见方式

  • 客户端分片:即在客户端就通过key的hash值对应到不同的服务器
  • 中间件实现分片:再应用软件和Redis中间,由中间件实现服务到后台Redis节点的路由分派
  • 客户端服务端协作分片:Redis cluster模式,客户端采用一致哈希,服务端提供错误节点的重定向服务slot上

5.分布式缓存

在高并发的环境下,为了减轻数据库压力,提高系统响应事件,在应用和数据库之间增加独立缓存系统,常见的分布式缓存有Redis和memcache。

6.解决SQL注入有哪几种方式

  • 正则表达式
  • 参数化的过滤语句
  • 检查用户的输入合法化
  • 数据加密处理
  • 存储过程
  • 漏洞扫描工具
  • web防火墙

7.Redis缓存淘汰机制

  • 所有key中随机淘汰一个key
  • 在过期时间的key中,删除使用频率最少的key
  • 在过期时间的key中,删除即将要过期的key
  • 所以key中,删除最不经常使用的key
  • 随机删除设置了过期时间的key

8.Redis数据结构与文件持久化差别在哪

  • 磁盘更新频率:前者频率较慢,后者每条指令对数据的操作都要保存,默认时间1秒
  • 数据安全:前者不如后者安全
  • 数据一致性:RDB可能发生数据丢失和不一致,后者即使宕机也能解决一致性问题
  • 重启性能:前者恢复速度比后者快很多
  • 数据文件大小:前者保存整个数据库的快照,容量比后者大

二.案例考察扩展

1.简要说明数据迁移准备工作的内容

  • 待迁移数据源的详细说明:包括数据的存放方式、数据量和数据的时间跨度
  • 建立新旧系统数据库的数据字典,对现有系统的历史数据进行质量分析,以及新旧系统数据结构的差异分析
  • 新旧系统代码数据的差异分析
  • 建立新旧系统数据库表的映射关系,对无法映射字段的处理方法
  • 开发或者购买、部署ETL工具
  • 编写数据转换的测试计划和校验程序
  • 制定数据转换的应急措施

2.SQL语句优化的常见策略

  • 建立雾化视图或者尽可能减少多表查询。
  • 以不相干子查询替代相干子查询。
  • 只检索需要的列。
  • 用带in的条件子句等价替换or子句。
  • 经常提交commit,以尽早释放锁。
  • 避免嵌套的游标和多重循环等。

三.真题

1.2024下半年

Cache-aside架构,也称为旁路缓存模式,是一种常见的缓存使用策略。

1+2.填空流程图说明缓存读写的过程。

  1. 向缓存请求读取该商品信息
  2. 若命中则返回该商品信息
  3. 若未命中则访问数据库查询该商品信息
  4. 将查询到的数据库数据更新到缓存
  5. 将查询到的数据库目标数据返回

  • 更新数据库中的目标商品信息。
  • 将数据库中更新的商品信息写入到缓存中,确保数据一致性。

3.王工使用了多线程技术进行缓存处理,线程1负责写入,线程2负责读取,可能存在数据一致性问题,请解释其原因,并给出3个以上的解决办法。

原因:

  • 如果没有适当的同步机制,两个或多个线程可能同时访问和修改共享资源,导致最终结果取决于线程调度顺序。
  • 在多线程环境中,一个线程对共享变量所做的更改不一定立刻被其他线程看到。
  • 写入操作可能不是一个原子操作,意味着它可以被中断或分段执行。

解决方案:

  • 延时双删
  • 同步删除
  • 加互斥锁(分布式锁)
  • 消息队列
  • 基于缓存更新策略

2.2024上半年

1.使用基于数据库的分布式锁所存在的缺陷

基于数据库的分布式锁虽然实现简单,但在高并发、高可用性场景下存在一些明显的缺陷,主要包括以下几个方面:

  • 数据库读写性能较低,锁竞争导致连接池耗尽
  • 非原子性操作具有风险
  • 数据库锁通常是非公平的
  • 如果使用单机数据库,一旦数据库宕机,所有依赖它的分布式锁将失效。
  • 锁超时的时间难以设定

2.redis的几种操作命令

  • 写入:SET key value,哈希:HSET key field value
  • 查询:GET key,哈希:HGET key field
  • 删除:DEL key1 [key2],哈希:HDEL key field1 [field2]

3.基于redis的数据库锁也会存在死锁场景,举例说明:

 

基于数据库的分布式锁和基于redis的分布式锁都存在问题,还有哪些其它的分布式锁的类型?

  • 利用 ZooKeeper 的 临时有序节点(Ephemeral Sequential Nodes) 实现锁竞争。
  • 基于 etcd 的 租约(Lease) 和 事务(TXN) 实现
  • 利用 Consul 的 KV 存储+Session 机制
  • 基于 Redlock 的分布式锁(Redis 多实例)
  • 基于 Chubby(Google)的分布式锁,Google 内部的分布式锁服务,类似 ZooKeeper 但更强调高可用。

相关文章:

  • 学习笔记:黑马程序员JavaWeb开发教程(2025.4.9)
  • 第14天-Matplotlib实现数据可视化
  • 计算机视觉与深度学习 | Python实现CEEMDAN-ABC-VMD-DBO-CNN-LSTM时间序列预测(完整源码和数据)
  • 考取AZ-305 认证的心得
  • docker中使用openresty
  • 企业级数据加密权威方案:从 AES-CBC 到 AES-GCM 的升级实践
  • HJ23 删除字符串中出现次数最少的字符【牛客网】
  • 【项目】SpringBoot +MybatisPlus集成多数据源
  • Day123 | 灵神 | 二叉树 | 找树左下角的值
  • 【python】纤维宽度分布分析与可视化
  • Node.js Express 项目现代化打包部署全指南
  • LAN(局域网)和WAN(广域网)
  • osgEarth中视角由跟随模式切换到漫游模式后没有鼠标拖拽功能问题分析及解决方法
  • 【VSCode】在远程服务器Linux 系统 实现 Anaconda 安装与下载
  • jenkins使用Send build artifacts over SSH发布jar包目录配置
  • AUTOSAR 运行时环境 (RTE)
  • CMake 跨平台构建系统详解
  • C++(26): 标准库 <iterator>
  • 基于python的机器学习(八)—— 评估算法(一)
  • 策略的组合与叠加多策略联合交易
  • 谷歌推出AI全家桶订阅计划:每月付费250美元,搜索引擎加入AI模式
  • 为俄乌一日三通电话,这里成“关键战场”?
  • 权威访谈丨国家疾控局就《世界卫生组织大流行协定》答记者问
  • 春决火爆的背后,PEL如何做大这块电竞蛋糕
  • “集团结婚”:近百年前革新婚俗的尝试
  • 国家统计局:中美大幅降低关税有利于双方贸易增长,也有利于世界经济复苏