Redis保证数据⼀致、缓存穿透、缓存雪崩和数据热点

13- Redis和Mysql如何保证数据⼀致?

  1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致

  2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中

这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题, ⽐如线程1删除了 Redis缓存数据,正在更新Mysql, 此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中

  1. 使用MQ异步同步, 保证数据的最终一致性

我们项目中会根据业务情况 , 使用不同的方案来解决Redis和Mysql的一致性问题 :

  1. 对于一些一致性要求不高的场景 , 不做处理

    例如 : 用户行为数据 , 我们没有做一致性保证 , 因为就算不一致产生的影响也很小

  2. 对于时效性数据 , 设置过期时间

    例如 : 接口缓存数据 , 我们会设置缓存的过期时间为 60S , 那么可能会出现60S之内的数据不一致, 60S后缓存过期, 重新从数据库加载就一致了

  3. 对于一致性要求比较高但是时效性要求不那么高的场景 , 使用MQ不断发送消息完成数据同步直到成功为止

    例如 : 首页广告数据 , 首页推荐数据

    数据库数据发生修改----> 发送消息到MQ -----> 接收消息更新缓存

    消息不丢失/重复消费 : 消息状态表/消息消费表

  4. 对于一致性和时效性要求都比较高的场景 , 使用分布式事务 , Seata的TCC模式

    很少用

14- 什么是缓存穿透 ? 怎么解决 ?

缓存穿透是指查询一条数据库和缓存都没有的一条数据,就会一直查询数据库,对数据库的访问压力就会增大,缓存穿透的解决方案

有以下2种解决方案 :

  • 缓存空对象:代码维护较简单,但是效果不好。

  • 布隆过滤器:代码维护复杂,效果很好

15- 什么是缓存击穿 ? 怎么解决 ?

缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大

解决方案 :

  • 热点数据提前预热

  • 设置热点数据永远不过期。

  • 加锁 , 限流

16- 什么是缓存雪崩 ? 怎么解决 ?

缓存雪崩/缓存失效 指的是大量的缓存在同一时间失效,大量请求落到数据库 导致数据库瞬间压力飙升。

造成这种现象的 原因是,key的过期时间都设置成一样了。

解决方案是,key的过期时间引入随机因素

17- 数据库有1000万数据 ,Redis只能缓存20w数据, 如何保证Redis中的数据都是热点数据 ?

配置Redis的内容淘汰策略为LFU算法 , 这样会把使用频率较低的数据淘汰掉 , 留下的数据都是热点数据

相关推荐
王天平·Jason Wong7 分钟前
汉王、绘王签字版调用封装
开发语言·前端·javascript
_大峰_10 分钟前
R语言文本挖掘、情感分析和可视化哈利波特小说文本数据
开发语言·r语言·c#
tRNA做科研12 分钟前
【基于R语言群体遗传学】-6-表型计算等位基因频率、最大似然估计方法
开发语言·r语言
tRNA做科研14 分钟前
【基于R语言群体遗传学】-2-模拟基因型(simulating genotypes)
开发语言·r语言
结衣结衣.24 分钟前
完全理解C语言函数
java·linux·c语言·数据库·经验分享·笔记
驾驭人生29 分钟前
c# 操作mysql的帮助类
开发语言·mysql·c#
孤寒者38 分钟前
(三十一)Flask之wtforms库【剖析源码下篇】
后端·python·flask·源码剖析·wtforms
ItKevin爱java38 分钟前
JDBC中如何处理数据库连接超时和SQL超时?
数据库·sql
2401_8576226640 分钟前
【SQL Server高可用性全解】构建永不宕机的数据库解决方案
数据库·oracle
milong52142 分钟前
Flask自定义命令
后端·python·flask