本篇文章主要谈谈Redis中很容易出现的三大问题现象:缓存击穿、缓存穿透以及缓存雪崩。不过在介绍这三个问题现象之前,我们首先需要先来了解下Redis中key的过期淘汰机制。众所周知,Redis可以对存储在Redis中的缓存数据设置过期时间,比如我们获取的短信验证码一般十分钟过期,我们这时候就需要在验证码存进Redis时添加一个key的过期时间,但是这里有一个需要格外注意的问题就是:并非key过期时间到了就一定会被Redis给删除。那么Redis是如何做到对过期key进行删除呢?Redis中对于过期key的删除分为两种策略:定期删除和惰性删除。
但是如果仅仅使用定期删除 + 惰性删除机制还是会留下一个严重的隐患:如果定期删除留下了很多已经过期的key,而且用户长时间都没有使用过这些过期key,导致过期key无法被惰性删除,从而导致过期key一直堆积在内存里,最终造成Redis内存块被消耗殆尽。那这个问题如何解决呢?这个时候Redis内存淘汰机制应运而生了。Redis内存淘汰机制提供了6种数据淘汰策略:
一般情况下,推荐使用volatile-lru策略,对于配置信息等重要数据,不应该设置过期时间,这样Redis就永远不会淘汰这些重要数据。对于一般数据可以添加一个缓存时间,当数据失效则请求会从DB中获取并重新存入Redis中。
缓存击穿
讲完了Redis的key的过期淘汰机制,接下我们可以进入正题:为什么会出现缓存击穿、缓存穿透和缓存雪崩现象呢?首先我们来看下请求是如何取到数据的:当接收到用户请求,首先先尝试从Redis缓存中获取到数据,如果缓存中能取到数据则直接返回结果,当缓存中不存在数据时从DB获取数据,如果数据库成功取到数据,则更新Redis,然后返回数据,如果DB无数据,则返回空结果。那什么情况下会出现三大问题现象呢?我们先来看下缓存击穿的情况:
定义:高并发的情况下,某个热门key突然过期,导致大量请求在Redis未找到缓存数据,进而全部去访问DB请求数据,引起DB压力瞬间增大。
解决方案:缓存击穿的情况下一般不容易造成DB的宕机,只是会造成对DB的周期性压力。对缓存击穿的解决方案一般可以这样:Redis中的数据不设置过期时间,然后在缓存的对象上添加一个属性标识过期时间,每次获取到数据时,校验对象中的过期时间属性,如果数据即将过期,则异步发起一个线程主动更新缓存中的数据。但是这种方案可能会导致有些请求会拿到过期的值,就得看业务能否可以接受,如果要求数据必须是新数据,则最好的方案则为热点数据设置为永不过期,然后加一个互斥锁保证缓存的单线程写。
缓存穿透
定义:缓存穿透是指查询缓存和DB中都不存在的数据。比如通过id查询商品信息,id一般大于0,攻击者会故意传id为-1去查询,由于缓存是不命中则从DB中获取数据,这将会导致每次缓存都不命中数据导致每个请求都访问DB,造成缓存穿透。
解决方案:缓存穿透的解决方案可以分成两个部分:首先在API层增加基本校验:用户鉴权校验,id校验。比如用户鉴权失败或者id < 0的请求直接进行拦截。其次在缓存和DB都取不到数据的时候将将key-value存储成key-null存储到Redis, 过期时间可以存储的短点比如60S,防止短时间内攻击者不断发起请求导致数据库压力过大出现宕机。
缓存雪崩
定义:缓存中如果大量缓存在一段时间内集中过期了,这时候会发生大量的缓存击穿现象,所有的请求都落在了DB上,由于查询数据量巨大,引起DB压力过大甚至导致DB宕机。
解决方案:缓存雪崩一般没有完美解决的方法,但是我们可以尽量分析用户行为,尽量保证key的失效时间比较平均,防止同一时间出现大量缓存数据同时过期的现象,并且设置热点数据永不过期。同时如果为分布式环境下,使用分布式锁来保证缓存的单线程写,这样可以避免同一时间大量缓存失效导致请求全部落在DB上。而我觉得如果可以接受有些请求拿到过期值,最合理的方案实际上就是使用缓存击穿的方案:Redis中的数据不设置过期时间,然后在缓存的对象上添加一个属性标识过期时间,每次获取到数据时,校验对象中的过期时间属性,如果数据即将过期,则异步发起一个线程主动更新缓存中的数据。
这里我们介绍一下form元素与表单提交方面的知识。 form元素 form元素的DOM接口是...
为什么说“通常情况下1em16px” 用户的浏览器默认渲染的文字大小是“16px”换句...
有一说一我太菜了编码花了我十几个个小时才完成终究是我不配了。 今天花了点时间...
★文章内容学习来源拉勾教育大前端就业集训营 目录 上篇 本篇 一、背景颜色 back...
概述 本文将给大家介绍oracle各类文件损坏的现象和应对策略,请注意所有的恢复都...
手机中点击网页链接实现拨号或保存电话功能实现代码 通过网页拨打电话 复制代码 ...
一自我介绍 本科电气专业硕士机器人在读。之所以选择离开现阶段无比热门的电气行...
第一次遇到这个问题, 是大概两年前写代码高亮, 从当时的解决方案到现在一共有三...
真无线蓝牙耳机哪家的音质最好四款音质好蓝牙耳机 随着蓝牙耳机的普及越来越多的...
软件如果不能被电脑运行,那么它就是无用的。而在处理运行时性能的问题上,即使...