안녕하세요 오늘은 레디스에 데이터를 저장하고 사용해 봅시다.
일단 처음에는 싱글로 레디스를 활용하여
데이터를 저장하는 실습을 해보겠습니다.
하나의 레디스를 사용해서 데이터를 저장하고 관리하는 방법입니다.
redis-cli보다 직관적인 Another redis Desktop Manager를 사용하겠습니다.
해당 툴은 사용법이 간단하여 레디스 데이터를 쉽게 관리 가능합니다.
Another redis Desktop Manager를 실행하고 New Connection을 클릭합니다.
본인의 Redis Host, Port, Password 값을 입력합니다.
이제 커넥션된 레디스를 클릭하면
이렇게 정보를 확인할 수 있습니다.
여기서 DB0 셀렉트 박스는 레디스의 index 입니다.
예를 들어 DB0, DB1, DB2에 데이터를 저장할 수 있으며 따로 구분되어 관리되는 방식입니다.
그리고 + New Key 를 사용하여 데이터를 insert 할 수 있습니다.
이제 스프링 부트로 넘어와서
레디스 설정 config를 작성해 보겠습니다.
전과 달리 jedis가 아닌 redistemplate를 사용하겠습니다.
먼저 yml 입니다.
레디스에 대한 것만 작성하였습니다.
여기서 index1, index2 를 0,1로 설정하여 DB0, DB1로 관리합니다.
config 입니다.
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.util.List;
@Getter
@Setter
@Slf4j
@Configuration
@ConfigurationProperties("spring.redis")
public class RedisConfig {
private String host;
private int port;
private String password;
private int index1;
private int index2;
@Bean(name = "RedisConnectionFactory1")
public RedisConnectionFactory RedisConnectionFactory1() {
return createRedisConnectionFactory(index1);
}
@Bean(name = "RedisConnectionFactory2")
public RedisConnectionFactory RedisConnectionFactory2() {
return createRedisConnectionFactory(index2);
}
private RedisConnectionFactory createRedisConnectionFactory(int databaseIndex) {
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
configuration.setHostName(host);
configuration.setPort(port);
configuration.setPassword(password);
configuration.setDatabase(databaseIndex);
return new LettuceConnectionFactory(configuration);
}
@Bean(name = "RedisTemplate1")
public RedisTemplate<String, Object> RedisTemplate1(@Qualifier("RedisConnectionFactory1") RedisConnectionFactory redisConnectionFactory) {
return createRedisTemplate(redisConnectionFactory);
}
@Bean(name = "RedisTemplate2")
public RedisTemplate<String, Object> RedisTemplate2(@Qualifier("RedisConnectionFactory2") RedisConnectionFactory redisConnectionFactory) {
return createRedisTemplate(redisConnectionFactory);
}
private RedisTemplate<String, Object> createRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
위 처럼 설정하면 레디스의 DB0, DB1을 쓸수 있게되고
레디스 템플릿을 생성할 때 Serializer 를 세팅해 주어야 저번에 레디스 데이터가 이상하게 16진수로 인식되는 문제를 해결할 수 있습니다.
다음으로 간단하게 이름을 찾는 레파지 토리를 만들어 보겠습니다.
@Slf4j
@Repository
@RequiredArgsConstructor
@ConfigurationProperties("spring.redis")
public class RedisRepository {
@Qualifier("RedisTemplate")
private final RedisTemplate<String, Object> redisTemplate;
@Qualifier("RedisConnectionFactory1")
private final RedisConnectionFactory RedisConnectionFactory1;
@Qualifier("RedisConnectionFactory2")
private final RedisConnectionFactory RedisConnectionFactory2;
private int index1;
private int index2;
setDatabase(index1);
public String searchRedis(String name) {
String searchName = name.trim();
String resultCode1 = "1에서 찾았다";
String resultCode2 = "2에서 찾았다";
String resultCode3 = "그런거 없다";
Boolean step1 = redisTemplate.hasKey(searchName);
if(step1){
return resultCode1;
}else{
setDatabase(index2);
if(step1){
return resultCode2;
}
else{
return resultCode3;
}
}
}
public void setDatabase(int dbIndex) {
if(dbIndex == index1){
this.redisTemplate.setConnectionFactory(RedisConnectionFactory1);
} else if (dbIndex == index2) {
this.redisTemplate.setConnectionFactory(RedisConnectionFactory2);
}
}
}
위의 searchRedis 메서드를 이용하면 레디스 DB0,DB1에 저장되어있는 이름을
조회할 수 있습니다.
이제 응용해서 여러가지 조회 추가 업데이트 삭제 메서드를 작성하여 이용 하실 수 있습니다.
여기서 핵심은 레디스에 hash구조의 데이터를 조작할 수 있다는 것입니다.
Key value 구조의 다양한 데이터를 관리할 수 있고
빠른 Redis를 직접 사용해 보세요~
다음에는 Redis Cluster 를 사용해 봅시다.
감사합니다.
이미지 출처 : https://architecturenotes.co/redis/
'레디스' 카테고리의 다른 글
레디스를 캐시로 사용하여 조회하는것과 DB에서 데이터를 조회하는 것의 차이를 실험으로 알아보자 (0) | 2024.06.15 |
---|---|
Redis Sentinel vs Redis Cluster: 고가용성과 확장성의 대결 (0) | 2023.09.19 |
레디스 클러스터를 활용한 데이터 관리와 스프링 부트 연동: 클러스터 구성, 노드 설정, 조회 적용 및 실습 (0) | 2023.06.16 |
레디스(Redis)를 활용한 네띠 채팅 프로그램 구축: 간단한 적용 방법과 실시간 메시지 저장 (0) | 2023.03.05 |
Redis를 쓰는 이유 및 장점 (0) | 2023.03.05 |
댓글