redis缓存穿透穿透解决方案-布隆过滤器
我们先来看一段代码
cache_key = "id:1"
cache_value = GetValueFromRedis(cache_key); //判断缓存是否有数据
if cache_value != nil{ //如果有 直接返回数据
return cache_value
}
db_value = GetValueFromDb(cache_key) // 从数据库中查询数据
if db_value == nil{
return db_value
}
expire_time = 300
SetRedisValue(cache_key, db_value, expire_time) //将数据库的结果更新到缓存中,并直接返回结果
return db_value
相信绝大多数同学都是这么处理请求的,这样用redis能够给mysql抵挡住大部分的请求。其实这样是存在一定的问题的
问题1
我在请求的时候,用id=-1来请求
id=-1这条记录在数据库中是不存在的,当然对应的redis中也是没有的。那么就需要去请求数据库然后把数据写入到redis中,这样就会造成没有必要的数据库请求,一两个请求无所谓,但是如果从-∞到-1 无限的高频率的请求,就会给线上造成很大的压力。
针对问题1的解决方案
我们可以通过程序来限制id的合法性,判断id<1的情况都直接在接口层面拦截,这个方式的确可以解决上面说的那种情况,但是咱们接下来往下看
问题2
比如现在数据库id的最大值为1000,我们用比1000大的数字去请求
这种情况原理和问题1是一样的,这次我们就没法通过参数判断