우리가 개발을 하다보면 Redis라는 용어를 한번쯤 들어보았을 것이고, RedisTemplate라는 것을 한번은 코드상에서 봤을 수 있습니다.
개발을 하면서 데이터를 저장할 때 쓴다고 한 Mysql, Mongodb등 기존 데이터 베이스를 두고 왜 Redis라는 Database를 또 사용하는지, 그리고 어떻게 사용하는지에 대해 다뤄보겠습니다.
Redis란?
Redis는 REmote Dictionary Server의 약자이며, Mysql과 같이 서버와는 별개로 저장이 되지 않고 메모리상에 저장되는 In memory구조로 구성되어있습니다.
데이터는 Key Value로 관리가 되고 있으며, 다양한 구조 집합을 제공함으로 다양한 구조를 Value로 저장할 수 있으며 최대 512MB의 데이터가 저장가능합니다.
Key로 데이터를 관리하기때문에 조회에 있어 가장 빠른 성능을 자랑하며, 빠른 조회 성능을 요구하는 캐싱, 세션 관리 등에 사용을 하고 있습니다.
Redis는 In memory 구조로 key value형태로 데이터를 저장 하고 있으며, key로 데이터를 관리하기때문에 조회에 있어 빠른 성능을 자랑하며, 현재 가장 인기 있는 key value store입니다.
Key Value
로 처리하면서 Redis는 Row로 저장되는 것 보다는 Column을 저장한다는 것으로 보이고, 이때문에 많은 양의 데이터를 저장하고 지속적으로 관리하는 기존 데이터베이스와 사용용도는 다르다고 필자는 생각합니다.
또한 InMemory
구조로인한 데이터를 지속적으로 백업해주어야하는 문제가 있으며, 이를 해결하여 사용하기보다는 기존의 다른 데이터베이스와 함께 사용하면서 용도에 맞춰 사용하는 것이 가장 현명한거 같다 생각합니다.
Redis는 요청에 의했을 때는 Single Thread 개념을 가져오지만, background에서는 Multi Thread를 지원하는 만큼 데이터를 조회하는데에 있어 빠른 성능을 강점으로 가져가는 것 같습니다.
이처럼 Redis는 java의 Map과 같이 Key Value로 데이터를 저장하며, inmemory구조지만 Redis를 사용하는 상황은 분산 시스템에 있습니다. 분산시스템에서 동일한 key value의 저장소를 공유해야만 하는 상황이라면 Redis를 사용하여 해당 Issue를 해결하는 방법도 좋은 방법이 될 수 있습니다.
사용법
설치
우선 필자는 Database관리를 Docker로 하고 있기 때문에 Container로 만들어 관리를 하도록 하겠습니다.
1. Redis Image Pull
docker pull redis
Docker에서 지원해주는 Redis Image를 다운받아줍니다.
2. Redis Container run
docker run --name test-redis -p 6379:6379 redis
redis이미지를 토대로 container를 생성하여 실행하여줍니다.
port는 redis기본 port인 6379로 설정하였습니다.
3. redis접속
docker exec -it test-redis /bin/bash
위 명령어를 통해 실행중인 container에 접속해주도록 합니다.
redis-cli
위 명령어 입력을 완료하면 container로 실행중인 redis안에 접속할 수 있습니다.
4. CRD
set {key} {value}
get {key}
del {key}
위 명령어와 같이 set
을 통해 데이터를 등록할 수 있습니다.key
는 식별자 역할을 함으로써 수정할 때에도 동일하게 set
명령어를 사용할 경우 해당 key
의 value
를 변경할 수 있습니다.
이처럼 Redis
자체를 사용하는 것은 쉽게 사용할 수 있습니다.
그럼 이제 서버에서 어떻게 사용하는지를 알아보겠습니다.
JAVA에서 Redis사용법
spring:
data:
redis:
host: localhost
port: 6379
Application.yml
설정입니다.
Redis기본 port가 6379이기 때문에 따로 port가 겹치지 않아 6379Port로 설정하여 사용하였습니다.
@Configuration
public class RedisConfig {
@Value("${spring.data.redis.host}")
private String redisHost;
@Value("${spring.data.redis.port}")
private int redisPort;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(redisHost, redisPort);
}
@Bean
public RedisTemplate<String, String> redisTemplate() {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
RedisConfig
설정입니다.
연결을 위해 redisHost와 redisPort값을 받아 Redis저장소에 연결 즉 connect를 하고, 이후 RedisTemplate를 정의함으로써 보다 편하게 사용할 수 있게 정의하였습니다.
@Repository
@Transactional
@RequiredArgsConstructor
public class TestStore {
//
private final RedisTemplate<String, String> redisTemplate;
public void create(String key, String data) {
ValueOperations<String, String> opreation = redisTemplate.opsForValue();
opreation.set(key, data);
}
public void update(String key, String data) {
ValueOperations<String, String> opreation = redisTemplate.opsForValue();
opreation.set(key, data);
}
public String load(String key) {
ValueOperations<String, String> opreation = redisTemplate.opsForValue();
return opreation.get(key);
}
public void remove(String key) {
redisTemplate.delete(key);
}
}
TestStore
입니다.
RedisTemplate를 통해 데이터를 CRUD를 하는 작업을 담당하게 구현하였습니다.
참고자료: https://redis.io/docs/
'CS > Database' 카테고리의 다른 글
[ Mysql ] Mysql 기본 작업 (0) | 2024.11.13 |
---|---|
[Index] 구축한 서버 Query분석 및 성능 측정 후 Index 구축 (2) | 2024.08.08 |