>데이터 베이스 >Redis >블룸 필터란 무엇입니까? Redis에서는 어떻게 사용하나요?

블룸 필터란 무엇입니까? Redis에서는 어떻게 사용하나요?

青灯夜游
青灯夜游앞으로
2021-06-24 19:10:423945검색

블룸 필터는 마법 같은 데이터 구조입니다. 이 글에서는 블룸 필터에 대한 심층적인 이해를 제공하고 Redis에서 블룸 필터를 사용하는 방법을 소개합니다.

블룸 필터란 무엇입니까? 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개의 해시 함수가 있습니다. 블룸 필터에 요소가 추가되면 다음 작업이 수행됩니다.

  • K 해시 함수를 사용하여 요소 값에 대해 K 계산을 수행하여 K 해시 값을 얻습니다.
  • 얻은 해시 값에 따라 비트 배열에서 해당 첨자 값을 1로 설정합니다.

예를 들어 Bloom 필터에 f1, f2, f3 및 비트 배열 arr의 3가지 해시 함수가 있다고 가정합니다. 이제 Bloom 필터에 https://jaychen.cc를 삽입해야 합니다. arr。现在要把 https://jaychen.cc 插入布隆过滤器中:

  • 对值进行三次哈希计算,得到三个值 n1, n2, n3。
  • 把位数组中三个元素 arr[n1], arr[n2], arr[3] 置为 1。

当要判断一个值是否在布隆过滤器中,对元素再次进行哈希计算,得到值之后判断位数组中的每个元素是否都为 1,如果值都为 1,那么说明这个值在布隆过滤器中,如果存在一个值不为 1,说明该元素不在布隆过滤器中。

看不懂文字看下面的灵魂画手的图解释

블룸 필터란 무엇입니까? Redis에서는 어떻게 사용하나요?

看了上面的说明,必然会提出一个问题:当插入的元素原来越多,位数组中被置为 1 的位置就越多,当一个不在布隆过滤器中的元素,经过哈希计算之后,得到的值在位数组中查询,有可能这些位置也都被置为 1。这样一个不存在布隆过滤器中的也有可能被误判成在布隆过滤器中。但是如果布隆过滤器判断说一个元素不在布隆过滤器中,那么这个值就一定不在布隆过滤器中。简单来说:

  • 布隆过滤器说某个元素在,可能会被误判。
  • 布隆过滤器说某个元素不在,那么一定不在。

这个布隆过滤器的缺陷放到上面爬虫的需求中,可能存在某些没有访问过的 URL 可能会被误判为访问过,但是如果是访问过的 URL 一定不会被误判为没访问过。

Redis 中的布隆过滤器

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
값을 세 번 해시하여 n1, n2, n3 세 가지 값을 얻습니다.

비트 배열의 세 요소 arr[n1], arr[n2], arr[3]을 1로 설정합니다. 🎜🎜🎜블룸 필터에 값이 있는지 확인하려면 해당 요소에 대해 다시 해시 계산을 수행합니다. 값을 가져온 후 비트 배열의 각 요소가 1인지 확인합니다. 값이 모두 1인 경우 , 이 값을 표시합니다. Bloom 필터에서 1이 아닌 값이 있으면 해당 요소가 Bloom 필터에 없음을 의미합니다. 🎜🎜🎜글이 이해가 안 되시면 아래 소울페인터 사진 설명을 봐주세요🎜🎜🎜블룸 필터란 무엇입니까? Redis에서는 어떻게 사용하나요?🎜🎜위의 설명을 읽고 나면 필연적으로 질문이 생길 것입니다. 더 많은 요소가 삽입될수록 비트 배열의 더 많은 위치가 설정됩니다. Bloom 필터에 포함되지 않은 요소의 경우 해시 계산 후 얻은 값을 비트 배열에서 조회하며 이러한 위치도 1로 설정될 수 있습니다. 이와 같이 Bloom 필터에 존재하지 않는 객체가 Bloom 필터에 있는 것으로 오인될 수도 있습니다. 그러나 Bloom 필터에서 요소가 Bloom 필터에 없다고 판단하는 경우 이 값은 Bloom 필터에 있어서는 안 됩니다. 간단히 말하면: 🎜🎜🎜블룸 필터에 특정 요소가 있다고 표시되면 잘못 판단했을 수 있습니다. 🎜🎜블룸 필터에 요소가 없다고 표시되면 해당 요소는 거기에 없어야 합니다. 🎜🎜🎜이 Bloom 필터의 결함은 위의 크롤러 요구 사항에 포함되어 있습니다. 방문하지 않은 URL이 방문한 것으로 오인될 수 있지만 방문한 URL인 경우에는 방문한 것으로 오인되지 않습니다. 방문하지 않았습니다. 🎜

🎜Redis의 Bloom 필터🎜🎜🎜redis는 버전 4.0에서 모듈 기능을 추가했습니다. Bloom 필터는 모듈 형태로 Redis에 추가할 수 있으므로 Redis 4.0 이상을 사용하면 module🎜을 로드하여 Redis에서 블룸 필터를 사용할 수 있습니다. 그러나 이는 Docker를 사용하여 Redis에서 직접 블룸 필터를 경험할 수 있는 가장 간단한 방법은 아닙니다. 🎜
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제