redis作为缓存

互联网高并发请求数据的情况,可能出现频繁访问MySQL的情况,但是MySQL由于自身的特性,可能无法抗住这么大的压力,因此我们想利用redis存储一些MySQL中的数据,redis作为缓存时,一般有以下几个场景:

  • 数据的一致性不是强制的
    比如查询UV的次数,允许和数据库有一些不一致,更新redis是异步的。而像支付等,是强一致性的,则不能使用缓存(只是举个例子),redis更新是异步执行的。
  • 数据经常被访问
    如果数据访问频率不高,则数据库就能解决了,使用redis就是浪费了。

这样,利用redis作为缓存,利用redis的高QPS特点,使得客户端先访问redis,命中的数据直接返回给客户端,未找到的再去数据库中查询,返回给用户最终的结果。

缓存雪崩

问题现象:短时间内存在大量的key过期,而新的key还没有写入内存,访问这些key的请求会直接访问SQL,造成服务崩溃。
问题的本质原因:同时过期的key数量太多,请求越过了redis,直接访问了SQL
解决方案

  • 服务器访问SQL的地方,限流操作
  • 设置过期时间时,添加随机策略,不要统一过期
  • 建立缓存备份,在一个出现大量过期且新key没有写入时,访问备份缓存,确保至少一个可用。

缓存穿透

问题现象:客户端高并发获取redis的数据如果获取不到,则会高并发查询数据库,如果数据库中的数据也不存在,而且访问持续进行,则会打垮数据库。一般是恶意攻击的情况

问题的本质原因:数据不存在的请求没有被redis过滤掉,而且不存在的值也不会再加入redis中,等效成直接访问SQL

解决方案:限制不存在值访问SQL的频率即可,不同的业务场景有不同的方案,给几个常用的方式:

  • 客户端对不存在的访问进行限流处理,比如时间戳限流、漏斗限流和令牌桶等。这种模式的优势在于,对接客户端的时候,就能直接限制次数,而且可以通知不存在的数据
  • 布隆过滤器,把常见的数据加入到布隆过滤器中,如果布隆显示存在则查找redis,并返回数据;因为布隆过滤器可能会误判,误判的情况去找MySQL,这种概率比较小。
  • 服务器端,需要对访问SQL的请求限流

缓存击穿

  • 问题现象:某个key是一个热点的key,即有大量并发的请求会访问这个key。如果此时key过期了,那么这些服务会直接请求到SQL上,导致SQL压力过大而崩掉。注意,这不是雪崩,雪崩是大量的key过期,而这个是特别热点的一个或者几个key过期
  • 问题的本质原因:这种属于正常的业务访问,整个访问流程也是没有问题的,只是瞬间过期的key把承受的压力转移到了SQL端
  • 解决方案
    • SQL端首先要有自己的保护机制,保证最坏的情况下,不会被打垮
    • 对于热点key,可以设置永不过期的策略,只有主动更新的时候去更改

缓存预热

概念:服务启动时,把相关的数据一次性加入redis中
解决问题:避免了用户初始化频繁访问不存在的数据,导致直接请求SQL和频繁加载。
一些限制

  • 需要手动操作
  • 数据量不能太大,否则无法全量加载

缓存更新

缓存中的数据不是一成不变的,需要定期更新,比如置换掉不经常查询的数据,选择出常用的数据重新加入redis中。可以使用LRU等方式来解决这种场景的问题。

注意,更新的时候,如果用到了防止击穿的布隆过滤器,需要一并更新布隆过滤器的数据

缓存降级

redis缓存如果挂掉,则需要执行降级策略:

  • 重试机制:不断重试访问,同时日志报错,提示服务监控应该报警
  • 限流访问机制:此时仍然要给客服服务,应该限流访问MySQL,牺牲部分的性能来换取可用性

redis缓存雪崩、缓存穿透和缓存击穿等总结相关推荐

  1. 解决Redis缓存雪崩、穿透、并发、预热、击穿、热点Key等问题

    一.缓存雪崩 数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机. 比如一个雪崩的简单过程: 1.redis集群大面积故障 2.缓 ...

  2. redis缓存雪崩、穿透、击穿概念、布隆过滤器小结及解决办法

    判存业务 redis缓存雪崩.穿透.击穿概念及解决办法 什么是 概念: 1.缓存雪崩 对于系统 A,假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意 ...

  3. 小白也能看懂的缓存雪崩、穿透、击穿

    作为后端开发,我想缓存是大家再熟悉不过的东西了. 我会介绍出现缓存雪崩.穿透和击穿的业务背景.解决方案和对业务可靠性处理.事先说明,最佳解决方案一定需要结合实际业务调整,不同业务的处理不完全相同 其实 ...

  4. 什么是缓存穿刺和缓存雪崩?如何解决缓存穿透,缓存雪崩?

    参考博客: 什么是缓存穿刺和缓存雪崩?如何解决缓存穿透,缓存雪崩?:https://blog.csdn.net/weixin_42980713/article/details/86292930

  5. 缓存雪崩处理方法-双缓存思路

    为什么80%的码农都做不了架构师?>>>    缓存雪崩处理方法-双缓存思路: http://www.oschina.net/question/12_26514 转载于:https: ...

  6. Redis面试 - redis 的雪崩和穿透?

    Redis面试 - redis 的雪崩和穿透? 面试题 了解什么是 redis 的雪崩和穿透?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透? 面试官心理分析 其实 ...

  7. 【Redis】快速掌握:缓存雪崩、穿透、击穿、预热

    目录 前言 一.缓存 1.1.程序中缓存是什么样的? 1.2.缓存的优点 1.3.缓存的分类 二.缓存特性 2.1.缓存雪崩 2.1.1.雪崩问题 2.1.2.如何解决缓存雪崩问题 2.2.缓存穿透 ...

  8. Redis缓存雪崩、穿透、击穿,布隆过滤器,分布式锁详解

    缓存雪崩 在某一个时间存在大量的缓存key失效 解决办法 1.有效期一直---->给每一个数据加上水机有效期 2.redis挂掉了----->使用redis集群,分摊key的存储 引出re ...

  9. 轻松易懂的缓存雪崩、穿透、击穿以及解决方案

    缓存雪崩 先来看下雪崩的过程 所谓缓存雪崩,指的是缓存数据同一时间大量失效,所有的请求全打到数据库,导致数据库在巨大压力下挂掉. 比如在双十一的时候,用户都会打开淘宝买东西,有的人是真的有需要买的,有 ...

  10. 什么是缓存穿刺和缓存雪崩?如何解决缓存穿透,缓存雪崩

    作为参考使用,以便查阅. 一.缓存穿透: 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存 ...

最新文章

  1. 三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS
  2. Gitlab 生成 swagger 文档
  3. Python 使用穷举法求两个数的最大公约数。
  4. 遇到个鬼,在WIN08的DELL R710上安装CENTOS 63,无法格式化以前的硬盘分区,安装无法进行下去。...
  5. 【MFC】状态栏随对话框的改变而改变
  6. 在Spring中使用@ResponseStatus获取Http状态
  7. 使用WSO2 ESB进行邮件内容过滤
  8. 【FFMPEG源码终极解析】void av_packet_unref(AVPacket *pkt)
  9. “约见”面试官系列之常见面试题之第九十一篇之简述Vue的生命周期适用于哪些场景(建议收藏)
  10. SQL语句执行效率及分析
  11. QDataStream 多余字符的产生原因及消除方法
  12. [渝粤教育] 中国地质大学 中外美术史 复习题 (2)
  13. 苹果6S怎么录屏_苹果6s来电没声音怎么回事
  14. CUPS共享打印机服务
  15. 《Linux7构搭建DISCUZ论坛 》
  16. 矩阵理论| 特殊矩阵:正定矩阵
  17. 阿里巴巴Android开发手册
  18. 归一化谱聚类NCUT(matlab实现)
  19. foxmail邮件只能显示邮件头,不能显示内容
  20. 吉大 《职业生涯设计》大作业

热门文章

  1. java死锁怎么用jvm调试_性能测试之JVM的故障排查-死锁
  2. mfc 禁用子菜单_MFC界面开发难上手?BCGControlBar v30.3帮你忙—工具栏和菜单
  3. nodejs 图片处理模块 rotate_如何针对数据不平衡做处理?
  4. P6:可视化卷积神经网络
  5. 模型压缩:Deep Compression
  6. NumPy中如何确定两个ndarray数组完全相同
  7. Anaconda——conda换源可以直接通过conda命令来实现
  8. 【Qt教程】2.2 - Qt5 布局管理器(水平、垂直、栅格布局)、弹簧、设计一个登陆界面
  9. AcWing 789. 数的范围 (整数二分)
  10. leetcode971. Flip Binary Tree To Match Preorder Traversal