开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
redis 牛不牛
- 我们都知道
redis很快的,主要原因是因为他的操作基于内存。因为他的快,所以正常我们都把他当做缓存来使用。 - 但是你如果吧
mysql放到内存里处理却并达不到reids的效果。为什么呢?因为redis快除了内存的原因之外还得易于他的数据结构。 - 他的底层数据结构一共有 6种 , 其他他的底层还有其他的原子数据结构,但是往往我们使用的不多,或者已经被上述提到的6中结构涵盖了,所以其他的结构往往不关注太多。
- 还有一个特点是 他的单线程。你不要以外多线程就一定比单线程快。单线程至少避免的多线程的切换的耗时了,所以综上总总才造就了 redis 飞快的特性。
布隆过滤器
- 但是今天我想说的是 布隆过滤器。 本质上呢他也是一种数据结构。只不过是结合了数据的概率论的一种数据结构。他的特点是新增和查询效率高,对,你没听错,兼顾了插入和查询效率并存的局面。但是他的查询并不是常规的那种查询,他的查询时用来判断东西是否存在,确切的说是告诉你东西是否不存在。
- 在 java 中或者 redis中我们判断某个元素是否存在 一定使用的是类似 Map 结构来进行存储,然后判断对应的Key 是否存在于对应的数据结构中,存在返回真否则返回假。
- 但是这就存在一个问题,假如我们存储了数据在Map 中,当我们需要判断的时候数据量特别大的情况下就无疑会造成数据存储压力。而布隆过滤器就是为了解决这个问题的。
缺点
- 上面我们提到 布隆过滤器插入和查询效率是非常高的。但是很遗憾的是他不支持删除。这个也很好理解,因为布隆过滤器实际就是将值转成Hash 进行存储,既然是Hash 就容易发生 Hash冲突,发生冲突了布隆过滤器选择的策略是覆盖,既然是覆盖你就没法删除,因为你无法确定当前的Hash槽内是否仅仅只有你一家。
总结
- 常规的结构肯定无法做到快速定位,既然能够实现快速判断不存在就肯定存在一定的局限性, 下文我们接着介绍他的详细原理