이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 6755|회답: 3

[출처] .NET/C#은 비트맵 기반 블룸 알고리즘을 구현하기 위해 Redis를 사용합니다

[링크 복사]
게시됨 2023. 1. 2. 오후 5:37:01 | | | |
요구사항: 최근에 Bilibili에서 Redis Bloom 알고리즘을 사용해 캐시 침투 문제를 해결하는 영상을 봤습니다. 간단히 말해, 데이터베이스에 접근하기 전에 논리적 판단 층을 추가하여 데이터가 존재하는지 판단하고, 존재한다면 데이터베이스에 접근하는 것입니다. 예를 들어, 웹사이트가 뉴스 시스템이라면, 기사의 URL은 자기 증가하는 주요 키 ID(URL 형식 example:/news-1.html)로 생성되며, 웹사이트는 수만 개의 기사와 캐시만 있을 수 있습니다.

원래:

뉴스 자원 요청 -> 캐시가 존재하는지 확인 -> 프레즌스 -> 캐시가 데이터를 반환합니다.
뉴스 자원 요청 -> 캐시 존재 여부 확인 -> 존재하지 않음 -> 데이터베이스 쿼리 -> 제시 -> 캐시 및 데이터 반환.
뉴스 자원 요청 -> 캐시 존재 여부를 확인 -> 존재하지 않음 -> 데이터베이스 쿼리 -> 존재하지 않음 -> 404 오류를 반환함.

바로 지금:

뉴스 자원 요청 -> 블룸의 알고리즘 -> 존재 -> 원래 논리를 따르세요.
뉴스 자원 요청 -> 블룸의 알고리즘 -> 존재하지 않음 -> 404 오류를 직접 반환합니다.

블룸필터

블룸필터 알고리즘은 빅데이터 스케줄링 알고리즘입니다. 데이터가 많은 집합에서는 객체가 집합에 없다는 것을 정확히 알 수 있다; 집합 내에서 객체를 판단해도 공간을 차지하지 않을 수 있습니다. 술래높은 정확도와 0 오차가 요구되는 상황에는 적합하지 않습니다。 부분적인 정확성을 희생함으로써 공간의 효율적 활용이 이루어집니다.

블룸의 알고리즘은 다음 방법을 기반으로 합니다.일정한 정확도를 희생하고 메모리 소모가 적은 필터링 알고리즘을 선택하는 것입니다이 기능은 대량의 데이터를 필터링, 중복 제거 및 기타 작업을 구현할 수 있습니다.

블룸 알고리즘은 추상적인 개념일 뿐이며 여러 방식으로 구현할 수 있고, 기사에서 Redis에서 비트맵을 사용하는 것은 단순한 구현일 뿐입니다.

참조:하이퍼링크 로그인이 보입니다.

비트맵 소개

비트맵은 비트맵으로, 실제로는 바이트 배열로 이진수로 표현됩니다.숫자는 0과 1 두 개뿐입니다, 비트맵은 각 이진 비트를 사용하여 요소에 대응하는 값을 저장하거나 표시하는 데 사용됩니다. 비트맵은 비트 단위로 저장되기 때문에 특정 데이터가 존재하는지 여부를 판단하는 데 주로 사용됩니다.

아래 그림에서 보듯이, 문자열은 컴퓨터에서 이진 형태로 저장됩니다.



Redis의 비트맵 데이터 타입

Redis가 제공하는 데이터 타입은 BitMap이며, 각 비트는 0과 1의 두 상태에 해당합니다. 내부 저장소는 여전히 String 타입이지만, Redis는 비트맵을 직접 조작하는 몇 가지 명령어를 제공하며, 비트 배열로 생각할 수 있고, 배열의 첨자가 오프셋입니다.

장점은 다음과 같습니다:낮은 메모리 오버헤드와 높은 효율성그리고 작전은 간단합니다.

공간 절약: 비트는 요소의 값이나 상태를 나타내는 데 사용되며, 여기서 키는 해당 요소의 값을 나타냅니다. 사실 8비트가 바이트를 구성할 수 있어 공간을 절약합니다.
고효율: setbit과 getbit의 시간 복잡도는 O(1)이며, 다른 비트의 효율성도 높습니다.

다음은 집합 컬렉션과 비트맵 저장소를 사용하는 예시입니다:

데이터 타입각 사용자 ID는 공간을 차지합니다저장해야 할 사용자 수모두 기억을 차지합니다
집합32비트는 4바이트입니다(userid가 정수를 사용한다고 가정할 때, 많은 웹사이트가 실제로 긴 정수를 사용합니다)50,000,00032비트 * 50,000,000 = 200 MB
비트맵1비트100,000,0001비트 * 100,000,000 = 12.5 MB


시간이 조금 늘어나고 있어

어느 날한 달1년
집합200M6G72G
비트맵12.5M375M4.5G


계산 결과, 시간이 길어질수록 기록해야 할 데이터의 양이 증가하고 대비가 더 뚜렷해지고, 비트맵이 설정된 공간보다 차지하는 공간이 적다는 사실이 밝혀졌습니다.

Redis는 비트맵 운영을 위한 다음 지침을 제공합니다:

명령설명이용 가능한 버전시간 복잡도
하이퍼링크 로그인이 보입니다.키에 저장된 문자열 값에 대해 지정된 오프셋 비트를 설정하거나 지우세요.>= 2.2.0O(1)
하이퍼링크 로그인이 보입니다.키에 저장된 문자열 값에 대해, 지정된 오프셋에 있는 비트를 얻습니다.>= 2.2.0O(1)
하이퍼링크 로그인이 보입니다.주어진 문자열에서 1로 설정된 비트 수를 세는 것입니다.>= 2.6.0O(N)
하이퍼링크 로그인이 보입니다.비트맵에서 첫 번째 값이 비트인 이진 비트의 위치를 반환합니다.>= 2.8.7O(N)
하이퍼링크 로그인이 보입니다.이진 비트를 포함하는 하나 이상의 문자열 키에 대한 비트 조작.>= 2.6.0O(N)
하이퍼링크 로그인이 보입니다.BITFIELD 명령어는 한 번의 통화에서 여러 비트레인지를 동시에 처리할 수 있습니다.>= 3.2.0O(1)


명령 문서:하이퍼링크 로그인이 보입니다.

이제 Redis의 비트맵 기능과 구문과 알고리즘을 간단히 이해하셨으니, Redis를 사용해 간단한 연산을 해보겠습니다.

SETBIT 문법:SETBIT 키 오프셋 값

기사 id:9, 10, 156을 1로 설정하면 명령어는 다음과 같습니다:

GETBIT 문법: GETBIT 키 오프셋

id: 10 또는 11이 존재하는지 확인하기 위한 명령은 다음과 같습니다:




.NET/C#은 Redis의 비트맵 타입을 조작합니다

우리는 redis에서 여러 비트맵 명령어와 이를 프로그래밍적으로 어떻게 작동시키는지 배웠습니다. 새로운 .NET 3.1 콘솔 프로젝트를 생성하고, StackExchange.Redis 패키지를 참조한 후 다음 명령을 사용하세요:

소스 코드는 다음과 같습니다:



Redis에는 다음과 같은 여러 비트맵 응용 시나리오가 있습니다:

  • 사용자가 특정 작업을 수행했는지 판단하는 간단한 블룸 필터로 사용할 수 있습니다.
  • 사용자 일일 활동, 월간 활동, 유지율 통계
  • 사용자 런칭 수에 대한 통계를 파악하세요
  • 사용자 온라인 존재감 및 인물 통계

(끝)




이전의:가상 배우: Dapr 대 Orleans
다음:알리바바 클라우드 SLB 부하 분산 503 오류 해결
 집주인| 게시됨 2023. 1. 2. 오후 5:41:56 |
게시됨 2023. 1. 2. 오후 8:42:47 |
저는 배웠고, 감사합니다. 그리고 지식을 얻었습니다
게시됨 2023. 1. 6. 오후 8:34:22 |
배우기 위해 배우세요
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com