Redis
Redis. 얼마나 좋길래 이렇게 추천을 받는 것인지. 써보고 싶어졌다. 그래서 세팅해본다.
1. ubuntu 환경에 Redis 설치
$sudo apt-get update
$sudo apt-get install -y redis-server
2. Redis configuration
$sudo vim /etc/redis/redis.conf
maxmemory-policy allkeys-lru 추가
- redis 메모리가 가득 찰 경우 오래된 데이터부터 지우겠다는 뜻이다.
3. Redis 테스트
$redis-cli
127.0.0.1:6379> set key1 hello
127.0.0.1:6379> get key1
여기까지가 ubuntu 환경에 redis 설치 및 가장 기초적인 세팅을 완료한 것이다.
이제부턴 스프링부트에 세팅한다.
Spring-Boot
1. application.properties 설정
spring.cache.type=redis
spring.redis.host=localhost
spring.redis.port=6379
2. @EnableCaching 선언
- 캐싱을 사용하겠다는 의미다.
@EnableCaching
@SpringBootApplication
public class BackendApplication {
public static void main(String[] args) {
SpringApplication.run(BackendApplication.class, args);
}
}
3. configuration 클래스 생성
@Configuration
@EnableRedisRepositories
public class RedisConfiguration {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int redisPort;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(redisHost, redisPort);
}
@Bean
public RedisTemplate<?, ?> redisTemplate() {
RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
return redisTemplate;
}
}
이 구간에서 겪었던 문제 : 클래스가 Redis에 Set되지 않는 문제
해결 : setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class)); 선언을 통해 해결되었다.
이 문제를 해결하는데 도와준 양이님과 버민님께 감사의 뜻을 전합니다.
변경 후 내용
// 위와 같음
@Bean
public RedisTemplate<?, ?> redisTemplate() {
RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
// 적용 내용
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
// 적용 내용 끝
redisTemplate.setConnectionFactory(redisConnectionFactory());
return redisTemplate;
}
}
4. Service에서 테스트
@Service
@RequiredArgsConstructor
public class MainService {
private final RedisTemplate<String, Object> redisTemplate;
public String getMainPageElements(String token) {
ValueOperations<String, Object> operations = redisTemplate.opsForValue();
operations.set("test", "test");
String redis = (String)operations.get("test");
System.out.println(redis);
return redis;
}
참고로 위 테스트는 그냥 예시 코드다. 알아서 잘 커스텀 해서 사용하면 된다.
출력 결과는 콘솔에 "test"가 출력되면 잘 된 것이다.
성능에 큰 영향을 주는 기능이니 정적 데이터는 기본이고 동적 데이터에도 잘 쓰면 사용자 경험에 큰 도움이 될 것이라고 생각한다.
'내가 배운 것들 > 문제 해결' 카테고리의 다른 글
[Ubuntu/SpringBoot] Ubuntu 8080 포트를 80 포트로 포트포워딩 하기 (0) | 2021.12.29 |
---|---|
[SpringBoot] JPA를 이용한 Delete가 실행되지 않는 현상 (0) | 2021.12.27 |
[SpringBoot] DTO 형식으로 반환해줄 때, NULL값은 숨긴 채로 되돌려주기 (0) | 2021.12.23 |
[RegExp] 아이디, 닉네임, 비밀번호 정규식 (1) | 2021.12.23 |
[QueryDSL/MySQL] QueryDSL로 MySQL에서 랜덤한 레코드 가져오기 (0) | 2021.12.22 |
댓글