블룸 필터는 마법 같은 데이터 구조입니다. 이 글에서는 블룸 필터에 대한 심층적인 이해를 제공하고 Redis에서 블룸 필터를 사용하는 방법을 소개합니다.
블룸 필터는 마법의 데이터 구조이며, 요소가 집합에 있는지 확인하는 데 사용할 수 있습니다 . 매우 일반적으로 사용되는 기능은 중복 항목 제거입니다. 크롤러의 공통 요구사항: 수천 개의 대상 웹사이트 URL이 있습니다. 크롤러가 특정 URL을 선호하는지 확인하는 방법은 무엇입니까? 간단히 말하면 크롤러가 URL을 수집할 때마다 새 URL이 올 때마다 데이터베이스로 이동하여 방문 여부를 쿼리할 수 있습니다. [관련 권장 사항: Redis 동영상 튜토리얼]
select id from table where url = 'https://jaychen.cc'
그러나 크롤러가 점점 더 많은 URL을 크롤링함에 따라 각 요청 전에 데이터베이스에 한 번 액세스해야 하며 이러한 문자열에 대한 SQL 쿼리 효율성은 높지 않습니다. 데이터베이스 외에도 Redis의 세트 구조를 사용하면 이 요구 사항을 충족할 수 있으며 성능은 데이터베이스보다 좋습니다. 그러나 Redis에도 문제가 있습니다. 메모리를 너무 많이 소비한다는 것입니다. 이때 Bloom 필터는 매우 수평적으로 나타납니다. 이 질문에 답해 드리겠습니다.
데이터베이스 및 Redis와 비교할 때 Bloom 필터를 사용하면 성능 및 메모리 사용 문제를 효과적으로 피할 수 있습니다.
블룸 필터는 기본적으로 비트 배열입니다. 비트 배열은 배열의 각 요소가 1비트만 차지한다는 의미입니다. 각 요소는 0 또는 1만 될 수 있습니다. 이러한 방식으로 10000개 요소의 비트 배열을 적용하면 10000/8 = 1250B의 공간만 차지합니다. Bloom 필터에는 비트 배열 외에도 K개의 해시 함수가 있습니다. 블룸 필터에 요소가 추가되면 다음 작업이 수행됩니다.
예를 들어 Bloom 필터에 f1, f2, f3 및 비트 배열 arr
의 3가지 해시 함수가 있다고 가정합니다. 이제 Bloom 필터에 https://jaychen.cc
를 삽입해야 합니다. arr
。现在要把 https://jaychen.cc
插入布隆过滤器中:
当要判断一个值是否在布隆过滤器中,对元素再次进行哈希计算,得到值之后判断位数组中的每个元素是否都为 1,如果值都为 1,那么说明这个值在布隆过滤器中,如果存在一个值不为 1,说明该元素不在布隆过滤器中。
看不懂文字看下面的灵魂画手的图解释
看了上面的说明,必然会提出一个问题:当插入的元素原来越多,位数组中被置为 1 的位置就越多,当一个不在布隆过滤器中的元素,经过哈希计算之后,得到的值在位数组中查询,有可能这些位置也都被置为 1。这样一个不存在布隆过滤器中的也有可能被误判成在布隆过滤器中。但是如果布隆过滤器判断说一个元素不在布隆过滤器中,那么这个值就一定不在布隆过滤器中。简单来说:
这个布隆过滤器的缺陷放到上面爬虫的需求中,可能存在某些没有访问过的 URL 可能会被误判为访问过,但是如果是访问过的 URL 一定不会被误判为没访问过。
redis 在 4.0 的版本中加入了 module 功能,布隆过滤器可以通过 module 的形式添加到 redis 中,所以使用 redis 4.0 以上的版本可以通过加载 module 来使用 redis 中的布隆过滤器。但是这不是最简单的方式,使用 docker 可以直接在 redis 中体验布隆过滤器。
> docker run -d -p 6379:6379 --name bloomfilter redislabs/rebloom > docker exec -it bloomfilter redis-cli
redis 布隆过滤器主要就两个命令:
bf.add
添加元素到布隆过滤器中:bf.add urls https://jaychen.cc
。bf.exists
判断某个元素是否在过滤器中:bf.exists urls https://jaychen.cc
bf.reserve urls 0.01 100🎜redis Bloom 필터에는 주로 두 가지 명령이 있습니다: 🎜🎜🎜
bf.add
Bloom 필터에 요소를 추가합니다: bf.add urls https://jaychen.cc
. 🎜🎜bf.exists
요소가 필터에 있는지 확인합니다: bf.exists urls https://jaychen.cc
. 🎜🎜🎜위에서 언급했듯이 Bloom 필터에는 잘못된 판단이 있습니다. Redis에는 Bloom 필터의 정확도를 결정하는 두 가지 값이 있습니다. 🎜error_rate
:允许布隆过滤器的错误率,这个值越低过滤器的位数组的大小越大,占用空间也就越大。initial_size
:布隆过滤器可以储存的元素个数,当实际存储的元素个数超过这个值之后,过滤器的准确率会下降。redis 中有一个命令可以来设置这两个值:
bf.reserve urls 0.01 100
三个参数的含义:
error_rate
的值。initial_size
的值。使用这个命令要注意一点:执行这个命令之前过滤器的名字应该不存在,如果执行之前就存在会报错:(error) ERR item exists
更多编程相关知识,请访问:编程入门!!
위 내용은 블룸 필터란 무엇입니까? Redis에서는 어떻게 사용하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!