当前位置:   article > 正文

Redis常见使用场景、缓存问题_redis作为缓存使用的场景

redis作为缓存使用的场景

使用场景、缓存问题

1、热点数据的缓存
公司项目用户量达到一定数量的时候,这时合理的利用缓存不仅能够提升项目访问速度,还能大大降低数据库的压力。
2、业务上的统计,排行榜
为了保证数据实时效,比如项目的访问量,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力
3、限时业务的运用
每日签到、限制登录功能等业务场景
4、消息队列
提供基本的发布订阅功能,但不像消息队列那种专业级别。一些访问,点击量高的网站中必备中间件,主要用于流量削峰,异步处理实时性低的业务。(和专门的中间件效果要差些)
其他的一些功能还有聊天室好友列表,各种排行榜,秒杀,抢购,数据过期处理等等。

缓存雪崩

原因

大量redis key在同一时间失效,导致大量请求访问数据库,数据库服务器宕机,线上服务大面积报错。
缓存雪崩是指缓存中大批量的 key 同时过期,而此时数据访问量又非常大,从而导致后端数据库压力突然暴增,甚至会挂掉,这种现象被称为缓存雪崩。它和缓存击穿不同,缓存击穿是在并发量特别大时,某一个热点 key 突然过期,而缓存雪崩则是大量的 key 同时过期,因此它们根本不是一个量级。

解决办法

缓存雪崩和缓存击穿有相似之处,所以也可以采用热点数据永不过期的方法,来减少大批量的 key 同时过期。再者就是为 key 设置随机过期时间,避免 key 集中过期。

(1)redis高可用

(2)加锁排队,限流降级

(3)缓存失效时间均匀分布

(4)使用多级缓存,或为热点数据设置永不失效

在这里插入图片描述

缓存穿透

原因

指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。
缓存穿透是指当用户查询某个数据时,Redis 中不存在该数据,也就是缓存没有命中,此时查询请求就会转向持久层数据库 MySQL,结果发现 MySQL 中也不存在该数据,MySQL 只能返回一个空对象,代表此次查询失败。如果这种类请求非常多,或者用户利用这种请求进行恶意攻击,就会给 MySQL 数据库造成很大压力,甚至于崩溃,这种现象就叫缓存穿透。

解决办法

(1)接口层增加校验

(2)采用布隆过滤器

布隆过滤器判定不存在的数据,那么该数据一定不存在,利用它的这一特点可以防止缓存穿透。首先将用户可能会访问的热点数据存储在布隆过滤器中(也称缓存预热,缓存预热:是指系统启动时,提前将相关的数据加载到 Redis 缓存系统中。这样避免了用户请求的时再去加载数据),当有一个用户请求到来时会先经过布隆过滤器,如果请求的数据,布隆过滤器中不存在,那么该请求将直接被拒绝,否则将继续执行查询。相较于第一种方法,用布隆过滤器方法更为高效、实用。
在这里插入图片描述

(3)缓存空对象

当 MySQL 返回空对象时, Redis 将该对象缓存起来,同时为其设置一个过期时间。当用户再次发起相同请求时,就会从缓存中拿到一个空对象,用户的请求被阻断在了缓存层,从而保护了后端数据库,但是这种做法也存在一些问题,虽然请求进不了 MSQL,但是这种策略会占用 Redis 的缓存空间。

缓存击穿

原因

缓存击穿是指用户查询的数据缓存中不存在,但是后端数据库却存在,这种现象出现原因是一般是由缓存中 key 过期导致的。比如一个热点数据 key,它无时无刻都在接受大量的并发访问,如果某一时刻这个 key 突然失效了,就致使大量的并发请求进入后端数据库,导致其压力瞬间增大。这种现象被称为缓存击穿。这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。比如微博热搜。

解决办法

(1)设置热点数据缓存没有过期时间

(2)加互斥锁,采用分布式锁的方法

重新设计缓存的使用方式,过程如下:
上锁:当我们通过 key 去查询数据时,首先查询缓存,如果没有,就通过分布式锁进行加锁,第一个获取锁的进程进入后端数据库查询,并将查询结果缓到Redis 中。
解锁:当其他进程发现锁被某个进程占用时,就进入等待状态,直至解锁后,其余进程再依次访问被缓存的 key。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/611248
推荐阅读
相关标签
  

闽ICP备14008679号