缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库
常见的解决办法:
缓存空对象:第一次请求发现redis和数据库中都不存在时,,可以设置请求数据为key,null为值,放置在缓存中.
但是会有一个问题,就是如果此类请求过多,会导致内存压力过大,解决办法:设置五分钟的过期时间,但是当我们后续对这个key赋值时,会导致短期的数据不一致问题.
优点:实现简单,维护方便.
缺点:额外的内存消耗,可能会导致数据短期的不一致问题
布隆过滤器:是在redis之前进行的操作,也就是说,请求发过来时,不先查看缓存,而是先查看布隆过滤器,如果布隆过滤器没有,直接拒绝,如果认为存在,才放行,但是数据不一定真的在redis或者数据库中存在
原理:是将数据库中的数据基于某一种哈希算法计算出他的哈希值,然后将哈希值转换为二进制位,将其存入到布隆过滤其中,让其做判断,只会拒绝一定不存在的数据
优点:内存占用较少,没有多余的key
缺点:实现复杂,存在误判的可能.
其他解决办法:
增强参数的复杂度,避免被猜测id规律;
做好数据的基础格式校验
加强用户权限校验,比如设置必须登录之后才能访问等等
做好热点参数的限流