缓存问题解决方案&批量查询优化
1 缓存问题解决方案
1.1 缓存穿透
缓存没有,数据库也没有,业务系统访问压根就不存在的数据,导致每次访问都将压力挂到了数据库服务器上导致服务崩溃,一般来说都是恶意访问导致
解决方案:
1.缓存空数据
第一,空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间(如果是攻击,问题更严重),比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。
第二,缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响。例如过期时间设置为 5 分钟,如果此时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象。
2.BloomFilter(布隆过滤器):在缓存之前再加一道屏障,里面存储目前redis数据库中存在的所有key。
在讲布隆过滤器之前我们思考下:
有些同学可能会在想,我使用集合行不行呢:比如在海量元素中(例如 10 亿无序、不定长、不重复)快速 判断一个元素是否存在?好,我们最简单的想法就是把这么多数据放到数据结构里去,比如List、Map、Tree,一搜不就出来了吗,比如map.get(),我们假设一个元素1个字节的字段,10亿的数据大概需要900G的内存空间,这个对于普通的服务器来说是承受不了的,当然面试官也不希望听到你这个答案,因为太笨了吧,我们肯定是要用一种好的方法,巧妙的方法来解决,这里引入一种节省空间的数据结构 —位