缓存雪崩
什么是缓存雪崩
大量数据在同一时间过期(或者redis崩了),导致这一时间段里,很多数据都在redis中获取不到,所有的查询都走数据库;
如何解决缓存雪崩
不要把大量的数据放到同一时间过期,在原有的过期时间上,再加一个短时间的随机过期时间;
项目中遇到的问题
本人在做账号权限点缓存的时候,会把用户的账号作为key,权限作为value进行存储;过期时间是8小时;这样就会有一个问题,每天早上的时候所有用户的权限点缓存都会失效,这样导致每天早上服务器的压力都会很大;
解决方案: 最后是加了一种缓存方式,每个人都会绑定角色,然后角色绑定的权限点;一个系统人员的角色数量是不会很多的,以角色作为key进行权限点缓存(不会失效,角色变更权限点的时候会更新),这样虽然早上的时候,账号的权限的缓存会失效,但是他在重新生成权限点的时候,还是走的redis;
缓存击穿
什么是缓存击穿
对于被高频访问的key而言,在改key失效的之后到该key的值被重新插入redis之前,如果存在大量的请求,那么所有的访问都会走数据库,这时候就会产生缓存击穿;
如何解决缓存击穿
- 对于高频key,我们可以采取不设置过期时间的方式,该key永久在redis中;就不会有缓存击穿的场景;
- 使用互斥锁
使用互斥锁解决缓存击穿
- 设置redis过期时间的情况
这样会有一个问题,就是线程在获取不到锁的情况下会一直等待,会影响系统性能; - 不设置redis过期时间(永久生效),在业务中冗余过期时间字段,在代码中判断其是否过期
这样做的一个好处是不会阻塞线程,用逻辑判断是否过期,过期了启动子线程去更新redis;
缓存穿透
什么是缓存穿透
大量的请求进入,都没有命中redis中的key(请求的key都是redis中没有的);
什么情况下会出现这种情况呢?
- 恶意攻击
- 就是没有数据,key对应的数据就是null
怎么处理缓存穿透
- 缓存空值或缺省值
- 使用布隆过滤器
使用布隆过滤器要注意的点是:
- 每次都需要先把所有的key加载到布隆过滤器中,每次新保存rediskey都需要往布隆过滤器中塞值;
- 布隆过滤器只能添加数据,不能删除数据,时间长了会导致误判率会很高;因此每过一段时间都要重新初始化一次布隆过滤器;
总结
问题 | 原因 | 解决方法 |
---|---|---|
缓存雪崩 | 大量数据过期或Redis服务器宕机 | 1. 随机过期时间 2. 主从+哨兵的集群 |
缓存击穿 | 热点数据过期 | 1. 不设置过期时间 2. 加互斥锁 3. 冗余逻辑过期时间 |
缓存穿透 | 请求数据库和Redis都没有的数据 | 1. 缓存空值或缺省值 2. 布隆过滤器 |