Redis逻辑 :先从缓存取,缓存有就直接返回,没有就查库,查到就存Redis没有就返回空。
缓存穿透
是针对数据库和缓存中都没有的数据。场景:当客户端发起查询时,缓存中没有就会去查库,库里也没有就会返回给客户端错误信息。这样是没问题 逻辑没毛病,但是存在一个漏洞 那就是无论什么样的key过来查我们都去接受他的请求这样就会被黑客抓住发起大量请求。并且Key都是我们系统中没有的,库里也查不到对应的值,这样的Key称之为非法key。那么当大量这样的请求过来时是不是会命中Redis然后都会打到DB上当DB瞬间接收到如此多的连接时DB就有可能撑不住了他就挂了。这就是存在的一个隐藏的漏洞,黑客或者恶意攻击者抓住这一点攻击你的系统使你的系统瘫痪。
实际开发中就要考虑这点,可以在系统层面加一层过滤,将系统认为非法的key进行一次拦截,直接返回给客户端错误信息。
缓存击穿
是针对缓存中没有但数据库有的数据。场景是当Key失效后假如瞬间突然涌入大量的请求,来请求同一个key这些请求不会命中Redis都会请求DB导致数据库压力过大,甚至扛不住,挂掉。
这个问题的解决方法是:
设置热点Key,自动检测热点eky,将热点key的过期时间加大或者设置为永不过期,或者设置为逻辑上永不过期。
2.加互斥锁 当发现没有命中Redis去查数据库的时候在执行官更新缓存的操作上加锁,谁拿到锁谁去更新,同时在拿到锁之后先从缓存再获取一次如果有就返回,没有就查库然后更新。
缓存雪崩
是指大量key同时失效对这些key的请求又会打到DB上同时导致数据库压力过大甚至挂掉。
这个问题解决方法:让key的失效时间分散开,可以在统一的失效时间上再加一个随机值,或者使用更高级的算法分散失效时间
热点key
针对热点数据,我们可以设置热点Key的过期时间很大或者在逻辑上永不过期
意思就是说假如我们设置热点数据过期时间为24小时,那么我们可以使用监听器去监听这些热点数据。当检测到它快要到期了异步起个线程去更新这个热点数据。可以达到逻辑上用不过期的效果。
另外 我们要有热点数据自动检测机制。即有个监控平台,来监控每个key某个时间段的请求次数,过期次数,查库次数,来分析这个key是不是热点数据,当达到某个阈值时将key升级为热点key然后走热点数据的逻辑。