@@ -10817,22 +10817,12 @@ sentinel 在通知阶段不断的去获取 master/slave 的信息,然后在各
1081710817
1081810818# # 缓存方案
1081910819
10820- # ## 缓存本质
10821-
10822- 弥补 CPU 的高算力和 IO 的慢读写之间巨大的鸿沟
10823-
10824-
10825-
10826-
10827-
10828- ***
10829-
10830-
10831-
1083210820# ## 缓存模式
1083310821
1083410822# ### 旁路缓存
1083510823
10824+ 缓存本质:弥补 CPU 的高算力和 IO 的慢读写之间巨大的鸿沟
10825+
1083610826旁路缓存模式 Cache Aside Pattern 是平时使用比较多的一个缓存读写模式,比较适合读请求比较多的场景
1083710827
1083810828Cache Aside Pattern 中服务端需要同时维系 DB 和 cache,并且是以 DB 的结果为准
@@ -10855,10 +10845,10 @@ Cache Aside Pattern 中服务端需要同时维系 DB 和 cache,并且是以 D
1085510845缓存不一致的方法:
1085610846
1085710847* 数据库和缓存数据** 强一致** 场景 :
10858- * 更新DB时同样更新 cache,加一个锁来保证更新 cache 时不存在线程安全问题,这样可以增加命中率
10848+ * 更新 DB 时同样更新 cache,加一个锁来保证更新 cache 时不存在线程安全问题,这样可以增加命中率
1085910849 * 延迟双删:先淘汰缓存再写数据库,休眠1秒再次淘汰缓存,可以将1秒内造成的缓存脏数据再次删除
1086010850 * CDC 同步:通过 canal 订阅 MySQL binlog 的变更上报给 Kafka,系统监听 Kafka 消息触发缓存失效
10861- * 可以短暂地允许数据库和缓存数据** 不一致** 场景:更新DB的时候同样更新 cache,但是给缓存加一个比较短的过期时间,这样的话就可以保证即使数据不一致影响也比较小
10851+ * 可以短暂地允许数据库和缓存数据** 不一致** 场景:更新 DB 的时候同样更新 cache,但是给缓存加一个比较短的过期时间,这样就可以保证即使数据不一致影响也比较小
1086210852
1086310853
1086410854
@@ -10954,9 +10944,9 @@ Read-Through Pattern 也存在首次不命中的问题,采用缓存预热解
1095410944
1095510945# ### 缓存雪崩
1095610946
10957- 场景:数据库服务器崩溃,一连串的问题会随之而来。系统平稳运行过程中,忽然数据库连接量激增,应用服务器无法及时处理请求,大量408,500错误页面出现,客户反复刷新页面获取数据,造成:数据库崩溃 、应用服务器崩溃、重启应用服务器无效、Redis服务器崩溃、Redis集群崩溃 、重启数据库后再次被瞬间流量放倒
10947+ 场景:数据库服务器崩溃,一连串的问题会随之而来。系统平稳运行过程中,忽然数据库连接量激增,应用服务器无法及时处理请求,大量408,500错误页面出现,客户反复刷新页面获取数据,造成数据库崩溃 、应用服务器崩溃、重启应用服务器无效、Redis 服务器崩溃、Redis 集群崩溃 、重启数据库后再次被瞬间流量放倒
1095810948
10959- 问题排查:在一个较短的时间内,缓存中较多的key集中过期 ,此周期内请求访问过期的数据,redis未命中,redis向数据库获取数据 ,数据库同时接收到大量的请求无法及时处理;Redis大量请求被积压 ,开始出现超时现象;数据库流量激增,数据库崩溃,重启后仍然面对缓存中无数据可用;Redis服务器资源被严重占用,Redis服务器崩溃;Redis集群呈现崩塌 ,集群瓦解;应用服务器无法及时得到数据响应请求,来自客户端的请求数量越来越多,应用服务器崩溃;应用服务器,redis,数据库全部重启,效果不理想
10949+ 问题排查:在一个较短的时间内,缓存中较多的 key 集中过期 ,此周期内请求访问过期的数据,Redis 未命中,Redis 向数据库获取数据 ,数据库同时接收到大量的请求无法及时处理;Redis 大量请求被积压 ,开始出现超时现象;数据库流量激增,数据库崩溃,重启后仍然面对缓存中无数据可用;Redis 服务器资源被严重占用,Redis 服务器崩溃;Redis 集群呈现崩塌 ,集群瓦解;应用服务器无法及时得到数据响应请求,来自客户端的请求数量越来越多,应用服务器崩溃;应用服务器,redis,数据库全部重启,效果不理想
1096010950
1096110951解决方案:
1096210952
@@ -10966,7 +10956,7 @@ Read-Through Pattern 也存在首次不命中的问题,采用缓存预热解
1096610956
1096710957 2. 构建** 多级缓存** 架构:Nginx 缓存 + redis 缓存 + ehcache 缓存
1096810958
10969- 3. 检测 Mysql 严重耗时业务进行优化:对数据库的瓶颈排查: 例如超时查询、耗时较高事务等
10959+ 3. 检测 Mysql 严重耗时业务进行优化:对数据库的瓶颈排查, 例如超时查询、耗时较高事务等
1097010960
1097110961 4. 灾难预警机制:监控redis服务器性能指标,CPU占用、CPU使用率、内存容量、平均响应时间、线程数
1097210962
@@ -10976,7 +10966,7 @@ Read-Through Pattern 也存在首次不命中的问题,采用缓存预热解
1097610966
1097710967 1. LRU 与 LFU切换
1097810968
10979- 2. 数据有效期策略调整:根据业务数据有效期进行分类错峰,A类90分钟,B类80分钟,C类70分钟,过期时间使用固定时间 + 随机值的形式,稀释集中到期的key的数量
10969+ 2. 数据有效期策略调整:根据业务数据有效期进行分类错峰,A类90分钟,B类80分钟,C类70分钟,过期时间使用固定时间 + 随机值的形式,稀释集中到期的 key 的数量
1098010970
1098110971 3. 超热数据使用永久key
1098210972
@@ -10995,17 +10985,17 @@ Read-Through Pattern 也存在首次不命中的问题,采用缓存预热解
1099510985
1099610986# ### 缓存击穿
1099710987
10998- 场景:系统平稳运行过程中,数据库连接量瞬间激增,Redis服务器无大量key过期,Redis内存平稳 ,无波动,Redis 服务器 CPU 正常,但是数据库崩溃
10988+ 场景:系统平稳运行过程中,数据库连接量瞬间激增,Redis 服务器无大量 key 过期,Redis 内存平稳 ,无波动,Redis 服务器 CPU 正常,但是数据库崩溃
1099910989
1100010990问题排查:
1100110991
11002- 1. Redis中某个key过期,该key访问量巨大
10992+ 1. Redis 中某个 key 过期,该 key 访问量巨大
1100310993
11004109942. 多个数据请求从服务器直接压到 Redis 后,均未命中
1100510995
11006- 3. Redis在短时间内发起了大量对数据库中同一数据的访问
10996+ 3. Redis 在短时间内发起了大量对数据库中同一数据的访问
1100710997
11008- 简而言之两点:单个key高热数据,key过期
10998+ 简而言之两点:单个 key 高热数据,key 过期
1100910999
1101011000解决方案:
1101111001
@@ -11048,9 +11038,9 @@ Read-Through Pattern 也存在首次不命中的问题,采用缓存预热解
1104811038
11049110391. 缓存null:对查询结果为null的数据进行缓存 (长期使用,定期清理) ,设定短时限,例如30-60秒,最高5分钟
1105011040
11051- 2. 白名单策略:提前预热各种分类数据id对应的 ** bitmaps** ,id作为bitmaps的offset ,相当于设置了数据白名单。当加载正常数据时放行,加载异常数据时直接拦截(效率偏低),使用布隆过滤器 (有关布隆过滤器的命中问题对当前状况可以忽略)
11041+ 2. 白名单策略:提前预热各种分类数据 id 对应的 ** bitmaps** ,id 作为 bitmaps 的 offset ,相当于设置了数据白名单。当加载正常数据时放行,加载异常数据时直接拦截(效率偏低),也可以使用布隆过滤器 (有关布隆过滤器的命中问题对当前状况可以忽略)
1105211042
11053- 3. 实施监控:实时监控redis命中率 (业务正常范围时,通常会有一个波动值)与null数据的占比
11043+ 3. 实施监控:实时监控 redis 命中率 (业务正常范围时,通常会有一个波动值)与null数据的占比
1105411044
1105511045 * 非活动时段波动:通常检测3-5倍,超过5倍纳入重点排查对象
1105611046 * 活动时段波动:通常检测10-50倍,超过50倍纳入重点排查对象
0 commit comments