首页 > 数据库 >如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题

如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题

时间:2023-12-02 18:46:41浏览次数:35  
标签:降级 缓存 服务 Redis 数据库 redis 雪崩

缓存雪崩
数据末加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。
比如一个雪崩的简单过程
1、redis集群大面积故障
2、缓存失效,但依然大量请求访问缓存服务redis
3、redis大量失效后,大量请求转向到mysql数据库
4、mysql的调用量暴增,很快就扛不住了,甚至直接宕机
5、由于大量的应用服务依赖mysq和redis的服务,这个时候很快会演变成各服务器集群的雪崩,最后网站彻底崩溃

如何预防缓存雪崩

1.缓存的高可用性
缓存层设计成高可用,防止缓存大面积故障。即使个别节点、个别机器、甚至是机房宕掉,依然可以提供服务,例如 RedisSentinel和 Redis Cluster 都实现了高可用。

2.缓存降级
可以利用ehcache等本地缓存(暂时支持),但主要还是对源服务访问进行限流、资源隔离(熔断)、降级等
当访问量剧增、服务出现问题仍然需要保证服务还是可用的。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级,这里会涉及到运维的配合
降级的最终目的是保证核心服务可用,即使是有损的。
比如推荐服务中,很多都是个性化的需求,假如个性化需求不能提供服务了,可以降级补充热点数据,不至于造成前端页面是个大空白。
在进行降级之前要对系统进行梳理,比如:哪些业务是核心(必须保证),哪些业务可以容许暂时不提供服务(利用静态页面替换等,以及配合服务器核心指标,来后设置整体预案,比如:
(1)一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级
(2)警告:有些服务在一段时间内成功率有波动(如在95100%之间),可以自动降级或人工降级,并发送告警:
(3)错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然增到系统能承受的最大阀值,此时可以根据情况自动降级或者人工降级:
(4)严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级。

3.Redis备份和快速预热
1)Redis数据备份和恢复
2)快速缓存预热
4.提前演练
最后,建议还是在项目上线前,演练缓存层宕掉后,应用以及后端的负载情况以及可能出现的问题,对高可用提前预演,提前发现问题。  

缓存穿透
缓存穿透是指查询一个一不存在的数据。例如: 从缓存redis没有命中,需要从mysq数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透
解决思路
如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库。设置个过期时间或者当有值的时候将缓存中的值替换掉即可。
可以给key设置一些格式规则,然后查询之前先过滤掉不符合规则的Key。
缓存并发
这里的并发指的是多个redis的client同时set key引起的并发问题。其实redis自身就是单线程操作,多个client并发操作,按照先到先执行的原则,先到的先执行,其余的阻塞。当然,另外的解决方案是把redis.set操作放在队列中使其串行化,必须的一个一个执行。

缓存预热
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。
这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!
解决思路:
1、直接写个缓存刷新页面,上线时手工操作下
2.数据量不大,可以在项目启动的时候自动进行加载:
目的就是在系统上线前,将数据加载到缓存中

标签:降级,缓存,服务,Redis,数据库,redis,雪崩
From: https://www.cnblogs.com/haoming-1/p/17871988.html

相关文章

  • 记录:k6性能脚本连接Redis取值
    为了捡起以前学过的一个性能框架k6,拿现在公司的项目来上手,打算业务测试之余拿系统的接口跑跑性能。本周的问题主要集中在k6脚本中引入redis的问题。因为项目系统的登录页面是涉及到验证码图片的,后端写了逻辑会把验证码的值写入在redis,所以登录的时候绕不开这个。再加上对......
  • redis锁
    publicclassRedisTag{/****@paramtagName*@paramtype1、开始2、结束*@paramredisTemplate*@return*/publicstaticbooleantag(StringtagName,Stringtype,RedisTemplate<String,String>redisTemplate){......
  • redis限流
    1、基于Redis的数据结构zset用的redis的zset来计数,score字段寸时间戳,每次请求增加一条数据,并按score移除超时的数据。最后在给整个key1加个过期时间2、基于Redis的令牌桶算法      ......
  • linux中redis的安装和设置开启自动启动
    一、安装redis第一步:下载redis安装包wgethttp://download.redis.io/releases/redis-4.0.6.tar.gz复制代码[root@iZwz991stxdwj560bfmadtZlocal]#wgethttp://download.redis.io/releases/redis-4.0.6.tar.gz第二步:解压压缩包tar-zxvfredis-4.0.6.tar.gz[root@iZwz991stxd......
  • Redis为什么是单线程及高并发的原因
    Redis的高并发和快速原因1.redis是基于内存的,内存的读写速度非常快2.redis是单线程的,省去了很多上下文切换线程的时间3.redis使用多路复用技术,可以外理并发的连接。非阻塞I0内部实现采用epol,采用了epol+自己实现的简单的事件框架。epol中的读、写、关闭、连接都转化成了事件,然后......
  • Caffeine Cache缓存
    SpringBoot集成CaffeineCaffeine和SpringCache依赖,使用注解方法实现缓存依赖<!--提供SpringBoot中的缓存支持--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</......
  • npm和yarn更改依赖包全局下载和缓存路径
    背景在工作中遇到公共构建机器频繁编译打包失败的情况。经过排查是该机器没有权限访问npm默认下载和缓存路径。解决方案1.赋予该机器权限以解决此问题。2.参考了 npm和yarn更改依赖包全局下载和缓存路径。该方法通过修改npm和yarn的配置,改变了下载和缓存路径。#npmnpmcon......
  • 在redis中,如何在创建key的同时,设置key的过期时间
    1、通过下面的创建key,同时设置过期时间SETkeyvalueEXseconds 示例:setteskey01123ex60  设置key的过期时间是60s,这样在创建的时候,就开始倒计时了。 通过工具看,TTL,会定期的刷新,到0之后,这个key就会被删除了。 60s后,key不存在  如果一个key的TTL......
  • 安装redis_exporter 以及配置prometheus
    安装:1、下载redis_exporterwgethttps://github.com/oliver006/redis_exporter/releases/download/v1.29.0/redis_exporter-v1.29.0.linux-amd64.tar.gz2、解压/usr/local目录下,并重命名#tar-zxvfredis_exporter-v1.29.0.linux-amd64.tar.gz-C/usr/local/#cd/usr/local/#......
  • Python爬虫异步与缓存技巧浅析
    Python爬虫异步与缓存技巧浅析在Python爬虫中,异步和缓存是两个非常重要的概念。异步可以显著提高爬虫的效率,而缓存则可以帮助我们避免重复抓取网页,节省时间和资源。一、异步爬虫Python的异步爬虫通常使用asyncio库来实现。这个库提供了异步I/O、事件循环、协程和任务等功能。下面是......