Redis缓存问题(图解:三种缓存问题)
2年前 (2024-04-27)
在实际的业务场景中,Redis 一般和其他数据库搭配使用,用来减轻后端数据库的压力,比如和关系型数据库 MySQL 配使用。
Redis 会把 MySQL 中经常被查询的数据缓存起来,比如热点数据,这样当用户来访问的时候,就不需要到 MySQL 中去查询了,而是直接获取 Redis 中的缓存数据,从而降低了后端数据库的读取压力。如果说用户查询的数据 Redis 没有,此时用户的查询请求就会转到 MySQL 数据库,当 MySQL 将数据返回给客户端时,同时会将数据缓存到 Redis 中,这样用户再次读取时,就可以直接从 Redis 中获取数据。流程图如下所示:

图1:缓存使用流程图
在使用 Redis 作为缓存数据库的过程中,有时也会遇到一些棘手问题,比如常见缓存穿透、缓存击穿和缓存雪崩等问题,本节将对这些问题做简单地说明,并且提供有效的解决方案。
Redis 会把 MySQL 中经常被查询的数据缓存起来,比如热点数据,这样当用户来访问的时候,就不需要到 MySQL 中去查询了,而是直接获取 Redis 中的缓存数据,从而降低了后端数据库的读取压力。如果说用户查询的数据 Redis 没有,此时用户的查询请求就会转到 MySQL 数据库,当 MySQL 将数据返回给客户端时,同时会将数据缓存到 Redis 中,这样用户再次读取时,就可以直接从 Redis 中获取数据。流程图如下所示:

图1:缓存使用流程图
缓存穿透
缓存穿透是指当用户查询某个数据时,Redis 中不存在该数据,也就是缓存没有中,此时查询请求就会转向持久层数据库 MySQL,结果发现 MySQL 中也不存在该数据,MySQL 只能返回一个空对象,代表此次查询失败。如果这种类请求非常多,或者用户利用这种请求进行恶意攻击,就会给 MySQL 数据库造成很大压力,甚于崩溃,这种现象就叫缓存穿透。为了避免缓存穿透问题,下面介绍两种解决方案:
1) 缓存空对象
当 MySQL 返回空对象时, Redis 将该对象缓存起来,同时为其设置一个过期时间。当用户再次发起相同请求时,就会从缓存中拿到一个空对象,用户的请求被阻断在了缓存层,从而保护了后端数据库,但是这种做法也存在一些问题,虽然请求进不了 MSQL,但是这种策略会占用 Redis 的缓存空间。
2) 布隆过滤器
我们知道,布隆过滤器判定不存在的数据,那么该数据一定不存在,利用它的这一特点可以防止缓存穿透。
首先将用户可能会访问的热点数据存储在布隆过滤器中(也称缓存预热),当有一个用户请求到来时会先经过布隆过滤器,如果请求的数据,布隆过滤器中不存在,那么该请求将直接被拒绝,否则将继续执行查询。相较于种方法,用布隆过滤器方法更为高效、实用。其流程示意图如下:

图2:缓存穿透问题解决
缓存预热:是指系统启动时,提前将相关的数据加载到 Redis 缓存系统中。这样避免了用户请求的时再去加载数据。
缓存击穿
缓存击穿是指用户查询的数据缓存中不存在,但是后端数据库却存在,这种现象出现原因是一般是由缓存中 key 过期导致的。比如一个热点数据 key,它无时无刻都在接受大量的并发访问,如果某一时刻这个 key 突然失效了,就致使大量的并发请求进入后端数据库,导致其压力瞬间增大。这种现象被称为缓存击穿。缓存击穿有两种解决方法:
1) 改变过期时间
设置热点数据永不过期。
2) 分布式锁
采用分布式锁的方法,重新设计缓存的使用方式,过程如下:
上锁:当我们通过 key 去查询数据时,首先查询缓存,如果没有,就通过分布式锁进行加锁,个获取锁的进程进入后端数据库查询,并将查询结果缓到Redis 中。
解锁:当其他进程发现锁被某个进程占用时,就进入等待状态,直解锁后,其余进程再依次访问被缓存的 key。
缓存雪崩
缓存雪崩是指缓存中大批量的 key 同时过期,而此时数据访问量又非常大,从而导致后端数据库压力突然暴增,甚会挂掉,这种现象被称为缓存雪崩。它和缓存击穿不同,缓存击穿是在并发量特别大时,某一个热点 key 突然过期,而缓存雪崩则是大量的 key 同时过期,因此它们根本不是一个量级。解决方案
缓存雪崩和缓存击穿有相似之处,所以也可以采用热点数据永不过期的方法,来减少大批量的 key 同时过期。再者就是为 key 设置随机过期时间,避免 key 集中过期。- 随机文章
- 登录马尔代夫网址(马尔代夫官方旅游网站,探索天堂岛屿 Visit Maldives)
- 上海 马尔代夫 航班吗(上海至马尔代夫航班开通!)
- 马尔代夫警(马尔代夫警方开展行动打击走私贩毒活动)
- 婚礼度假马尔代夫(浪漫之旅,完美婚礼——探秘马尔代夫)
- 城建集团马尔代夫(城建集团在马尔代夫的投资和建设计划)
- 万豪 马尔代夫 积分(用积分兑换!去万豪马尔代夫享受梦想假期)
- 怀化洪江马尔代夫(湖南怀化洪江建设“马尔代夫度假村”)
- 房车旅游马尔代夫(驾房车游马尔代夫:探寻热带海岛之美)
- 男足败给马尔代夫(中国男足惨遭马尔代夫逆袭,遭遇失利)
- 染发颜色马尔代夫(美丽马尔代夫:染发体验带来多彩夏日)
- 浪漫马尔代夫婚礼(浪漫登记马尔代夫,人生一场爱情盛宴)
- 坂南 马尔代夫(坂南酒店:马尔代夫豪华海滩度假胜地)
- 格言 马尔代夫(马尔代夫之旅:探寻未知的海洋奇观)
- 水下婚礼马尔代夫(浪漫水下婚礼,感受马尔代夫海底恋歌)
- 皖南马尔代夫风景(走进中国马尔代夫,探索皖南美丽风景)
- 德宏 马尔代夫(德宏游客可享马尔代夫风光)
- 柯南 马尔代夫(柯南登陆马尔代夫,解锁海底奇案)
- 悉尼 马尔代夫(重磅!澳洲航班开通,悉尼直飞马尔代夫!)
- 印度马尔代夫移民(印度人涌向马尔代夫:寻求更好的生活)
- 马尔代夫业余球员(马尔代夫业余球员成为国家足球队一员)
- 赞美马尔代夫名言(马尔代夫的自然美妙地融合在其名言中)
- 潜水 马尔代夫(探秘神秘的马尔代夫:揭开海底世界的神秘面纱)
- 贴吧 马尔代夫(马尔代夫贴吧,分享天堂般的岛屿体验)
- 马尔代夫化妆视频(学习马尔代夫风情妆容,美丽不再难!)
- 马尔代夫卡纳塔岛(马尔代夫卡纳塔岛:美丽海岛旅游胜地)
- 虎航 马尔代夫(虎航正式开通马尔代夫航线,为旅客带来海岛度假新体验)
- 马尔代夫上空俯瞰(鸟瞰马尔代夫,美轮美奂景色尽收眼底)
- 马尔代夫印度总理(印度总理对马尔代夫进行了历史性访问)
- 马尔代夫国足人员(马尔代夫国家足球队成员确诊新冠病毒)
- 马尔代夫厦门大学(厦门大学和马尔代夫合作开设海洋学院)
