一、什么是缓存穿透?
缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。
二、分析
问题的关键是数据库没有的数据,缓存里面肯定也不会有,如果不进行处理,那么所有的请求都会到数据库,解决的思路应该在查数据库之前进行拦截。
三、解决方案
-
- 接口层增加校验,如用户鉴权校验,使用不容易猜到id生成规则及做基础校验,不符合的规则直接拦截;
-
- 缓存空对象,从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击;
-
- 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力(布隆过滤器并不能实现100%拦截)。