一.前言
在日常开发中,都是使用数据库来进行数据的存储,如果涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。
二.缓存雪崩
1.什么是缓存雪崩
缓存雪崩是指当缓存中有大量的key在同一时刻过期,或者Redis直接宕机了,导致大量的查询请求全部到达数据库,造成数据库查询压力骤增,甚至直接挂掉。
2.如何解决缓存雪崩
让key的失效时间随机,使它们的失效点尽可能均匀分布。
例如这里我们使用了随机事件,控制了key的失效时间在30-35分钟之间
如何解决redis突然宕机
可以在docker中的redis主从配置中,搭建哨兵机制,当主宕机的时候,哨兵检测到后补上,让从变为主
三.缓存击穿
1.什么是缓存击穿
缓存击穿是指当缓存中某个热点数据过期了,大量的数据请求击穿了某个key,在该热点数据重新载入缓存之前,有大量的查询请求穿过缓存,直接查询数据库。这种情况会导致数据库压力瞬间骤增,造成大量请求阻塞,甚至直接挂掉。
2.如何解决缓存击穿
设置key永不过期。或者在 redis 高峰访问之前,把一些热门数据提前存入到redis 里面,加大这些热门数据 key 的时长,例如某些实时热点或者商品抢购时,我们可以提前把热门数据存入redis中,防止缓存击穿,实时监控调整该key的数据情况和失效时间。等到热点过去之后在对key进行修改。
四.缓存穿透
1.什么是缓存穿透
缓存穿透是指查询一个缓存中和数据库中都不存在的数据,导致每次查询这条数据都会透过缓存,直接查库,最后返回空。当用户使用这条不存在的数据频繁的发起查询请求的时候,对数据库造成的压力就非常大,甚至可能造成数据库的崩溃。
2.如何解决缓存穿透
方法一:缓存空对象,当redis中查不到该数据时,当数据库中查不到数据的时候,缓存一个空对象,然后给这个空对象的缓存设置一个过期时间,这样下次再查询该数据的时候,就可以直接从缓存中拿到,从而达到了减小数据库压力的目的。
方法二:布隆过滤(Bloom Filter)
3.布隆过滤器
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。
将所有可能存在的数据哈希到一个足够大的 bitmaps 中,当用户使用缓存和数据库中不存在的数据发起查询时,会先经过布隆过滤器,一个一定不存在的数据会被这个bitmaps 拦截掉,从而避免了对底层存储系统的查询压力。但是如果布隆过滤器判定该数据存在后,还需要再在缓存中进行判断,布隆过滤器会有一定的误算率,随着存入的元素数量增加,误算率随之增加。常见的补救办法是建立一个小的白名单。
使用方法如下: