28.【学习心得】学习心得-写缓存

简介: 【学习心得】学习心得-写缓存

文档参考:书名:《从程序员到架构师:大数据量、缓存、高并发、微服务、多团队协同等核心场景实战》-王伟杰

image.png

前文如下:


23.【学习心得】学习心得-冷热分离概述

24.【学习心得】学习心得-如何分离冷热数据

25.【学习心得】学习心得-基于MySQL的分表分库

26.【学习心得】学习心得-读缓存

27.【学习心得】学习心得-如何更新redis缓存


1.写缓存


接着上回学习心得,详细讨论了缓存的架构方案,它可以减少数据库读操作的压力,却也存在着不足,比如写操作并发量大时,这个方案不会奏效。那该怎么办呢?接下来就来讨论怎么处理写操作并发量大的场景。


1.1 业务场景:


如何以最小代价解决短期高频写请求=?


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

为避免活动上线后出现问题,比如数据库被压垮、后台服务器支撑不住(这个倒是小问题,加几台服务器即可)等,项目组必须提前做好预案。这场活动中,领导要求在架构上不要做太大调整,毕竟是一个临时的活动。简单地说就是工期不能太长,修改影响范围不要太大。项目组分析了一下可能的情况,其他都没问题,唯一没把握的就是数据库。


通过如下逻辑做了一次简单的测算。


假设目标是15分钟完成100万的预约数据插入,并且不是在15分钟内平均插入的。按照以往的经验,有可能在1分钟内就完成90%的预约,也有可能在5分钟内完成80%的预约,这些难以预计。但是峰值流量预估值只能取高,不能取低。所以设计的目标是:用户1分钟内就完成90%的预约量,即90万预约。那么推算出目标的TPS(吞吐量)就是9万/60=1.5万。


原来预约就是个简单的功能,并没有做高并发设计。对它做了一次压力测试,结果最大的TPS是2200左右,与需求值差距较大。想过分表分库这个方案,不过代码改动的代价太大了,性价比不高。毕竟这次仅仅是临时性市场活动,而且活动运营目标是几十万的预约量,这点数据量采取分表分库的话,未免有些得不偿失。最终采用的方案是不让预约的请求直接插入数据库,而是先存放到性能很高的缓冲地带,以此保证洪峰期间先冲击缓冲地带,之后再从缓冲地带异步、匀速地迁移数据到数据库中。 其实这个解决方案就是写缓存,这也是接下来要重点讲解的内容。


1.2 写缓存


什么是写缓存?写缓存的思路是后台服务接收到用户请求时,如果请求校验没问题,数据并不会直接落库,而是先存储在缓存层中,缓存层中写请求达到一定数量时再进行批量落库。这里所说的缓存层实际上指的就是写缓存。它的意义在于利用写缓存比数据库高几个量级的吞吐能力来承受洪峰流量,再匀速迁移数据到数据库。写缓存架构示意图如图所示。


网络异常,图片无法展示
|


写缓存架构示意图设想的运行场景如下。假设高峰期1秒内有1.5万个预约数据的插入请求。这1.5万个请求如果直接到数据库,那么数据库肯定崩溃。所以把这1.5万个请求落到并发写性能很高的缓存层,然后以2000(以实际压测瓶颈值为准)为单位从缓存层批量落到数据库。数据库如果用批量插入语句,TPS也是可以非常高的,可能达到上万,这样不仅能防止数据库崩溃,还能确保用户的请求得到满足。从以上设计方案中不难看出,写缓存可以用来大幅降低数据库写操作的频率,从而减少数据库的压力。



相关文章
|
6天前
|
SQL 缓存 关系型数据库
MySQL技能完整学习列表6、查询优化——3、查询缓存——4、SQL优化技巧
MySQL技能完整学习列表6、查询优化——3、查询缓存——4、SQL优化技巧
67 0
|
6天前
|
缓存 NoSQL Java
SpringCache通用缓存学习
SpringCache通用缓存学习
|
6月前
|
缓存 NoSQL 关系型数据库
【Redis 系列】redis 学习十二,redis 缓存穿透,缓存击穿,缓存雪崩
【Redis 系列】redis 学习十二,redis 缓存穿透,缓存击穿,缓存雪崩
|
8月前
|
消息中间件 缓存 NoSQL
程序员快来学习缓存层场景实战数据收集—技术选型思路及整体方案
根据以上业务场景,项目组提炼出了6点业务需求,并针对业务需求梳理了技术选型相关思路。 1)原始数据海量:对于这一点,初步考虑使用HBase进行持久化。 2)对于埋点记录的请求响应要快:埋点记录服务会把原始埋点记录存放在一个缓存层,以此保证响应快速。关于这一点有多个缓存方案,稍后展开讨论。 3)可通过后台查询原始数据:如果直接使用HBase作为查询引擎,查询速度太慢,所以还需要使用Elasticsearch来保存查询页面上作为查询条件的字段和活动ID。
|
11月前
|
缓存 NoSQL Java
redis 6.0新特性-客户端缓存学习总结
redis 6.0新特性-客户端缓存学习总结
244 0
|
缓存
学习Vue3 第二十章(keep-alive缓存组件)
有时候我们不希望组件被重新渲染影响使用体验;或者处于性能考虑,避免多次重复渲染降低性能。而是希望组件可以缓存下来,维持当前的状态。这时候就需要用到keep-alive组件。
89 0
|
缓存
jira学习案例89-react-query处理服务器缓存
jira学习案例89-react-query处理服务器缓存
69 0
jira学习案例89-react-query处理服务器缓存
|
缓存
jira学习案例90-用useQuery缓存列表
jira学习案例90-用useQuery缓存列表
82 0
jira学习案例90-用useQuery缓存列表
|
缓存 运维 监控
Redis学习(十):缓存穿透、缓存击穿和缓存雪崩
key对应的数据在数据源中并不存在,每次针对此key的请求从缓存获取不到,这些请求都会压入数据源中,从而可能压垮数据源。
112 0
Redis学习(十):缓存穿透、缓存击穿和缓存雪崩
|
SQL 存储 XML
Mybatis 高阶学习(映射文件深入、延迟加载、缓存、注解开发等)
Mybatis 高阶学习(映射文件深入、延迟加载、缓存、注解开发等)
274 0
Mybatis 高阶学习(映射文件深入、延迟加载、缓存、注解开发等)