如果我理解的有不对的地方,希望大家可以踊跃评论指出不对的地方,感谢!
讲一下我个人对redis缓存穿透的理解,其实感觉这个主题不应该直接叫Redis的缓存穿透,应该叫缓存穿透,只不过现在世面上用redis的比较多,我就叫这个名字了哈。
我理解的这个东东就是用户请求缓存没有查到数据,然后就去数据库查询,仍然没有查到数据,比如有1万个用户都来查询,都是先访问缓存,再访问数据库,这样对数据库会造成压力,所以叫缓存穿透,直接穿到了存储层!
那么怎么解决这个问题呢?
- 比较简单粗暴,如果查询存储层没有查到数据,在缓存中放置一个空的key,这样虽然阻止了缓存穿透,但是请求比较多的话,放置在缓存里的key也是比较占用空间的;
还有一个问题就是,在key失效的前一段时间数据在存储层又存在了,但是这时候用户查到的数据还是空,这段时间就发生了数据不一致的问题,这样对于要求数据强一致性的业务就不太可靠了。 - 还有一个比较高大上的解决方案就是布隆过滤器(redis4.0开始支持):
我的理解是大家可以把它理解为一个集合,就是一种数据结构也是可以存放数据的,只不过它存放的都是0和1,初始化一个布隆过滤器,里面存放的都是0,它会把你保存的数据,通过m个hash函数找到指定的位置,将m个位置的0都置为1,下次你来查询的时候,如果通过m个hash函数获得m个1,则表示这个数据可能存在,不保证100%存在,如果返回的m个数字当中有一个0,则表示该数据不存在;
我觉得布隆过滤器就是一个bitmap,但是我在网上看到大家都是把bitmap和布隆过滤器分开的,希望有大神可以解疑!