-
Redis의 data type대용량 데이터 & 트래픽/대용량 처리를 위한 redis 2024. 3. 10. 13:06
redis를 설치하는 수고를 덜기 위해 docker를 사용했다.
docker pull로 redis 이미지를 가져온 다음
docker run을 이용해서 redis를 my-redis라는 이름으로 실행시켜줬다.
이제 Redis에서의 data type에 대해 하나씩 알아보겠다.
1. Strings
- 가장 기본적인 데이터 타입이며 제일 많이 사용됨
- 바이트 배열을 저장
- 바이너리로 변환할 수 있는 모든 데이터를 저장 가능 (JPG와 같은 파일 포함)
- 최대 크기는 512MB
docker exec -it my-redis /bin/sh를 입력해서 shell로 접속을 한 뒤에 redis-cli를 입력하면 redis 명령어를 입력할 수 있다. 위의 사진은 SET과 GET 명령어를 통해 myname = hello 라는 데이터를 입력한 것이다.
value의 값이 숫자라면 INCR, DECR 명령어를 통해 값을 1씩 증가시키거나 감소시킬 수 있는데 race condition에 걸리지 않아서 좋아요 갯수 등을 구현할 때 효과적이라고 한다.
2. Lists
- Linked-list의 형태로 인덱스 접근은 느리지만 데이터의 추가 / 삭제가 빠르다.
- Queue와 Stack으로도 사용할 수 있다.
왼쪽에 데이터를 넣고 왼쪽에서 빼면 Stack, 왼쪽에 데이터를 넣고 오른쪽에서 빼면 Queue가 된다.
리스트의 왼쪽에 apple, banana를 넣고 list의 길이를 보며 하나씩 제거한 과정이다.
LRANGE mylist 뒤에 0과 -1이 오는데, 0은 시작 값이고 -1은 끝 값이기 때문에 banana와 apple을 출력한다. 만약에 LRANGE mylist 0 -2라는 명령어를 입력하면 banana 하나만 나오게 된다.
3. Sets
- 순서가 없는 유니크한 값의 집합
- 검색이 빠름
- 개별 접근을 위한 인덱스가 존재하지 않고 집합 연산이 가능
Set을 사용하는 대표적인 예로는 특정 시간동안 유효한 쿠폰 발급이다. 해당 유저가 특정 시간동안 한 번만 사용할 수 있도록 설계하는 것이기 때문에 유저가 쿠폰을 사용하면 Set에다 저장을 하면 그 유저가 쿠폰을 사용했는지 아닌지의 여부를 확인할 수 있다.
set에 apple, banana를 넣은 다음에 SCARD를 이용해 set의 길이를 확인, SMEMBERS를 이용해 요소들을 확인하고 ISMEMBER를 통해 banana와 grape가 해당 set에 있는지 확인하는 명령어를 입력해보았다.
SISMEMBER는 set에 데이터가 몇 개나 있는지 상관없이 동일한 속도를 보장하기에 set의 활용도가 크다.
4. Hashes
- 하나의 key 하위에 여러개의 field-value 쌍을 저장 가능
- 여러 필드를 가진 객체를 저장하는 것으로 생각 가능
- HINCRBY 명령어를 사용해 카운터로 활용 가능한 것이 특징
Hashes를 이용하면 user에 각각 name과 age를 저장할 수 있다. 또한 HINCRBY를 통해 viewcount의 값을 증가시킬 수도 있기 때문에 여러 필드를 가진 객체를 저장할 때 사용되는 자료구조이다.
5. Sorted Sets
- Set과 유사한 유니크한 값들의 집합
- 각 값은 연관된 score를 가지고 졍렬되어 있음 -> 빠르게 최소 / 최댓값 구할 수 있음
- 순위 계산, 리더보드 구현 등에 활용
ZADD로 값을 추가할 수 있는데, 만약에 apple이라는 값이 이미 있다면 score만 업데이트한다.
ZADD 명령어로 sorted set을 만든 다음에 0부터 2까지 3개의 데이터를 myrank로 출력하면 apple, banana, grape 순으로 출력된다. ZRANK와 ZREVRANK는 각각 오름차순, 내림차순으로 정렬된 데이터의 위치를 반환하며, ZREM 명령어로 banana를 삭제하고 grape의 순위를 조회하면 2 -> 1로 올라간 것을 확인할 수 있다.
6. Bitmaps
- 비트 벡터를 사용해 N개의 Set을 공간 효율적으로 저장
- 비트 연산 가능
- 하나의 비트맨이 가지는 공간 = 2^32-1
Bitmap은 익숙하지 않는 자료구조 형태인데 하나의 비트맵은 42억개의 bit를 가지기 때문에 효율적이다. 각각의 index가 가지는 값은 0과 1로만 이루어져 있다. 예를 들어서 index가 유저번호, key가 visit로 방문 현황이라고 가정할 때, 비트맵 하나로 42억명 유저의 방문 현황을 나타낼 수 있다.
비트 연산이 가능하기 때문에 위의 Bitmap을 날짜별로 지정하고 연산을 할 수도 있다.
SETBIT를 이용해서 값을 1이나 0으로 설정할 수 있는데 지정하지 않으면 default 값은 0이다.
SETBIT를 이용해서 today_visit의 2, 3, 4라는 값을 1로 설정하고, BITOP AND 연산을 통해 result에 yesterday_visit와 today_visit의 연산을 진행한 것이다. result의 count는 2이며, today_visit와 yesterday_visit에서 둘 다 1인 값인 2와 3을 가지게 된다.
'대용량 데이터 & 트래픽 > 대용량 처리를 위한 redis' 카테고리의 다른 글
Redis의 Pub/Sub을 이용한 채팅방 기능 구현 (0) 2024.03.11 redis의 Sorted Sets을 활용한 리더보드 구현 (0) 2024.03.11 서비스 속도를 높이는 redis의 캐시레이어 (0) 2024.03.10 분산 환경에서의 session 스토어 (0) 2024.03.10 In-memory DB인 Redis의 특징 (0) 2024.03.10