缓存预热
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统
缓存穿透
数据在redis和数据库中都不存在,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉
造成这样的原因,1可能上一次错误查询,2.是恶意请求,故意制造的查询
(1)缓存空数据 (2)缓存特殊字符串,比如&&
但是如果是恶意请求的时候,上面这个方案就不适用了,因为你会缓存N多个垃圾请求的数据
解决方案
接口层增加校验,非法参数直接拦截,如用户鉴权校验,id做基础校验,id<=0的直接拦截
从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
采用布隆过滤器(推荐),将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力
缓存雪崩
缓存雪崩就是 Redis 的大量热点数据同时过期(失效),因为设置了相同的过期时间,刚好这个时候 Redis 请求的并发量又很大,就会导致所有的请求落到数据库,造成数据库短时间内承受大量请求而崩掉
解决方案
缓存数据的过期时间设置随机随机数,使 key 在不同的时间过期
一般并发量不是特别多的时候,使用最多的解决方案是加互斥锁或者使用队列,针对同一个 key 只允许一个线程到数据库查询
热点数据预热,缓存定时预先更新,避免同时失效
高可用分片集群,主从+哨兵,避免全盘崩溃
缓存永不过期
事中:准备降级方案,比如限流降级,避免数据库被打死;Redis出现问题,不去数据库查询,而是直接返回默认值给用户
事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据
缓存击穿
缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库读取数据,造成数据库短时间内承受大量请求而崩掉
缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库;击穿是一个雪花的雪崩,雪崩是所有雪花的穿透