数据结构
Redis无论什么数据类型,存储的时候都是以键值对key-value形势存储,并且所有的key都是String类型,本文讨论的数据类型是value的数据类型。
布隆过滤器
概述:布隆过滤器(Bloom Filter)是 1970 年由布隆提出的,Redis 4.0版本已插件的形式引入到Redis中,布隆过滤器是一种占用空间非常小的概率数据结构,效率高,有一定的误判率,而且无法删除元素,主要用于去重场景。
布隆过滤器常用命令:
命令 | 描述 |
---|---|
bf.add key value | 向布隆过滤器key中添加value |
bf.madd key value1 value2 … | 向布隆过滤器key中添加多个value(支持批量操作) |
bf.exists key value | 判断布隆过滤器key中是否存在value,value一定不存在返回0,可能存在返回1 |
bf.mexists key value1 value2 … | 判断布隆过滤器key中是否存在value1 value2 (支持批量操作),value一定不存在返回0,可能存在返回1 |
bf.scandump key value | 对布隆顾虑器key进行持久化操作 |
布隆过滤器的原理?
- 布隆过滤器(Bloom Filter)由二进制向量(即位数组)和一系列随机映射函数(即哈希函数)两部分组成,其空间占用非常小。
- 布隆过滤器(Bloom Filter)使用exists()方法来判断某个元素是否存在,布隆过滤器判断某个值不存在,那么这个值就一定不存在,当其判断某个值存在时候,这个值不一定存在,但是有一定的误判率。
- 布隆过滤器(Bloom Filter)判断某个值是否存在的时候,会对这个值进行hash计算,然后找到在位数组中的位置(可能是多个位置),若都为1则表示这个值可能存在,若有一个为0,则说明值不存在。
布隆过滤器的工作流程:
- 往布隆过滤器中添加值的时候,先使用布隆过滤器的的hash函数对值进行计算,得到对应的hash值,找到对应的位数组位置,将只设置为1。
- 判断一个值是否存在于布隆过滤器的时候,同样先对值进行相同的hash计算,得到对应的hash值,找到对应的位数组位置,如果都为1,则表示只存在于布隆过器中,否则就不在。
布隆过滤器的优点:
- 空间占用小,不记录原数据,只标记是否存在。
- 支持海量数据下的不精准判断元素是否存在,存在误判。
布隆过滤器的缺点:
- 存在误判,不适合准确度要求高的场景。
- 只能增加不可删除,存在误判。
- 只能去重判断,不支持计算,对于需要去重计数的场景不友好。
布隆过滤器的应用场景:
- 防止缓存穿透。
- 黑名单校验,防止被攻击。
- 判断用户是否访问过,防止用户看到重复的内容。
- 统计在线人数。
如有不正确的地方请各位指出纠正。