网站建设的域名的选择,可信的h5制作开发,网站主机空间,廊坊网站制作系统14.6缓存异常
四个方面
缓存中数据和数据库不一致缓存雪崩缓存击穿缓存穿透
14.6.1数据不一致#xff1a;
一致性包括两种情况
缓存中有数据#xff0c;需要和数据库值相同缓存中没有数据#xff0c;数据库中的数据是最新值
如果不符合以上两种情况#xff0c;则出现…14.6缓存异常
四个方面
缓存中数据和数据库不一致缓存雪崩缓存击穿缓存穿透
14.6.1数据不一致
一致性包括两种情况
缓存中有数据需要和数据库值相同缓存中没有数据数据库中的数据是最新值
如果不符合以上两种情况则出现数据不一致的问题。
读写缓存
同步直写异步写回
只读缓存
新增数据 数据直接写到数据库中缓存不做操作。满足一致性两种情况的第2种。 删改数据 先删除缓存后更新数据库。可能会导致缓存删除成功数据库更新失败。业务逻辑去访问数据时缓存中查不到数据缓存缺失到数据库中查询所以只拿到旧的数据。如果新更新数据库再删除缓存。可能会导致数据库更新成功缓存删除失败。数据库中的数据是新的值缓存中存储的是旧值。再读取时先从缓存中读取读取到了旧值。
解决数据不一致的方案
重试机制把删除的缓存值或要更新数据库值先存储到消息队列中(kafka消息队列)。如果发现试了10次还不成功就会向服务器端报错
多线程访问的情况
先删除缓存再更新数据库。 假设T1线程先删除缓存再执行更新数据库。还未更新成功时T2线程进行读取发现缓存中没有数据到数据库中读取会读取到旧的数据。如果T2还将旧数据更新到缓存中那T1线程再进行读取也读到的旧值。让T1线程先执行休眠一段时间。T1线程在休眠时间让T2线程执行结束会将数据重新写入缓存。T1线程再做一次缓存删除操作。“延迟双删”。redis.delCache()
db.update()
Thread.sleep(2000)
redis.delCache()先更新数据库值再去删除缓存 假设T1线程先删除或更新数据库中的值还没来得及删除缓存时T2线程就开始读取数据。T2会先从缓存中读取缓存命中T2拿到的就是旧的数据。直到T1将缓存中数据删除其他线程再次读取可以拿到新值.
并发操作执行顺序可能出现问题问题描述解决方案没有先删除缓存后更新数据库缓存删除成功数据库更新失败从数据库读到旧数据重试通过消息队列有先删除缓存后更新数据库缓存删除未更新数据库其他线程并发访问并发线程从数据库读到旧值并更新了缓存其他线程都从缓存中读到旧值延迟双删没有先更新数据库后删除缓存数据库更新成功缓存删除失败从缓存中读到旧值重试通过消息队列有先更新数据库后删除缓存数据库更新成功未删除缓存其他同线程并发访问并发线程从缓存读到旧值会有数据不一致情况短暂存在
14.6.2 缓存雪崩
大量的应用请求无法在redis中完成处理。缓存中读取不到数据直接进入到数据库服务器。数据库压力激增数据库崩溃请求堆积在redis导致redis服务器崩溃导致redis集群崩溃应用服务器崩溃称为雪崩
原因1缓存中有大量数据同时过期
解决方案
页面静态化处理数据对于不经常更换的数据生成静态页避免大量数据同时过期:为商品过期时间追加一个随机数在一个较小的范围内(1~3分钟)。构建多级缓存架构redis缓存nginx缓存ehcache缓存延长或取消热度超高的数据过期时间服务降级
不同的数据采取不同的处理方式。
原因2redis实例故障
解决方案
服务熔断或限流处理
提前预防:
灾难预警监控redis服务器性能指标包括数据库服务器性能指标CPU、内存、平均响应时间、线程数等集群有节点出一故障主从切换。
14.6.2 缓存击穿
对某个访问频繁热点数据的请求。主要发生在热点数据失效 解决方案
预先设定电商双11,商铺设定几款是主打商品延长过期时间实时监控监控访问量避免访问量激增定时任务启动任务调度器后台刷新数据有效期分布式锁可防止缓存击穿但会有性能问题 (不推荐)
14.6.3 缓存穿透
要访问的数据在redis中不存在在数据库中也不存在。 原因
业务层误操作恶意攻击
解决方案
缓存空值或缺省值使用布隆过滤器快速判断数据是否存在在请求入口前端进行请求检测实时监控key加密