실시간 리더보드 구현 (sorted set)

게임 내에서 플레이어의 점수를 저장하고 순위를 매길 때 유용하다. ZADD 명령어로 플레이어 점수를 추가하고 ZRANGE 명령어로 순위를 조회함. 점수가 업데이트되면 ZADD 명령어로 새로운 점수를 추가하여 리더보드를 갱신한다.
# 플레이어 점수 저장
ZADD leaderboard 1000 player1
ZADD leaderboard 950 player2
ZADD leaderboard 1100 player3
# 순위 조회
ZRANGE leaderboard 0 -1 WITHSCORES
# 플레이어 점수 업데이트
ZADD leaderboard 1050 player1
# 특정 플레이어의 순위 조회
ZREVRANK leaderboard player1

플레이어의 점수가 업데이트되면 ZADD 명령어로 새로운 점수를 추가하여 리더보드를 갱신할 수 있으며 가중치를 부여하여 점수를 조정하는 것도 가능함. 예를 들어, 특정 이벤트에서 얻은 점수에 보너스를 주어 반영할 수 있다.
# 점수에 가중치 적용
ZINCRBY leaderboard 50 player1 # player1에게 50점 보너스
최근 검색 기록 저장 (sorted set)
사용자의 최근 검색 기록을 sorted set을 이용해 저장한다. 검색 키워드와 검색 시간을 기준으로 정렬하여 최신 검색어를 쉽게 조회할 수 있으며 ZADD 명령어로 검색 기록을 추가하고 ZRANGE 명령어로 최근 검색어를 조회한다.

# 검색 기록 저장 (timestamp를 score로 사용)
ZADD recent_searches 1627885442 "Redis tutorial"
ZADD recent_searches 1627885482 "Sorted set example"
# 최근 검색 기록 조회
ZRANGE recent_searches -10 -1 WITHSCORES

각 Sorted set을 사용하였기 때문에 각 아이템은 중복되어 저장되지 않고, 자동으로 스코프 업데이트 된다.


태그 기능 구현 (set)
블로그 게시물에 태그를 추가하여 분류한다. 각 태그에 속한 게시물 목록을 set을 이용해 저장함. SADD 명령어로 태그를 추가하고 SMEMBERS 명령어로 태그를 조회한다.



# 게시물에 태그 추가
SADD post:1:tags Redis Database
SADD post:2:tags Redis Tutorial
# 태그로 게시물 조회
SMEMBERS post:1:tags
랜덤 데이터 추출 (RANDOMKEY)
레디스의 RANDOMKEY 명령어를 사용하여 저장된 키들 중 하나를 무작위로 추출한다. 게임의 랜덤 매칭이나 이벤트 응모자 추출에 활용 가능하다.
관계형 DB의 경우 조건절에 맞는 모든 행을 읽은 후 임시 테이블에 넣어 정렬한 다음 랜덤으로 limit에 해당할 때 까지 데이터를 추출한다.
데이터가 1만 건 이상일 경우 부하가 클 수 있다. Redis는 O(1)의 시간 복잡도로 추출이 가능하다.

# 랜덤 키 추출
RANDOMKEY
하지만 보통 하나의 레디스 인스턴스에 한 가지 종류의 데이터만 저장하지는 않기 때문에 HRANDFILED, SRANDMEMBER, ZRANDMEMEBER등을 이용하여 각각 hash, set, sorted set에 저장된 아이템 중 랜덤한 아이템을 추출할 수 있다.

HRANDFILE user:hash
"id:4615"
HRANDFILE user:hash 1 WITHVALUES
"id:4615"
"Jinni"
좋아요 관리 (hash, set, sorted set)
관계형 DB를 사용할 경우 테이블의 특정 행에서 좋아요 개수 데이터를 증가시키는 일은 데이터베이스에 직접적인 영향을 끼칠 수 있다. 또한 하나의 유저는 같은 댓글에 한 번씩만 좋아요를 누를 수 있어야 하기 때문에 단순히 좋아요의 개수를 파악하는 것이 아닌, 어떤 유저가 어떤 댓글에 좋아요를 눌렀는지의 데이터 또한 처리할 수 있어야 한다.
이를 구현하는 데 레디스의 set을 간단히 활용할 수 있다.
댓글 ID를 기준으로 set을 생성한 뒤, 좋아요를 누른 유저의 ID를 set에 저장하면 중복 없이 데이터를 저장할 수 있다. 그림 4-18은 이를 구현한 그림을 나타낸다. 그림 4-18에서 댓글 ID 12554에 좋아요를 누른 유저는 345, 25, 967이다.

# 좋아요 추가
SADD comment:like:12554 345
SADD comment:like:12554 25
SADD comment:like:12554 967
# 좋아요 수 조회
SCARD comment:like:12554
# 특정 댓글에 좋아요를 누른 유저 조회
SMEMBERS comment:like:12554
읽지 않은 메시지 수 카운팅 (set)
채팅 애플리케이션에서 사용자가 읽지 않은 메시지를 set을 이용해 카운팅한다. 각 채널별로 set을 사용해 읽지 않은 메시지 수를 관리한다.
# 읽지 않은 메시지 추가
SADD channel:1:unread user:1000
# 읽지 않은 메시지 수 조회
SCARD channel:1:unread

비트 연산을 통한 DAU 계산 (BITOP, BITCOUNT)
# 사용자 접속 기록 저장 (bit)
SETBIT uv:20220101 1000 1
SETBIT uv:20220102 1000 1
# DAU 계산
BITCOUNT uv:20220101

HyperLogLog를 이용한 애플리케이션 미터링
HyperLogLog를 이용해 대량의 유저 로그를 효율적으로 관리한다. 고유 사용자 수를 추정하는 데 사용된다.
# 고유 사용자 수 저장
PFADD unique_users:20220101 user:1000
PFADD unique_users:20220101 user:1001
# 고유 사용자 수 조회
PFCOUNT unique_users:20220101
위치 기반 애플리케이션 개발 (Geospatial Index)
Geospatial Index를 이용해 위치 데이터를 관리한다. 사용자 위치 기반의 서비스를 제공하는 데 활용된다.
# 위치 데이터 저장
GEOADD locations 13.361389 38.115556 "Palermo"
GEOADD locations 15.087269 37.502669 "Catania"
# 위치 데이터 조회
GEORADIUS locations 15 37 200 km

참고 자료
개발자를 위한 레디스 | 김가림 - 교보문고
개발자를 위한 레디스 | 개발자가 인메모리 데이터베이스인 레디스를 잘 활용할 수 있도록 초점을 맞춘 포괄적인 안내서다. 레디스를 처음 배우는 독자나 NoSQL 데이터베이스의 개념을 쌓고자 하
product.kyobobook.co.kr
GitHub - redis/redis-doc: Redis documentation source code for markdown and metadata files, conversion scripts, and so forth
Redis documentation source code for markdown and metadata files, conversion scripts, and so forth - redis/redis-doc
github.com
'기술 탐구 > redis' 카테고리의 다른 글
Redis는 I/O 이벤트 통지 메커니즘, epoll에 대해 알아보자 (0) | 2025.04.03 |
---|---|
(Redis) 레디스를 캐시로 사용하기 (0) | 2024.06.27 |
(Redis) Redis의 자료 구조와 Key 관리 명령어 (0) | 2024.06.18 |
실시간 리더보드 구현 (sorted set)

게임 내에서 플레이어의 점수를 저장하고 순위를 매길 때 유용하다. ZADD 명령어로 플레이어 점수를 추가하고 ZRANGE 명령어로 순위를 조회함. 점수가 업데이트되면 ZADD 명령어로 새로운 점수를 추가하여 리더보드를 갱신한다.
# 플레이어 점수 저장
ZADD leaderboard 1000 player1
ZADD leaderboard 950 player2
ZADD leaderboard 1100 player3
# 순위 조회
ZRANGE leaderboard 0 -1 WITHSCORES
# 플레이어 점수 업데이트
ZADD leaderboard 1050 player1
# 특정 플레이어의 순위 조회
ZREVRANK leaderboard player1

플레이어의 점수가 업데이트되면 ZADD 명령어로 새로운 점수를 추가하여 리더보드를 갱신할 수 있으며 가중치를 부여하여 점수를 조정하는 것도 가능함. 예를 들어, 특정 이벤트에서 얻은 점수에 보너스를 주어 반영할 수 있다.
# 점수에 가중치 적용
ZINCRBY leaderboard 50 player1 # player1에게 50점 보너스
최근 검색 기록 저장 (sorted set)
사용자의 최근 검색 기록을 sorted set을 이용해 저장한다. 검색 키워드와 검색 시간을 기준으로 정렬하여 최신 검색어를 쉽게 조회할 수 있으며 ZADD 명령어로 검색 기록을 추가하고 ZRANGE 명령어로 최근 검색어를 조회한다.

# 검색 기록 저장 (timestamp를 score로 사용)
ZADD recent_searches 1627885442 "Redis tutorial"
ZADD recent_searches 1627885482 "Sorted set example"
# 최근 검색 기록 조회
ZRANGE recent_searches -10 -1 WITHSCORES

각 Sorted set을 사용하였기 때문에 각 아이템은 중복되어 저장되지 않고, 자동으로 스코프 업데이트 된다.


태그 기능 구현 (set)
블로그 게시물에 태그를 추가하여 분류한다. 각 태그에 속한 게시물 목록을 set을 이용해 저장함. SADD 명령어로 태그를 추가하고 SMEMBERS 명령어로 태그를 조회한다.



# 게시물에 태그 추가
SADD post:1:tags Redis Database
SADD post:2:tags Redis Tutorial
# 태그로 게시물 조회
SMEMBERS post:1:tags
랜덤 데이터 추출 (RANDOMKEY)
레디스의 RANDOMKEY 명령어를 사용하여 저장된 키들 중 하나를 무작위로 추출한다. 게임의 랜덤 매칭이나 이벤트 응모자 추출에 활용 가능하다.
관계형 DB의 경우 조건절에 맞는 모든 행을 읽은 후 임시 테이블에 넣어 정렬한 다음 랜덤으로 limit에 해당할 때 까지 데이터를 추출한다.
데이터가 1만 건 이상일 경우 부하가 클 수 있다. Redis는 O(1)의 시간 복잡도로 추출이 가능하다.

# 랜덤 키 추출
RANDOMKEY
하지만 보통 하나의 레디스 인스턴스에 한 가지 종류의 데이터만 저장하지는 않기 때문에 HRANDFILED, SRANDMEMBER, ZRANDMEMEBER등을 이용하여 각각 hash, set, sorted set에 저장된 아이템 중 랜덤한 아이템을 추출할 수 있다.

HRANDFILE user:hash
"id:4615"
HRANDFILE user:hash 1 WITHVALUES
"id:4615"
"Jinni"
좋아요 관리 (hash, set, sorted set)
관계형 DB를 사용할 경우 테이블의 특정 행에서 좋아요 개수 데이터를 증가시키는 일은 데이터베이스에 직접적인 영향을 끼칠 수 있다. 또한 하나의 유저는 같은 댓글에 한 번씩만 좋아요를 누를 수 있어야 하기 때문에 단순히 좋아요의 개수를 파악하는 것이 아닌, 어떤 유저가 어떤 댓글에 좋아요를 눌렀는지의 데이터 또한 처리할 수 있어야 한다.
이를 구현하는 데 레디스의 set을 간단히 활용할 수 있다.
댓글 ID를 기준으로 set을 생성한 뒤, 좋아요를 누른 유저의 ID를 set에 저장하면 중복 없이 데이터를 저장할 수 있다. 그림 4-18은 이를 구현한 그림을 나타낸다. 그림 4-18에서 댓글 ID 12554에 좋아요를 누른 유저는 345, 25, 967이다.

# 좋아요 추가
SADD comment:like:12554 345
SADD comment:like:12554 25
SADD comment:like:12554 967
# 좋아요 수 조회
SCARD comment:like:12554
# 특정 댓글에 좋아요를 누른 유저 조회
SMEMBERS comment:like:12554
읽지 않은 메시지 수 카운팅 (set)
채팅 애플리케이션에서 사용자가 읽지 않은 메시지를 set을 이용해 카운팅한다. 각 채널별로 set을 사용해 읽지 않은 메시지 수를 관리한다.
# 읽지 않은 메시지 추가
SADD channel:1:unread user:1000
# 읽지 않은 메시지 수 조회
SCARD channel:1:unread

비트 연산을 통한 DAU 계산 (BITOP, BITCOUNT)
# 사용자 접속 기록 저장 (bit)
SETBIT uv:20220101 1000 1
SETBIT uv:20220102 1000 1
# DAU 계산
BITCOUNT uv:20220101

HyperLogLog를 이용한 애플리케이션 미터링
HyperLogLog를 이용해 대량의 유저 로그를 효율적으로 관리한다. 고유 사용자 수를 추정하는 데 사용된다.
# 고유 사용자 수 저장
PFADD unique_users:20220101 user:1000
PFADD unique_users:20220101 user:1001
# 고유 사용자 수 조회
PFCOUNT unique_users:20220101
위치 기반 애플리케이션 개발 (Geospatial Index)
Geospatial Index를 이용해 위치 데이터를 관리한다. 사용자 위치 기반의 서비스를 제공하는 데 활용된다.
# 위치 데이터 저장
GEOADD locations 13.361389 38.115556 "Palermo"
GEOADD locations 15.087269 37.502669 "Catania"
# 위치 데이터 조회
GEORADIUS locations 15 37 200 km

참고 자료
개발자를 위한 레디스 | 김가림 - 교보문고
개발자를 위한 레디스 | 개발자가 인메모리 데이터베이스인 레디스를 잘 활용할 수 있도록 초점을 맞춘 포괄적인 안내서다. 레디스를 처음 배우는 독자나 NoSQL 데이터베이스의 개념을 쌓고자 하
product.kyobobook.co.kr
GitHub - redis/redis-doc: Redis documentation source code for markdown and metadata files, conversion scripts, and so forth
Redis documentation source code for markdown and metadata files, conversion scripts, and so forth - redis/redis-doc
github.com
'기술 탐구 > redis' 카테고리의 다른 글
Redis는 I/O 이벤트 통지 메커니즘, epoll에 대해 알아보자 (0) | 2025.04.03 |
---|---|
(Redis) 레디스를 캐시로 사용하기 (0) | 2024.06.27 |
(Redis) Redis의 자료 구조와 Key 관리 명령어 (0) | 2024.06.18 |