高阶面试-写缓存

场景

超低价预约大型线上活动,在某天9:00~9:15期间,用户可以前往详情页半价预约抢购一款热门商品。根据市场部门的策划方案,这次活动的运营目标是几十万左右的预约量。

设计目标

设计的目标是:用户1分钟内就完成90%的预约量,即90万预约。那么推算出目标的TPS(吞吐量)就是9万/60=1.5万

原来预约就是个简单的功能,并没有做高并发设计。对它做了一次压力测试,结果最大的TPS是2200左右,与需求值差距较大。

思路

写缓存的思路是后台服务接收到用户请求时,如果请求校验没问题,数据并不会直接落库,而是先存储在缓存层中,缓存层中写请求达到一定数量时再进行批量落库。利用写缓存比数据库高几个量级的吞吐能力来承受洪峰流量,再匀速迁移数据到数据库

写请求和批量落库是同步还是异步

优缺点比较

同步

  • 优点:用户预约成功后,可在“我的预约”页面立即看到预约数据
  • 缺点:用户提交预约后,还需要等待一段时间才能返回结果,且这个时间不定

异步:

  • 优点:用户能快速知道提交结果
  • 缺点:用户提交完成后,如果查看“我的预约”页面,可能会出现没有数据的情况
复杂度:

同步:写请求提交数据时,写请求的线程被堵塞或者等待,待批量落库完成后再发送信号给写请求的线程,这个线程获得落库完成的信号后,返回预约成功提示给用户

会引申出一系列问题

  • 用户要等多久,需要设置时间窗,比如100ms批量落库一次
  • 批量落库超时怎么处理 设置写请求阻塞的超时时间
  • 批量落库失败 是否重试,重试几次

异步不需要考虑 超时处理、重试,更合适

用户体验优化:预约成功,进入预约详情页,页面定时调接口查批量落库状态,成功弹出成功标志,跳转下一页

如何触发批量落库

两种:

写请求满足特定次数就落库一次,如10个请求

缺点:如果访问数据库的次数未凑齐N次,用户的预约就一直无法落库。

每隔一个时间窗口落库一次,比如每隔一秒落库一次

缺点:如果某个瞬间流量太大,在那个时间窗口落库的数据就会很多

同时采用两种

1)每收集一次写请求,就插入预约数据到缓存中,再判断缓存中预约的总数是否达到一定数量,达到后直接触发批量落库。
2)开一个定时器,每隔一秒触发一次批量落库

![[Pasted image 20240620075523.png]]

缓冲数据存储在哪里

redis

为啥不用MQ:
想要使用批量落库的功能,知道如何一次性从Redis中取多个数据项(mget),但是还没有试过批量消费MQ的消息

缓存层的并发操作注意点

如果多个Insert语句同时执行,它们会根据排队情况按顺序执行,也可以与Select语句并发执行,但是由于减少了IO,会更快

批量落库失败的处理

三个步骤:

  • 当前线程从缓存中获取所有数据
  • 当前线程批量保存数据到数据库
  • 当前线程从缓存中删除对应数据
    ![[Pasted image 20240620081454.png]]

相关推荐

  1. 面试-缓存

    2024-07-09 18:44:08       23 阅读
  2. 面试-mongodb

    2024-07-09 18:44:08       15 阅读
  3. 面试-hw算法整理

    2024-07-09 18:44:08       19 阅读
  4. kafka面试题(基础-进-

    2024-07-09 18:44:08       20 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 18:44:08       50 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 18:44:08       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 18:44:08       43 阅读
  4. Python语言-面向对象

    2024-07-09 18:44:08       54 阅读

热门阅读

  1. 深度分析 Apache Hudi:大数据实时处理的利器

    2024-07-09 18:44:08       26 阅读
  2. el-row和el-col

    2024-07-09 18:44:08       23 阅读
  3. 回头看,已过去6载

    2024-07-09 18:44:08       26 阅读
  4. 移植 Qt 应用到嵌入式平台

    2024-07-09 18:44:08       33 阅读
  5. ubuntu ceph部署

    2024-07-09 18:44:08       30 阅读
  6. TPC数据库评测基准四兄弟:C/H/E/DS

    2024-07-09 18:44:08       25 阅读
  7. Mercer 条件的基本概念及证明

    2024-07-09 18:44:08       23 阅读
  8. Python考前复习

    2024-07-09 18:44:08       21 阅读
  9. PLSQL Day4

    2024-07-09 18:44:08       20 阅读
  10. PXIe-8862

    2024-07-09 18:44:08       21 阅读
  11. token无感刷新方法

    2024-07-09 18:44:08       26 阅读
  12. 8-阿里云服务器 ECS配置R及Studio Server

    2024-07-09 18:44:08       25 阅读