
서비스를 운영하다 보면 데이터는 지속적으로 쌓이게 됩니다. RDBMS는 데이터를 디스크에 저장하는 특성상, 데이터가 많아질수록 성능 저하의 한계에 도달할 수 있습니다.
이런 문제를 해결하기 위해, 메모리에 데이터를 저장하여 빠른 성능을 제공하는 Redis와 같은 NoSQL DB를 적용하는 방안을 고민하게 됩니다.
그렇다면 휘발성 DB인 Redis를 사용하는 이유는 무엇일까요?
많은 사용자가 동시에 서비스를 이용할 때 매번 하드디스크에 접근하면 속도가 느려지기 때문에, 자주 사용하는 데이터를 Redis에 저장(캐싱)하여 응답 속도를 개선할수 있습니다!
Redis가 In-Memory DB임은 위에서 살펴보았습니다. 하지만 In-Memory DB는 Redis외에도 Memcached가 존재합니다.
그렇다면 굳이 왜? Redis를 사용할까요? 그 이유는 다양한 자료구조를 지원하는 Redis만의 특징에 있다고 생각합니다.
Redis의 기본적인 자료구조로, 문자열 데이터를 저장하며 이진 데이터를 포함한 모든 데이터(JPEG 이미지, HTTP 응답값 등)를 저장할 수 있습니다.
Binary-safe란?
데이터 손실 없이 NULL 바이트를 포함한 모든 바이트 시퀀스를 저장하고 처리할 수 있는 방식입니다.
SET/GET
SET [KEY] [VALUE]
GET [KEY]
예시
> SET hello world
OK
> GET hello
"world"
INCR, INCRBY
String 자료구조에 저장된 숫자를 원자적으로 조작할 수 있습니다.
예시
> SET counter 100
OK
> INCR counter
(integer) 101
> INCRBY counter 50
(integer) 151
MSET/MGET
한 번에 여러 키-값을 저장하거나 조회할 수 있어 네트워크 성능을 높일 수 있습니다.
예시
> MSET A 10 B 20 C 30
OK
> MGET A B C
1) "10"
2) "20"
3) "30"
List는 순서를 가지는 문자열 목록으로, 스택과 큐처럼 사용할 수 있습니다.
LPUSH/RPUSH
예시
> LPUSH mylist A B C
(integer) 3
> RPUSH mylist D
(integer) 4
LRANGE
리스트의 특정 범위 데이터를 조회할 수 있습니다.
예시
> LRANGE mylist 0 -1
1) "C"
2) "B"
3) "A"
4) "D"
LTRIM
리스트 데이터를 범위만큼 유지하며, 나머지는 삭제합니다.
> LTRIM mylist 0 1
OK
> LRANGE mylist 0 -1
"A"
"D"
LPUSH와 LTRIM을 함께사용하면 고정된 길이의 큐를 쉽게 유지 가능합니다. 따라서 제한된 저장공간을 유지해야하는 경우(EX. 로그데이터) LPUSH와 LTRIM을 이용해 처리하는 것이 효율적입니다.(시간복잡도 O(1))
Hash는 필드-값 쌍을 저장할 수 있어 RDBMS의 테이블 데이터와 유사합니다.
예시
> HSET Product:123 Name "Track Ball" Price 300
(integer) 2
> HGET Product:123 Name
"Track Ball"
> HGETALL Product:123
1) "Name"
2) "Track Ball"
3) "Price"
4) "300"
중복 없는 데이터 집합을 저장하며, 집합 연산(교집합, 합집합, 차집합)을 지원합니다.
> SADD myset A B C
(integer) 3
> SUNION set1 set2
"apple", "banana", "cherry"
> SINTER set1 set2
"banana"
> SDIFF set1 set2
"apple"
Sorted Set은 스코어에 따라 정렬된 데이터를 저장합니다.
> ZADD leaderboard 100 user1 200 user2
(integer) 2
> ZRANGE leaderboard 0 -1 WITHSCORES
1) "user1"
2) "100"
3) "user2"
4) "200"
점수에 따라 유일한 key값이 정렬된 상태로 저장되기 때문에 랭킹 시스템과 같은 서비스에서 유용하게 사용될수 있다!
모든 키를 조회하는 명령어로, 데이터가 많을 경우 서버가 차단(Block) 될 수 있어 사용에 주의가 필요합니다.
KEYS 명령어를 대체한 명령어로, 데이터 조회를 범위로 제한할 수 있어 비교적 안전합니다.
Redis는 캐싱, 세션 저장, 실시간 데이터 처리 등 다양한 목적으로 활용될 수 있습니다. 또한, 지원하는 자료구조가 다양하여 상황에 맞게 유연하게 사용할 수 있다는 점에서 많은 사랑을 받고 있습니다.🚀
참고자료
개발자를 위한 레디스
redis 공식문서