使用Redis不得不考虑缓存的问题,处理不好的话会被黑客利用从而导致缓存击穿、缓存穿透、缓存雪崩等问题
场景如下图:
缓存击穿:一个已经存在的key,当访问量过大的时候,有部分请求可能会绕过缓存直接请求DB,从而导致DB请求量变高,压力增大
解决方案:可以在请求key之前,使用setNx加锁,设置一定的过期时间,过期之前的其他请求直接返回
(其他方案:1、使用互斥锁,2、使用布隆过滤器,3、使用异步构建缓存,参考:https://blog.csdn.net/hjm4702192/article/details/80518952)
缓存穿透:访问一个不存在的key,缓存就起不到任何作用,请求会直接请求DB,导致DB请求量剧增,从而挂掉
解决方案:使用布隆过滤器,存储存在的key,当不存在的key请求时,把不存在的key直接过滤掉,直接返回
缓存雪崩:大量的请求访问时,key都不存在,导致缓存都起不到作用,这个时候就会造成缓存雪崩
解决方案:存储key的时候额外加上一些随机的时间,避免导致大量的key在同一时间失效导致缓存雪崩