Cuckoo Filter는 Bloom Filter와 마찬가지로 특정 원소가 집합에 속하는지 여부를 검사하는데 사용되는 확률적 자료 구조입니다. (참고 : Redis의 Bloom Filter)
Cuckoo Filter도 Bloom Filter처럼 집합에 속하지 않는 원소를 집합에 속한다고 잘못 판단할 가능성은 존재하지만, 집합에 속한 원소를 집합에 속하지 않는다고 잘못 판단할 가능성은 없습니다.
Cuckoo Filter는 Bloom Filter와 달리 데이터 삭제가 가능합니다. Bloom Filter의 배열은 비트값만 표시했지만, Cuckoo Filter의 버킷은 값(정확히는 값 자체가 아니라 이를 단순화한 fingerprint) 자체를 저장합니다.
일반적으로 데이터가 존재하는지 확인하는 연산은 Cuckoo Filter가 더 빠릅니다. Cuckoo Filter는 단 2개의 해시 테이블만 확인하면 됩니다.
반면 데이터를 삽입하는 연산은 Bloom Filter가 더 빠릅니다. Cuckoo Filter는 충돌이 발생할 경우 재삽입 알고리즘을 수행해야 합니다.
Cuckoo Filter는 2개의 해시 함수와 2개의 해시 테이블을 사용합니다. Cuckoo Filter는 내가 들어가야 할 자리에 이미 어떤 값이 자리잡고 있다면 그 값을 밀어내는 방식으로 동작합니다.





사이클이 발생하면 재배치가 일어납니다. 재배치는 해시 함수를 변경하거나 해시 테이블의 크기를 키운 뒤 모든 데이터를 다시 처음부터 새롭게 테이블에 집어넣습니다.
Redis Stack과 도커로 Redis Stack을 실행하는 방법은 Redis의 Bloom Filter를 참고해 주세요.
// CF.RESERVE {key} {capacity} [BUCKETSIZE bucketSize] [MAXITERATIONS maxIterations] [EXPANSION expansion]
CF.RESERVE myCuckooFilter 1000
슬롯이라는 개념이 존재합니다.// CF.ADD <key> <value>
CF.ADD myCuckooFilter value1
// CF.EXISTS <key> <value>
CF.EXISTS myCuckooFilter value1
// CF.DEL <key> <value>
CF.DEL myCuckooFilter value1
// CF.COUNT <key> <value>
CF.COUNT myCuckooFilter value1