搜索
首页数据库RedisRedis BloomFilter布隆过滤器如何实现

    Bloom Filter 概念

    一个名叫布隆的人在1970年提出了布隆过滤器(英文名:Bloom Filter)。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

    Bloom Filter 原理

    布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。

    Bloom Filter跟单哈希函数Bit-Map不同之处在于:Bloom Filter使用了k个哈希函数,每个字符串跟k个bit对应。从而降低了冲突的概率

    Redis BloomFilter布隆过滤器如何实现

    缓存穿透

    Redis BloomFilter布隆过滤器如何实现

    每次查询都会直接打到DB

    简而言之,言而简之就是我们先把我们数据库的数据都加载到我们的过滤器中,比如数据库的id现在有:1、2、3

    那就用id:1 为例子他在上图中经过三次hash之后,把三次原本值0的地方改为1

    下次数据进来查询的时候如果id的值是1,那么我就把1拿去三次hash 发现三次hash的值,跟上面的三个位置完全一样,那就能证明过滤器中有1的

    反之如果不一样就说明不存在了

    那应用的场景在哪里呢?一般我们都会用来防止缓存击穿

    简单来说就是你数据库的id都是1开始然后自增的,那我知道你接口是通过id查询的,我就拿负数去查询,这个时候,会发现缓存里面没这个数据,我又去数据库查也没有,一个请求这样,100个,1000个,10000个呢?你的DB基本上就扛不住了,如果在缓存里面加上这个,是不是就不存在了,你判断没这个数据就不去查了,直接return一个数据为空不就好了嘛。

    这玩意这么好使那有啥缺点么?有的,我们接着往下看

    Bloom Filter的缺点

    bloom filter之所以能做到在时间和空间上的效率比较高,是因为牺牲了判断的准确率、删除的便利性

    尽管容器可能不包含应查找的元素,但由于哈希操作,这些元素在 k 个哈希位置的值都为 1,所以可能会导致误判。通过建立一个白名单来存储可能会误判的元素,当Bloom Filter中存储的是黑名单时,可以降低误判率。

    删除困难。一个放入容器的元素映射到bit数组的k个位置上是1,删除的时候不能简单的直接置为0,可能会影响其他元素的判断。可以采用Counting Bloom Filter

    常见问题

    1、为何要使用多个哈希函数?

    如果只使用一个哈希函数,Hash本身就会经常发生冲突。例如长度100的数组,如果只使用一个哈希函数,添加一个元素后,添加第二个元素时冲突的概率为1%,添加第三个元素时冲突的概率为2%…但如果使用两个哈希函数,添加一个元素后,添加第二个元素时冲突的概率降为万分之4(四种可能的冲突情况,情况总数100x100)

    go语言实现

    package main
    import (
    	"fmt"
    	"github.com/bits-and-blooms/bitset"
    )
    //设置哈希数组默认大小为16
    const DefaultSize = 16
    //设置种子,保证不同哈希函数有不同的计算方式
    var seeds = []uint{7, 11, 13, 31, 37, 61}
    //布隆过滤器结构,包括二进制数组和多个哈希函数
    type BloomFilter struct {
    	//使用第三方库
    	set *bitset.BitSet
    	//指定长度为6
    	hashFuncs [6]func(seed uint, value string) uint
    }
    //构造一个布隆过滤器,包括数组和哈希函数的初始化
    func NewBloomFilter() *BloomFilter {
    	bf := new(BloomFilter)
    	bf.set = bitset.New(DefaultSize)
    
    	for i := 0; i < len(bf.hashFuncs); i++ {
    		bf.hashFuncs[i] = createHash()
    	}
    	return bf
    }
    //构造6个哈希函数,每个哈希函数有参数seed保证计算方式的不同
    func createHash() func(seed uint, value string) uint {
    	return func(seed uint, value string) uint {
    		var result uint = 0
    		for i := 0; i < len(value); i++ {
    			result = result*seed + uint(value[i])
    		}
    		//length = 2^n 时,X % length = X & (length - 1)
    		return result & (DefaultSize - 1)
    	}
    }
    //添加元素
    func (b *BloomFilter) add(value string) {
    	for i, f := range b.hashFuncs {
    		//将哈希函数计算结果对应的数组位置1
    		b.set.Set(f(seeds[i], value))
    	}
    }
    //判断元素是否存在
    func (b *BloomFilter) contains(value string) bool {
    	//调用每个哈希函数,并且判断数组对应位是否为1
    	//如果不为1,直接返回false,表明一定不存在
    	for i, f := range b.hashFuncs {
    		//result = result && b.set.Test(f(seeds[i], value))
    		if !b.set.Test(f(seeds[i], value)) {
    			return false
    		}
    	}
    	return true
    }
    func main() {
    	filter := NewBloomFilter()
    	filter.add("asd")
    	fmt.Println(filter.contains("asd"))
    	fmt.Println(filter.contains("2222"))
    	fmt.Println(filter.contains("155343"))
    }

    输出结果如下:

    true
    false
    false

    以上是Redis BloomFilter布隆过滤器如何实现的详细内容。更多信息请关注PHP中文网其他相关文章!

    声明
    本文转载于:亿速云。如有侵权,请联系admin@php.cn删除
    我什么时候应该使用redis代替传统数据库?我什么时候应该使用redis代替传统数据库?May 13, 2025 pm 04:01 PM

    用户edisinsteadofatraditionaldatabasewhenyourapplicationrequirespeedandreal-timedataprocorsing,sueAsAsforCaching,sessionmanagement,orrereal-timeanalytics.redisexcelsin:1)caching,缓存,减少载荷载量

    REDIS:超越SQL- NOSQL的观点REDIS:超越SQL- NOSQL的观点May 08, 2025 am 12:25 AM

    Redis超越SQL数据库的原因在于其高性能和灵活性。1)Redis通过内存存储实现极快的读写速度。2)它支持多种数据结构,如列表和集合,适用于复杂数据处理。3)单线程模型简化开发,但高并发时可能成瓶颈。

    REDIS:与传统数据库服务器的比较REDIS:与传统数据库服务器的比较May 07, 2025 am 12:09 AM

    Redis在高并发和低延迟场景下优于传统数据库,但不适合复杂查询和事务处理。1.Redis使用内存存储,读写速度快,适合高并发和低延迟需求。2.传统数据库基于磁盘,支持复杂查询和事务处理,数据一致性和持久性强。3.Redis适用于作为传统数据库的补充或替代,但需根据具体业务需求选择。

    REDIS:功能强大的内存数据存储的简介REDIS:功能强大的内存数据存储的简介May 06, 2025 am 12:08 AM

    Redisisahigh-performancein-memorydatastructurestorethatexcelsinspeedandversatility.1)Itsupportsvariousdatastructureslikestrings,lists,andsets.2)Redisisanin-memorydatabasewithpersistenceoptions,ensuringfastperformanceanddatasafety.3)Itoffersatomicoper

    Redis主要是数据库吗?Redis主要是数据库吗?May 05, 2025 am 12:07 AM

    Redis主要是一个数据库,但它不仅仅是数据库。1.作为数据库,Redis支持持久化,适合高性能需求。2.作为缓存,Redis提升应用响应速度。3.作为消息代理,Redis支持发布-订阅模式,适用于实时通信。

    REDIS:数据库,服务器还是其他?REDIS:数据库,服务器还是其他?May 04, 2025 am 12:08 AM

    redisisamultifaceTedToolThatServesAsAdatabase,server和more.itfunctionsasanin-memorydatastrustore,supportsvariousDataStructures,and CanbeusedAsacache,MessageBroker,sessionStorage,sessionStorage,sessionstorage,andford forderibedibedlocking。

    REDIS:揭示其目的和关键应用程序REDIS:揭示其目的和关键应用程序May 03, 2025 am 12:11 AM

    Redisisanopen-Source,内存内部的库雷斯塔氏菌,卡赫和梅斯吉级,excellingInsPeedAndVersatory.itiswidelysusedforcaching,Real-Timeanalytics,Session Management,Session Managements,and sessighterboarderboarderboardobboardotoitsssupportfortfortfortfortfortfortfortfortorvortfortfortfortfortfortforvortfortforvortforvortforvortfortforvortforvortforvortforvortdatastherctuct anddatataCcessandcessanddataaCces

    REDIS:键值数据存储的指南REDIS:键值数据存储的指南May 02, 2025 am 12:10 AM

    Redis是一个开源的内存数据结构存储,用作数据库、缓存和消息代理,适合需要快速响应和高并发的场景。1.Redis使用内存存储数据,提供微秒级的读写速度。2.它支持多种数据结构,如字符串、列表、集合等。3.Redis通过RDB和AOF机制实现数据持久化。4.使用单线程模型和多路复用技术高效处理请求。5.性能优化策略包括LRU算法和集群模式。

    See all articles

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    Video Face Swap

    Video Face Swap

    使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

    热门文章

    热工具

    WebStorm Mac版

    WebStorm Mac版

    好用的JavaScript开发工具

    EditPlus 中文破解版

    EditPlus 中文破解版

    体积小,语法高亮,不支持代码提示功能

    SecLists

    SecLists

    SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    Atom编辑器mac版下载

    Atom编辑器mac版下载

    最流行的的开源编辑器