Redis란?
Redis(Remote Dictionary Server)는 Key-Value 기반의 NoSQL 데이터베이스이다.
가장 큰 특징은 데이터를 디스크가 아닌 메모리(RAM)에 저장하는 In-Memory Database라는 점이다.
메모리에서 데이터를 읽고 쓰기 때문에 일반적인 데이터베이스보다 매우 빠른 속도를 제공한다.
Redis의 특징
- In-Memory Database
- 데이터를 메모리(RAM)에 저장하여 매우 빠른 조회 및 저장이 가능하다.
- 기본적으로 메모리에 저장되므로 휘발성이지만, 필요에 따라 디스크에 데이터를 저장(Persistence)할 수도 있다.
- Key-Value 구조
- Key를 통해 데이터를 저장하고 조회한다.
- SQL을 사용하지 않고 Key를 이용해 데이터를 관리한다.
- 다양한 자료구조 지원
- 단순 문자열(String)
- List
- Set
- Sorted Set
- Hash
- Stream 등 다양한 자료구조를 제공하여 상황에 맞게 사용할 수 있다.
- 빠른 데이터 처리
- 메모리 기반으로 동작하기 때문에 읽기(Read)와 쓰기(Write) 속도가 매우 빠르다.
- 데이터 변경이 자주 발생하는 기능에 적합하다.
Redis를 사용하는 이유
Redis는 빠른 속도가 필요한 기능이나 자주 변경되는 데이터를 처리할 때 많이 사용된다.
대표적인 활용 사례는 다음과 같다.
- 캐싱(Cache) : 자주 조회되는 데이터를 메모리에 저장하여 DB 부하 감소
- 세션 관리(Session Clustering) : 로그인 세션 저장 및 서버 간 세션 공유
- 리더보드(Leaderboard) : 게임 랭킹, 점수 순위 관리
- 방문자 수(Visitor Tracking) : 실시간 방문자 수 및 조회수 관리
- 실시간 데이터 처리 : 채팅, 알림, 실시간 통계 등
Redis 명령어
String
- SET <key> <value>: key에 value 문자열 데이터를 저장
-
SET user:email djaxodbs0101@naver.com - GET <key>: key에 저장된 문자열 반환
-
GET user:email - INCR key: key에 저장된 데이터를 1 증가
-
INCR user:count - DECR key: key에 저장된 데이터를 1 감소
-
decr user:count - MSET: key value의 형태로 주어진 인자들을 각 key에 value를 저장함. 여러 개 가능
- MGET: 주어진 모든 key에 해당하는 데이터 반환.
List
- LPUSH, RPUSH: 리스트 왼쪽으로/ 리스트 오른쪽으로 value를 저장
-
LPUSH user:list bred RPUSH user:list chad - LPOP, RPOP: key에 저장된 리스트 앞쪽 / 뒷쪽에서 값을 반환 및 제거
-
LPOP user:list RPOP user:list - LLEN: key에 저장된 리스트의 길이를 반환
- LRANGE key start end: key의 start부터 end까지의 원소를 반환
-
LLEN user:list LRANGE user:list 0 3 LRANGE user:list 0 -1
Set: 문자열의 집합으로, 중복 허용x, 순서 존재 x
- SADD: key에 저장된 집합에 value를 추가
- SREM: key에 저장된 집합의 value를 제거
- SMEMBERS: key에 저장된 집합의 모든 원소 반환
- SISMEMBER: key에 저장된 집합에 value가 존재하는지 확인(true/false)
- SCARD: key에 저장된 집합의 크기를 반환
-
SADD user:java alex # [alex] SADD user:java brad # [alex, brad] SADD user:java chad # [alex, brad, chad] SREM user:java alex # [brad, chad] SMEMBERS user:java # [alex, brad, chad] SISMEMBER user:java brad # true SISMEMBER user:java dave # false
합집합, 교집합
- SINTER key1 key2: key1와 key2에 저장된 집합들의 교집합 원소 반환
- SUNION key1 key2: key1와 key2에 저장된 집합들의 합집합 원소 반환
- SINTERCARD number key1 [key2 ...]: number개의 key에 저장된 집합들의 교집합 크기 반환
-
SINTER user:java user:python # [alex] SUNION user:java user:python # [alex, brad, chad, dave] SINTERCARD 2 user:java user:python # 1
Hash: field - value 쌍으로 이루어진 자료형 // Map<String, Map<String, String>> 형식
- HSET key field value [field value]: key의 Hash에 field에 value를 넣는다. 한번에 여러 개도 가능
-
HSET user:alex name alex age 25 HSET user:alex major CSE - HGET: key에 저장된 Hash의 field에 저장된 value를 반환. 없는 field의 경우 null 반환
-
HGET user:alex name HGET user:alex age - HMGET: key에 저장된 Hash에서 복수의 field 에 저장된 value 반환
- HGETALL: key에 저장된 Hash 전부 반환
-
HMGET user:alex age major HGETALL user:alex - HKEYS: key에 저장된 Hash에 저장된 field를 전부 반환
- HLEN: key에 저장된 Hash에 저장된 field 개수 반환
-
HKEYS user:alex HLEN user:alex
Sorted Set: 정렬된 집합으로 중복되지 않은 데이터 + 점수로 저장함.
- ZADD key score member [score member ...]: key의 Sorted Set에 score를 점수로 가진 member를 추가, 이미 있는member의 경우 새로운 score를 설정
-
ZADD user:ranks 10 alex ZADD user:ranks 9 brad 11 chad - ZRANK: Set의 member 순위를 오름차순 기준으로 0부터 세서 반환
- ZRANGE key start stop: Set의 member들을 Start부터 stop 순위까지 오름차순 기준으로 반환
- ZREVRANK : Set의 member 순위를 내림차순으로 내림차순 기준으로 0에서 부터 세서 반환
- ZREVRANGE key start stop: Set의 member 들을 start 부터 stop 순위까지 내림차순으로 반환
- ZINCRBY key increment member: member의 score를 increment만큼 증가(음수 전달 시 감소)
-
ZRANK user:ranks alex ZRANGE user:ranks 0 3 ZREVRANK user:ranks alex ZREVRANGE user:ranks 0 4
그 외 공통 명령
DEL key: key 제거
DEL user:list
DEL user:email
DEL user:count
EXPIRE key seconds: key의 TTL을 seconds로 설정, seconds 초가 지나면 key 제거
EXPIRETIME key: key가 만료되는 시각을 Unix Timestamp로 반환
SET expirekey "to be expired"
EXPIRE expirekey 5
EXPIRETIME expirekey
KEYS * : 모든 Key 확인
FLUSHDB: 모든 Key 제거
RedisTemplate
Key를 직접 설정하고 자료형도 직접 선택해 가면서 Redis를 활용하기 위해서는 RedisTemplate을 사용하면 된다.
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void stringOpsTest(){
ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
//지금 RedisTemplate에 설정된 타입을 바탕으로 문자열 조작을 하기위한 메서드 설정
// ValueOperations<String, String> 은 자바에서 key를 전달 할 때 문자열 타입으로
ops.set("simplekey", "simplevalue");
System.out.println(ops.get("simplekey"));
SetOperations<String, String> setOps = stringRedisTemplate.opsForSet();
//Redis에서는 set 이지만, Java로 넘어올 때는 String 사용
setOps.add("hobbies", "games");
setOps.add("hobbies", "coding", "alcohol", "games");
System.out.println(setOps.size("hobbies"));
stringRedisTemplate.expire("hobbies", 10, TimeUnit.SECONDS);
stringRedisTemplate.delete("simplekey");
}
RedisTemplate을 Bean으로 등록하는 이유
테스트에서 RedisTemplate<String, ItemDto>를 사용하려고 했는데 다음과 같은 오류가 발생했다.
No qualifying bean of type
'RedisTemplate<String, ItemDto>' available
원인
Spring Boot는 기본적으로 RedisTemplate<Object, Object> 또는 StringRedisTemplate만 자동으로 생성한다.
하지만 내가 사용하려는 타입은
RedisTemplate<String, ItemDto>
이므로 해당 Bean이 존재하지 않아 직접 등록해야 한다.
RedisConfig
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, ItemDto> itemRedisTemplate(
RedisConnectionFactory connectionFactory) {
RedisTemplate<String, ItemDto> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setKeySerializer(RedisSerializer.string());
return template;
}
}
코드 설명
@Configuration
- Spring 설정 클래스임을 의미한다.
- 애플리케이션 실행 시 Spring이 읽어 Bean을 등록한다.
@Bean
- 메서드가 반환하는 객체를 Spring Bean으로 등록한다.
- 따라서 RedisTemplate<String, ItemDto>를 @Autowired로 주입받을 수 있다.
RedisConnectionFactory
- Redis 서버와 연결 정보를 관리한다.
- application.yml의 host, port, password 설정을 사용한다.
RedisTemplate<String, ItemDto>
- Redis와 통신하는 객체이다.
- String은 Key 타입, ItemDto는 Value 타입을 의미한다.
KeySerializer
template.setKeySerializer(RedisSerializer.string());
- Key를 문자열 형태로 저장한다.
- 설정하지 않으면 JDK 직렬화가 사용되어 사람이 읽기 어려운 형태로 저장될 수 있다.
'심화_AI를 활용한 백엔드 아키텍처 심화 과정' 카테고리의 다른 글
| [내일배움캠프 사전캠프] 23회차 TIL(7/27 월) - 대규모 시스템 설계 (0) | 2026.07.27 |
|---|---|
| [내일배움캠프 사전캠프] 22회차 TIL(7/24 금) - Spring Session, Redis Cache (0) | 2026.07.24 |
| [내일배움캠프 사전캠프] 20회차 TIL(7/22 수) - Docker, Docker-Compose (0) | 2026.07.22 |
| [내일배움캠프 사전캠프] 19회차 TIL(7/21 화) - Docker Image, Container (0) | 2026.07.21 |
| [내일배움캠프 사전캠프] 18회차 TIL(7/16 목) - 스프링 컨테이너 (0) | 2026.07.16 |