Redis
개요 및 특징
- Key - Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈소스 기반의 인메모리 비관계형 데이터베이스
- In-memory(메모리) 기반이기 때문에 빠른 읽기/쓰기 속도를 제공
- 데이터베이스, 캐시, 메시지 브로커 등으로 폭넓게 사용
- 기본적으로 Key와 Value 구조이므로 복잡한 SQL 쿼리가 필요 없고, 다양한 자료구조를 지원
자료 구조 간단 정리
String : 가장 기본적인 Key-Value 구조
List : 순서를 가지는 컬렉션
Set : 중복을 허용하지 않는 값의 집합
Sorted Set (ZSet) : Set과 유사하지만 각 요소에 score가 붙어 정렬된 상태로 관리
Hash : 키 내부에 필드- 값 쌍을 담을 수 있는 구조로 연관 배열(맵) 역할을 함
redis.conf 설정 파일 주요 옵션
bind: Redis가 바인딩할 네트워크 인터페이스를 설정
port : 클라이언트, 레플리카간 통신 포트 설정
protected-mode : 외부 접속 보호모드 여부
requirepass : 인증 비밀번호 설정
daemonize : 데몬(백그라운드) 실행 여부
timeout : 클라이언트 유휴 시간 초과 설정
databases : 사용할 데이터베이스 개수 설정
maxmemory : Redis 서버가 사용할 최대 메모리 용량 제한 설정
주의 사항
- 메모리 사용량이 많기 때문에 메모리 관리 중요(
maxmemory 설정)
- 백업 및 영속화 전략 필요 (RDB, AOF 설정)
- 인증 / 보안 설정 필수
- 방화벽 설정 등 네트워크 보안 주의
Redis 설치 - Docker 사용
docker run -d -p 6379:6379
--name redis
-v /app/redis/redis.conf:/usr/local/etc/redis/redis.conf
-v /app/redis/data:/data
redis
redis-server /usr/local/etc/redis/redis.conf
-v /app/redis/redis.conf:/usr/local/etc/redis/redis.conf : 제 로컬에 있는 redis.conf를 컨테이너의 /usr/local/etc/redis 디렉터리 안에 redis.conf를 복사
-v /app/redis/data:/data : 내 로컬 /app/redis/data과 컨테이너 /data 와 연결 (데이터를 여기에 저장)
redis-server /usr/local/etc/redis/redis.conf : 위의 redis.conf를 기반으로 redis-server 실행
Spring Boot 적용해보기
yaml
spring:
data:
redis:
host: localhost
port: 6379
database: 0
password: tjwns@@
timeout: 300
host : ip 주소 (로컬이면 localhost)
port : Redis Port
database : 사용할 DB 인덱스
password : redis.conf에서 설정한 requirepass (protected-mode 가 yes일 때 사용 가능)
timeout : 커넥션 타임아웃
Config
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(serializer);
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(serializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
}
}
Service
@Slf4j
@Service
@RequiredArgsConstructor
public class TestService {
private final RedisTemplate<String, Object> redisTemplate;
private String buildKey(Long id) {
String USER_KEY_PREFIX = "user:";
return USER_KEY_PREFIX + id;
}
public UserDto save(CreateUserRequest createUserRequest) {
Long id = redisTemplate.opsForValue().increment("user:id:sequence");
User user = new User(id, createUserRequest.getUsername(), createUserRequest.getEmail());
Map<String, Object> userMap = new HashMap<>();
userMap.put("id", user.getId());
userMap.put("name", user.getUsername());
userMap.put("age", user.getEmail());
redisTemplate.opsForHash().putAll(buildKey(id), userMap);
return UserDto.from(user);
}
}
RedisTemplate 주요 메소드
| 메소드 명 | 반환 오퍼레이션 | Redis 자료구조 |
|---|
| opsForValue() | ValueOperaions | String |
| opsForList() | ListOperations | List |
| opsForSet() | SetOperations | Set |
| opsFoeZSet() | ZSetOperations | Sorted Set |
| opsForHash() | HashOperations | Hash |
테스트 사진
keys *

user:id:sequence

user:
