缓存穿透
缓存穿透是指是指缓存和数据库中都没有数据 ,而此时用户不断的发起请求 ,比如发起id=-1的数据 或者id特别大的不存在的数据,这时用户就很有可能是攻击者 攻击就会导致数据库的压力过大。
如何解决:
- 在接口层增加校验 校验用户的权限 id范围的范围校验 id<=0做一个判断拦截
- 从缓存中娶不到数据 在数据库中也没有渠道 这就就将key-value写一个特殊的值 key-0 这样就可以防止攻击者反复的用同一个id暴力攻击。
- 使用缓存预热 缓存预热就是将数据提前加入到缓存中 当数据发生改变是 再将数据更新。
缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据。这时由于用户的并发访问量特别大,同时缓存没读到数据又同时去数据库中获取数据,引起数据库压力瞬间暴增,造成压力过大。比如对于导航列表的查询缓存可以设置期限,在某一时刻 导航列表数据的缓存到期,缓存中的数据失效
解决方案:
- 设置高频热点数据永不过期
- 使用缓存预热
缓存雪崩
缓存雪崩是指缓存中大量数据同时过期而同时数据查询量过大引起的数据库压力过大甚至导致数据库服务器宕机 。和缓存击穿的区别:缓存击穿指的是并发查询同一条数据,缓存雪崩指的是不同数据大量过期 很多数据查不到而导致的数据库压力过大。
解决方案:
- 缓存中的数据的过期时间设置为随机以防止大量数据同时过期
- 设置热点数据永不过期
- 使用缓存预热