一、Redis穿透

缓存穿透现象:用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。

介绍两种常用解决方案:

1.解决方案1:布隆过滤器

参考下面这篇文章,我觉得讲得非常详细了,

详解布隆过滤器的原理、使用场景和注意事项

2.解决方案2:缓存空对象

缓存穿透:黑客发送大量请求,请求的数据是数据库里没有的,每次都会不走缓存,直接走数据库,最后可能造成数据库宕机

解决:只要数据库没查到,就写一个空值到缓存,下次还有这个请求,就可以走缓存了

弊端:

  1. 如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键;
  2. 即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。

二、Redis击穿

XXX

三、Redis雪崩

缓存雪崩现象:大量key同一时间点全部失效,同时又有大量请求打进来,导致流量直接打在DB上,造成DB不可用。

那么思考下以下几个问题:

  • Redis缓存为什么会大量key同一时间点全部失败?
  • 数据库能支持的最大并发请求数是多少?
  • 数据库挂掉了DBA会怎么处理?

要想了解上面的问题,看下下面这张图:

1.Redis为什么会出现大量key同一时间点全部失效?

Redis服务器宕机了,Redis服务器宕机一般是因为并发数超过Redis服务器能支撑的最大的并发数。具体案例可以看下记一次redis挂机导致的服务雪崩事故,不对,是故事~ (非常好的雪崩案例分析)

2.再来看下数据库能支撑的最大并发请求数?

数据库类型 支持的最大并发数 备注
MySql 16384 受服务器配置,及网络环境等制约,实际服务器支持的并发连接数会小一些,主要决定因素有:

1、服务器CPU及内存的配置。

2、网络的带宽。互联网连接中上行带宽的影响尤为明显。

Oracle 40000

1.查看oracle的最大并发数限制,可是查看v$license视图

2.手动计算:每个Session消耗的内存和参数设置有关,如果是DEDICATE(独立模式)方式,sort_area_size大小和PGA内存消耗相关,如果是512K,则大概每个Session消耗3M左右,所以,机器允许的最大并发连接数=(机器内存-ORACLE等系统软件内存-oracleSGa内存)/3m

Postgre

大于Oracle

1.最大连接数也可以在pg配置文件中配置:

在postgresql.conf中设置:

max_connections = 500

2.查看为超级用户保留的连接数:

show superuser_reserved_connections ;

3.Redis雪崩的解决方案

(1)redis高可用

这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群。

(2)限流降级

这个解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

(3)数据预热

数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

具体案例可以看下上图案例的解决方案

参考文章:

帮你解读什么是Redis缓存穿透和缓存雪崩(包含解决方案)

详解布隆过滤器的原理、使用场景和注意事项

Redis系列(二):Redis缓存穿透和缓存雪崩是什么?相关推荐

  1. 深入剖析Redis系列(七) - Redis数据结构之列表

    前言 列表(list)类型是用来存储多个 有序 的 字符串.在 Redis 中,可以对列表的 两端 进行 插入(push)和 弹出(pop)操作,还可以获取 指定范围 的 元素列表.获取 指定索引下标 ...

  2. 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  3. 深入剖析Redis系列(五) - Redis数据结构之字符串

    前言 字符串类型 是 Redis 最基础的数据结构.字符串类型 的值实际可以是 字符串(简单 和 复杂 的字符串,例如 JSON.XML).数字(整数.浮点数),甚至是 二进制(图片.音频.视频),但 ...

  4. Redis系列教程(三):如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题

    Java相关的面试都会问到缓存的问题:史上最全Redis面试49题(含答案):哨兵+复制+事务+集群+持久化等,除此之外还会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等不常见的问题,但却是非 ...

  5. Redis系列:缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级

    今天给大家整理一篇关于Redis经常被问到的问题:缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等概念 一.缓存雪崩 缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间(例如:我们设置缓 ...

  6. Redis专题-缓存穿透、缓存雪崩、缓存击穿

    一.缓存穿透 缓存穿透概念 缓存穿透是指查询一个一定不存在的数据,在数据库没有,自然在缓存中也不会有.导致用户查询的时候,在缓存中找不到对应key的value,每次都要去数据库再查询一遍,如果从存储层 ...

  7. Redis的缓存雪崩、缓存击穿、缓存穿透与缓存预热、缓存降级

    一.缓存雪崩: 1.什么是缓存雪崩: 如果缓在某一个时刻出现大规模的key失效,那么就会导致大量的请求打在了数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机.这时候如果 ...

  8. Redis缓存穿透、缓存击穿和缓存雪崩

    目录 一.缓存穿透 概念 解决方案 布隆过滤器 缓存空对象 二.缓存击穿 概念 解决方案 使用互斥锁(mutex key) 设置热点数据永不过期 三.缓存雪崩 概念 解决方案 redis高可用 限流降 ...

  9. redis缓存穿透、缓存雪崩、缓存击穿、并发竞争

    关注微信公众号"虾米聊吧",每天更新一篇技术文章,文章内容涵盖架构师成长必经之路应掌握的技术,一起学习,一起交流. 缓存穿透.缓存雪崩.缓存击穿.并发竞争是缓存最常见的几个问题,接 ...

最新文章

  1. 大有乾坤,售前机器人背后的 AI 技术
  2. VC 2.5 与 ESX 3.0.1 之间存在接口问题
  3. 如何简化Exchange 2007 OWA URL访问
  4. windows优化_windows系统优化教程——C盘清理及优化
  5. 【天池赛事】零基础入门语义分割-地表建筑物识别 Task5:模型训练与验证
  6. php通知websocket,php实现websocket实时消息推送
  7. linux网络子系统研究:数据收发简略流程图
  8. PHP清除HTML代码、空格、回车换行符的函数
  9. 《第三次浪潮》的体会!
  10. 1. JavaScript 与 PHP 的语法区别
  11. 存储函数与存储过程的区别
  12. mac 自带画图软件(mac 打开预览)
  13. java根据距离算经纬度_java 根据两点经纬度来算距离
  14. PreparedStatement 大数据查询
  15. lzg_ad:FBW控制台命令详解
  16. 高博课程编程作业之计算小萝卜的坐标
  17. 医院挂号系统代码_智慧医院中心是怎样做的?分诊叫号系统如何正确使用!
  18. Java新手小白入门篇 项目 - 深海杀手
  19. 计算机网络语音传输杂音回音,电脑使用麦克风有杂音的解决方法-电脑自学网...
  20. Call to undefined function bcadd()

热门文章

  1. 使用SDWebImage淡入淡出的方式加载图片
  2. 人人网的系统架构 网上搜集
  3. 动态调用Web Service
  4. 求职:网站编辑或网页美工(北京)
  5. Android AsyncTask两种线程池分析和总结
  6. Unity3D 中的程序后台运行
  7. 如何保证用户登陆时提交密码已经加密
  8. 【Java中级】(三)IO
  9. 匿名类、包、权限修饰符_DAY10
  10. 在Spark中自定义Kryo序列化输入输出API(转)