효율적인 캐시 설계를 위한 Go 언어의 Bloom Filter 구현
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
데이터 분석, DevOps
대상자
캐시 시스템 설계자, 데이터베이스 최적화 담당자, Go 언어 개발자
핵심 요약
- Bloom Filter는 캐시 미스 시 데이터베이스에 대한 불필요한 요청을 줄이는 데 사용됨.
- Redis와 MySQL과 같은 캐시/데이터베이스 계층에서 Bloom Filter를 통해 false positive rate를 조절하여 데이터베이스 부하를 30~40% 감소시킬 수 있음.
- Go 언어로 구현된 BloomFilter struct는
NewBloomFilter
생성자와MightContain
메서드를 통해 O(1) 시간 복잡도로 캐시 존재 여부를 확인.
섹션별 세부 요약
1. 캐시 시스템의 문제점
- 캐시 미스 시 데이터베이스에 대한 반복적 "not found" 요청이 발생하여 성능 저하.
- 예시: ID=99999999 요청 시 캐시와 데이터베이스 모두에서 "not found" 응답.
2. Bloom Filter의 원리
- 다중 해시 함수로 bit array에 데이터를 매핑.
- 비트 값이 0인 경우 데이터가 확실히 존재하지 않음.
- 비트 값이 모두 1인 경우 데이터가 존재할 수 있음 (false positive 가능성 있음).
3. Bloom Filter의 장단점
- 장점:
- 메모리 절약: 해시 테이블 대비 1/1000~1/10000 수준의 메모리 사용.
- false positive rate 조절 가능 (예: 1%로 설정).
- 단점:
- 데이터 삭제 불가능 (대규모 스트림 데이터에 적합).
- false positive 발생 가능성 (해시 수(k) 조정으로 감소).
4. Go 구현 예시
- BloomFilter struct 정의:
```go
type BloomFilter struct {
m uint64 // bit array 크기
k uint64 // 해시 함수 수
bits []byte // bit array
}
```
- NewBloomFilter 생성자:
```go
func NewBloomFilter(expectedN uint64, falsePositiveRate float64) *BloomFilter
```
- MightContain 메서드:
```go
func (bf *BloomFilter) MightContain(data []byte) bool
```
- FNV-1a 해시 알고리즘 사용:
```go
h1 := fnv.New64()
h2 := fnv.New64a()
```
5. 실제 적용 사례
- 1000개 데이터에 대해 false positive rate 1%로 Bloom Filter 생성.
```go
bf := NewBloomFilter(uint64(1000), 0.01)
```
- "apple" 추가 후
MightContain("apple")
→true
- "grape" 추가되지 않아
MightContain("grape")
→false
결론
- Bloom Filter를 통해 캐시 미스 시 데이터베이스 요청을 50% 이상 감소시킬 수 있음.
- Go 언어로 구현된 Bloom Filter는 O(1) 시간 복잡도로 캐시/데이터베이스 최적화에 효과적.
- false positive rate와 bit array 크기(m), 해시 수(k)를 조절해 성능/메모리 균형 달성.