Redis缓存的三大问题与解决方案

数据库 Redis
缓存空对象,针对这些恶意构建的key在Redis中缓存一个空值并设置一个过期时间,那么后续请求是不会到达Mysql上,而是直接通过Redis返回的一个空值给到用户。

    Redis的三大缓存问题也就是缓存击穿、缓存雪崩和缓存穿透,在生产环境中会因为这些原因造成请求绕过了Redis直接访问数据库,使得数据库的负载增大,这样不仅导致缓存的作用降低,甚至引发数据库压力过大而崩溃进而蔓延到整个系统无法使用。下面我们来聊聊Redis缓存的三大问题与解决方案。

1、缓存雪崩

    缓存雪崩指的是由于Redis里面同一时间出现了多个key同时失效,导致大量请求直接访问数据库,瞬间引发数据库压力激增,甚至导致数据库崩溃,如下图所示:

图片图片

解决方案:

(1)将Redis进行高可用的架构部署(主从+哨兵、集群),避免Redis出现全盘崩溃宕机的情况。

(2)使用本地缓存、Histrix限流降级、Nginx IP限流等等方法,避免Mysql被大流量冲垮,同时在缓存不可用时可以返回一些默认值或者降级的数据。

(3)针对于Redis里面的key设置一个合理的过期时间(如缓存的过期时间为随机值),避免大量的key同时失效。

2、缓存击穿

    缓存击穿是指某个热点数据A在缓存中失效的瞬间,此时又有大量的并发请求同时访问该数据A,由于数据A在缓存中失效,大量请求同时访问数据库,造成数据库压力骤增。这种情况通常发生在热点数据或访问频繁的数据上,如下如图所示的:

图片图片

    通常Mysql只能支持2000个请求的并发量,Redis中的key_1正在承担4000个请求的并发量,由于key_1瞬间失效导致4000个并发请求直接请求数据库,可能就会导致Mysql瞬间宕机,进而蔓延整个系统都无法使用。

解决方案:

(1)给key设置一个合理的过期时间,可以将这个热点数据设置为永不过期,或者及时的给热点key进行续期。

(2)使用互斥锁,我们可以基于Redis或Zookeeper实现一个互斥锁,等待第一个请求构建缓存之后,再来释放锁。如下图所示:

图片图片

    这样后续的其他的请求就会通过Redis来查询数据,那么大量的请求就不会到达Mysql上而导致其的性能下降甚至出现宕机的问题。

(3)对一些热点数据提前加载并定期刷新缓存,防止缓存失效。

3、缓存穿透

    缓存穿透是指客户端频繁访问一些根本不存在的缓存数据,由于缓存中没有这些数据的记录,每次请求都直接访问数据库导致数据库压力增大,但是数据库中也不存在这个数据。

图片图片

    通常是由于攻击者输入非法或恶意构造的请求访问服务,由于Redis缓存的不存在,此时大量请求都是直接到达Mysql上。

解决方案:

(1)缓存空对象,针对这些恶意构建的key在Redis中缓存一个空值并设置一个过期时间,那么后续请求是不会到达Mysql上,而是直接通过Redis返回的一个空值给到用户。设置过期时间是因为随着系统的运行这部分数据可能后面会产生,那么key的过期时间到了之后,key会被Redis删除,后面有用户正常来访问的时候,这个key它会被重新缓存到Redis上。

(2)参数校验,在系统前端或者应用层对请求的参数进行有效性验证,过滤掉明显无效或恶意的请求,如请求参数为主键id是大于0的,那么对于请求小于0的id参数是明显不符合要求的,可以直接返回错误请求。

(3)布隆过滤器,判断这些请求参数是否存在Redis和Mysql中,如果布隆过滤器判断这些请求参数不存在Redis和Mysql中就直接返回,这样恶意构建的这些请求就被拦截了,当然布隆过滤器存在一定的误判率。

责任编辑:武晓燕 来源: 龙虾编程
相关推荐

2018-11-12 12:12:15

架构师缓存数据库

2022-06-21 13:48:30

Redis缓存

2024-12-02 01:16:53

2010-05-12 14:18:58

Linux引导

2024-05-23 07:59:42

RedisKey性能

2010-09-07 13:24:18

CSS

2018-05-30 08:10:34

智慧农业物联网物联网应用

2011-05-19 14:16:29

网页设计

2019-10-08 16:05:19

Redis数据库系统

2018-11-12 11:12:46

2010-10-08 16:31:08

AjaxIE6

2019-10-09 16:18:36

缓存架构雪崩

2017-02-16 16:01:07

人工智能解决方案

2009-09-15 10:46:06

Visual Stud

2024-07-12 08:48:50

2021-01-31 10:51:37

缓存lock数据

2021-09-13 22:31:24

人工智能疫情技术

2024-10-31 11:52:05

缓存预热系统

2024-05-29 12:47:27

2024-11-08 13:47:35

中文乱码配置
点赞
收藏

51CTO技术栈公众号