
true/false로 표현할 수 있기 때문에 Redis의 자료구조 중에서 Bitmap을 활용한다. key에는 날짜값을 포함시킨다. offset은 사용자의 id로 기록을 하고, value에는 방문을 했다면 1로 기록을 한다. offset의 모든 개수를 세알리면 된다. @Service @RequiredArgsConstructor public class DailyActiveUserService { private final DailyActiveUserRepository dailyActiveUserRepository; private final RedisTemplate<String, String> redisTemplate; ... public void recordActiveUserWithRedis(Long userId) { LocalDate today = LocalDate.now(); String key = "dau:" + today.toString(); // dau:YYYY-MM-DD // Redis에 userId를 Bitmap 자료구조로 저장 // Redis 명령어의 'SETBIT [key] [offset] [value]'와 동일하다. redisTemplate.opsForValue().setBit(key, userId, true); } public long getDauWithRedis(LocalDate date) { String key = "dau:" + date.toString(); // Redis에 저장된 비트맵을 활용하여 DAU를 계산 // Redis 명령어의 'BITCOUNT [key]'와 동일하다. return redisTemplate.execute( (RedisCallback<Long>) (connection) -> connection.bitCount(key.getBytes()) ); } }

$ keys * $ del dau:2026-01-08


$ k6 run scripts/script_4-2.js

$ keys * # 데이터가 저장된 key 확인하기 $ BITCOUNT dau:2026-01-08 # 해당 Bitmap에 저장된 데이터 개수 확인하기 # MEMORY USAGE [key] $ MEMORY USAGE dau:2026-01-08 # 특정 key가 차지하고 있는 메모리 확인
