Posts [Redis] HyperLogLog
Post
Cancel

[Redis] HyperLogLog

실시간 unique count는 어떻게 계산할까?

애플리케이션에서 자료구조를 사용해서 데이터를 저장하고, 같은 데이터가 들어오면 저장하지 않는 방법이 있다.
하지만 이 방법은 대용량 데이터를 다루는 애플리케이션에서는 적절하지 않다.
메모리 공간을 많이 차지해서 다소 무거울 수 있고, 더 중요한 비즈니스 로직을 처리하기 위한 리소스를 쓰기 때문이다.

그렇다면 더 효율적인 방식은 없을까?

Redis를 활용하면 조금 더 쉽고 가볍게 문제를 해결할 수 있다.
물론 Set과 같은 자료구조를 쓰는 방식은 아니다.
Redis에는 HyperLogLog 자료형이 있다.
이 자료형은 unique count를 세고, 메모리를 적게 차지하고 결과의 오차율도 낮다.

이어지는 내용에서 HyperLogLog의 개념과 명령어를 알아보자.


HyperLogLog?

  • Redis에 있는 자료형
  • key : value 형태로 데이터를 저장한다.
    • key는 고유한 값이다.
    • value는 unique count 값이다.
  • HyperLogLog는 특정 데이터를 저장하지 않고, unique count를 계산해서 저장한다.
  • 따라서 어떤 데이터가 저장되었는지 확인할 수 없다.


명령어

PFADD

  • 1개의 key와 n개의 value를 한번에 입력할 수 있다.
  • key에 value가 없으면 1을, 있으면 0을 반환한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# src/redis-cli PFADD {key} {value1} {value2} ..

% src/redis-cli PFADD woowacourse dani suri
(integer) 1
% src/redis-cli PFADD woowacourse dani
(integer) 0
% src/redis-cli PFADD woowacourse pomo 
(integer) 1
% src/redis-cli PFADD woowacourse mazzi
(integer) 1
% src/redis-cli PFADD woowacourse suri pomo mazzi
(integer) 0

% src/redis-cli PFADD backend dani better solong
(integer) 1

% src/redis-cli PFADD frontend sunny ella
(integer) 1

PFCOUNT

  • key에 몇 개의 value가 저장되었는지, 즉 unique count를 센다.
1
2
3
4
# src/redis-cli PFCOUNT {key}

% src/redis-cli PFCOUNT woowacourse
(integer) 4

PFMERGE

  • 2개 이상의 key를 1개의 key로 합친다.
  • 이때도 unique count를 구해서, 전체 value에서 중복되는 value는 1번만 더한다.
    • e.g. woowacourse와 backend에 각각 dani가 있어, 둘을 합칠 때 dani는 1번만 count됐다.
1
2
3
4
5
6
7
# src/redis-cli PFMERGE {key1} {key2} {key3} ..

% src/redis-cli PFMERGE woowacourse backend frontend
OK

% src/redis-cli PFCOUNT woowacourse
(integer) 8


References

This post is licensed under CC BY 4.0 by the author.