Redis的使用场景要根据业务来进行回答,其他方面主要分为缓存和分布式锁。
缓存穿透:
发生原因:缓存穿透是指在一个项目中来查询一个不存在的数据,这个时候在redis里面查不到这个数据,就会传给数据库DB来进行查询,但是同样也查询不到,这个时候也不会重新返回写入缓存中,这将导致每次有不存在的数据的时候都会交给DB去查询,DB的并发不是很高,容易让DB挂掉。一般缓存穿透的发生是因为遭到了攻击。
解决方案:有两种解决方案来应对缓存穿透。
1.缓存空数据:将不存在的数据在数据库中返回一个null值,然后再交给redis进行缓存,最后返回这个key的空值。
优点:简单方便 缺点:消耗内存,并可能导致数据不一致。
2.布隆过滤器:布隆过滤器主要用来检索一个元素是否在一个集合之中。底层主要是先去初始化一个比较大的数组,里面存放二进制的0。当一个key来进行了三次hash计算之后,根据下标找到数据,并且把0改成1,这样三次hash计算的三个数组的位置就可以表明一个key的存在。
优点:内存占用较少,没有多余的key。
缺点:实现复杂 存在误判
!!误判是不可避免的,但是我们可以在程序代码中设置误判率,大概不会超过5%,存在误判的好处是不用去增加数组的长度,不用增加负担。而5%的误判率也不至于高并发下压倒数据库。