Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Redis--Redis集群、缓存穿透、缓存击穿、缓存雪崩

Redis--Redis集群、缓存穿透、缓存击穿、缓存雪崩

原创
作者头像
Java学术趴
发布于 2022-10-07 04:50:15
发布于 2022-10-07 04:50:15
2K0
举报
文章被收录于专栏:Java全栈·Java全栈·

👨‍🎓作者:Java学术趴 🏦仓库:GithubGitee ✏️博客:CSDN掘金InfoQ云+社区 💌公众号:Java学术趴 🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。 🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号Java学术趴联系小编。

☠️每日毒鸡汤:一件事你犹豫去不去做,那就是该立即动身做的。

1. Redis集群

1.1 为什么使用集群

Redis容量不够,Redis该如何扩容?

当并发写操作时,Redis如何分摊?

另外,主从模式、薪火相传、主机宕机模式,导致ip地址发生变化,应用程序中配置了需要修改对应的主机地址、端口信息。

之前通过代理主机解决,但是 Redis3.0 之后提供了解决方案。就是 去中心化集群配置

1.2 集群的搭建方式

1.2.1 代理主机模式
  • 用户、订单、商品都对应的一个服务器的主从关系。
  • 代理主机 作为 Redis集群的入口,在该代理中判断分配给哪个主从服务器进行处理。
  • 存在问题:当代理主机宕机之后,整个集群就不能使用了。
1.2.2 无中心化集群
  • 没有指定的集群入口,可以从任何一个主从服务器当作是 Redis 集群的入口。
  • 每个主从服务器之间可以进行交互,不需要代码机器进行分配。
  • 当有一个主从服务器宕机的时候,不会影响到其他主从服务器的运行,Redis集群还可以使用。

1.3 什么是集群

  • Redis集群实现了对 Redis 的水平扩容,即启动 N 个 Redis 节点,将整个数据库分布存储在这N个节点中,每个节点存储总数数据的 1/N。
  • Redis集群通过分区来提供一定程度的可用性;即使集群中有一部分节点失效或者无法通讯,集群也可以继续处理命令请求。

1.4 集群优点

  • 实现扩容。
  • 分摊压力。
  • 无中心化配置。

1.5 Redis的不足

  • 多键操作是不被支持的。
  • 多键盘的Redis服务不被支持。lua脚本不被支持。

2. 使用会遇到的问题

2.1 缓存穿透

2.1.1 缓存穿透介绍
  • key对应的数据在数据源中不存在,每次针对此key的请求从缓存中获取不到,请求都会压到数据源,从而可能压垮数据源。比如一个不存在的用户id获取用户信息。不论缓存还是数据库都没有,若黑客利用此漏洞进行工具可能压垮数据库。
2.1.2 缓存穿透的解决方案
  • 对空值缓存 : 如果查询返回的数据为空(不管数据是否存在),我们仍然把这个空结果(null)进行缓存,设置空结果的过期时间会很短,最长不超过五分钟。
  • 设置可访问的名单(白名单) : 使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmaps里面的id进行比较,如果访问id不在bitmaps里面,进行拦截,不允许访问。
  • 采用布隆过滤器 : (布隆过滤器是 1970 年由布隆提出的),它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询效率都远远高于其他的算法,缺点是有一定的错误识别率和删除苦困难。
  • 进行实时监控 : 当发现Redis的命中率开始急剧下降时,需要排查访问对象和访问的数据,和运维人员配合,可以设置黑名单限制服务。

2.2 缓存击穿

2.2.1 缓存击穿介绍
  • key对应的数据存在,但在 Redis 中过期,此时如果有大量并发请求,这些请求发现缓存中的数据已经过期,此时就会直接从数据库中查询写入到Redis中,如果这个阶段存在大量的请求,那么可能会瞬间把数据库压垮。
9.2.2 解决方案
  • 预先设置热门数据 : 在 Redis 高峰访问之前,把一些热门数据提前存入到Redis里面,加大这些热门数据key的时长。比如一个热搜。
  • 实时调整 : 现场监控哪些数据热门,实时调整key过期时长。
  • 使用锁 :就是在缓存失效的时候(判断拿出来的值为空),不是立即去 load db。

2.3 缓存雪崩

2.3.1 缓存雪崩介绍
  • key对应的数据存在,但在 Redis 中过期,此时若有大量的并发请求过来,这些请求发现缓存过期,这个时候就会查询数据库重新写到 Redis 中,这个时候大并发请求可能会把数据库瞬间压垮。
  • 缓存失效雪崩时对底层系统的冲击力非常可拍。

缓存雪崩和缓存穿透的区别:缓存雪崩是针对的大量的key,缓存击穿是针对的某一个 key

2.3.2 解决缓存雪崩问题
  • 构建多级缓存架构 :nginx缓存 + redis缓存 + 其他缓存( ehcache 等)
  • 使用锁或者队列 : 用锁或者队列的方式保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。这种方式不适用于高并发情况。
  • 设置过期标志更新缓存 :记录缓存数据是否过期(设置提前量),如果过期回触发通知线程,被通知的线程去后台更新实际的 key 到缓存中。
  • 将缓存失效时间分散开:比如我们可以在原有的失效时间基础上增加一个随机值,比如:1~5分钟随机,这样每一个缓存的过期时间重复率会降低,就很难引发集体失效的事件。也就是每个key的失效事件设置为不一样的,在不同的时间更新ley,而不是在某个时间点更新所有的key。

Redis核心:单线程 + IO多路复用技术

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis-缓存穿透、缓存击穿和缓存雪崩
缓存穿透(查不到):查询一个数据时Redis内存数据库没有,缓存未命中,于是向持久层数据库查询发现也不存在,查询失败。当多次缓存未命中时,都去请求持久层数据库造成压力,若用此进行攻击可能压垮数据库。
唔仄lo咚锵
2020/09/15
8150
Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?
原始数据存储在 DB 中(如 MySQL、Hbase 等),但 DB 的读写性能低、延迟高。
码哥字节
2022/04/08
1.7K0
Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?
Redis之缓存穿透,雪崩,击穿解读
当我们请求去查询一条记录,先到redis中查询后到mysql查询都发现找不到该条记录,但是请求每次都会打到数据库上面去,导致后台数据库压力暴增,这些请求像“穿透”了缓存一样直接打在数据库上,这种现象就叫做缓存穿透。这种现象我们称为缓存穿透,这个redis变成了一个摆设。
一个风轻云淡
2023/10/15
3890
Redis详解(十二)------ 缓存穿透、缓存击穿、缓存雪崩
本篇博客我们来介绍Redis使用过程中需要注意的三种问题:缓存穿透、缓存击穿、缓存雪崩。
IT可乐
2020/06/02
52.1K1
Redis-缓存雪崩、缓存击穿、缓存穿透
Redis作为目前使用最广泛的缓存,相信大家都不陌生。但是使用缓存并没有这么简单,还要考虑缓存雪崩,缓存击穿,缓存穿透的问题,什么是缓存雪崩,击穿,穿透呢,出现这些问题又怎么解决呢,接下来学习一下吧。
java技术爱好者
2021/02/05
1.4K0
Redis-缓存雪崩、缓存击穿、缓存穿透
Redis 面试常见问题:缓存雪崩、缓存击穿以及缓存穿透
缓存雪崩是指大量的请求无法在缓存中处理,从而将请求转移到数据库中,导致数据压力倍增。一个Redis实例可以支持万级别的并发请求,而单个数据库只能支持千级别的并发请求。两者处理请求并发能力相差十倍,数据库会由于压力过大而导致雪崩。这里雪崩一般是由两个原因组成,很多文章只写缓存同时过期的情况。
用户10384376
2023/02/25
1.1K0
Redis 面试常见问题:缓存雪崩、缓存击穿以及缓存穿透
什么是redis的缓存穿透,缓存击穿和缓存雪崩?
是指查询一个不存在的数据,mysql查询不到数据,也不会直接写入缓存,每次请求都要去查数据库。可能导致数据库挂掉,这种情况大概率是遭到了攻击。
reload
2024/04/17
1.3K0
什么是redis的缓存穿透,缓存击穿和缓存雪崩?
【Redis 系列】redis 学习十二,redis 缓存穿透,缓存击穿,缓存
虽然我们在使用 redis 缓存的时候非常的爽,它大大的提高了我们应用程序的性能和效率,尤其是数据查询方面,咱们不用直接去持久化的数据库中查询数据,而是到内存中查询数据即可
阿兵云原生
2023/02/16
1.5K0
缓存穿透、缓存击穿和缓存雪崩
什么是缓存穿透呢?它是指当用户在查询一条数据的时候,而此时数据库和缓存却没有关于这条数据的任何记录,而这条数据在缓存中没找到就会向数据库请求获取数据。它拿不到数据时,是会一直查询数据库,这样会对数据库的访问造成很大的压力。
JAVA日知录
2020/11/05
1.6K0
缓存穿透、缓存击穿和缓存雪崩
白话文讲述什么是缓存穿透、缓存雪崩、缓存击穿?
在我们日常开发中,我们存储数据的方式一般都在数据库中,一般业务系统不会存在高并发的情况,也不怎么可能会发生概率性BUG问题,可一旦发涉及了高并发的需求,例如现在年底抢火车票的情景,单一使用数据库来保存数据肯定是不行的,首先我们的DB数据库是面向磁盘的,服务端与数据库交互都会有磁盘读/写操作而且该方式效率以及性能比较慢。
黎明大大
2021/03/09
5460
缓存穿透,缓存雪崩,缓存击穿
缓存穿透是指查询一个一定不存在的数据,即缓存和数据库中都没有的数据。由于缓存不命中,并且出于容错考虑,如果从数据库查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,失去了缓存的意义。
丁D
2022/08/12
1.8K0
缓存穿透,缓存雪崩,缓存击穿
redis的缓存穿透、缓存雪崩、缓存击穿怎么搞?
可以将热点数据设置为永远不过期;或者基于 redis or zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据。
Java技术债务
2022/08/09
5170
Redis缓存雪崩、缓存穿透、缓存击穿解决方案详解
像电商项目,一般采取将不同分类的商品,缓存不同周期。在同一分类中的商品,加上一个随机因子。尽可能分散缓存过期时间,而且,热门类目的商品缓存时间长一些,冷门类目的商品缓存时间短一些,也能节省缓存服务的资源。
JavaEdge
2022/11/30
1.3K0
Redis缓存雪崩、缓存穿透、缓存击穿解决方案详解
redis缓存雪崩 缓存穿透 缓存击穿如何解决_缓存击穿问题
每一个put进来的值会经过几个hash函数运算(预测插入数据的数量和容错率,系统自动推断出来设置几个hash函数合适),然后映射到响应为位上,将响应位的bit置为1。当查询值是否在布隆过滤器中的时候,将该值与上述hash函数运算,如果各个位置的bit均为1,则判断该值极有可能在布隆过滤器中。
全栈程序员站长
2022/09/21
8180
redis缓存雪崩 缓存穿透 缓存击穿如何解决_缓存击穿问题
再也不怕,缓存雪崩、击穿、穿透!
用户的数据一般都是存储于数据库,数据库的数据是落在磁盘上的,磁盘的读写速度可以说是计算机里最慢的硬件了。
小林coding
2021/03/27
5520
缓存穿透、缓存击穿、缓存雪崩看这篇就够了,文末还送福利哦!
当我们进行架构设计时,缓存是提高高性能的最重要也是最常用的组件之一。数据库的瓶颈在于磁盘I/O,虽然现如今关系数据库的部分应用场景采用了NoSQL作为替代,但依然没能摆脱磁盘I/O的性能问题。缓存的妙处就是在提高性能的同时,也保护了下游数据库,避免I/O压力过大导致宕机。
码农神说
2020/08/05
7000
缓存穿透、缓存击穿、缓存雪崩看这篇就够了,文末还送福利哦!
缓存雪崩、击穿、穿透,该如何避免?
帅气迷人的面试官您好,我了解的,目前电商首页以及热点数据都会去做缓存 ,一般缓存都是定时任务去刷新,或者是查不到之后去更新的,定时任务刷新就有一个问题。
Bug开发工程师
2019/11/27
1.2K0
漫话:如何给女朋友解释什么是缓存穿透、缓存击穿、缓存雪崩?
周末在家面试,和候选人聊到Redis的问题,于是问了他一个问题:你知道缓存穿透、缓存击穿和缓存雪崩吗?他们之间的区别是什么?分别怎么解决吗?
CSDN技术头条
2021/02/03
5670
漫话:如何给女朋友解释什么是缓存穿透、缓存击穿、缓存雪崩?
Redis的缓存击穿、缓存穿透和缓存雪崩是什么?怎么预防?
最近在CSDN上看到了一篇博客,Redis缓存击穿、雪崩、穿透!(超详细),详细讲述了缓存穿透、缓存击穿和缓存雪崩是什么。对我这个刚刚入门的人来说,看完之后非常震撼。 但是这篇博客没有给出具体的实现,并且在浏览大部分博客之后,发现大家在实现的过程中,并不能像这篇博客一样考虑的这么周全。
小王不头秃
2024/06/19
4770
Redis的缓存击穿、缓存穿透和缓存雪崩是什么?怎么预防?
php解决redis的缓存雪崩,缓存穿透,缓存击穿的问题
一:前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。
郑洪志
2023/03/05
1.4K0
推荐阅读
相关推荐
Redis-缓存穿透、缓存击穿和缓存雪崩
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档