DB/Redis
[Redis] redis 파헤치기
향찡
2023. 2. 13. 00:42
캐시란 자주 사용하는 데이터를 미리 보관해둔 임시 장소를 의미
캐시는 비교적 저장 공간이 적고 전체적인 비용이 비쌈
대신 빠른 IO를 통해 성능적 이점을 가져올 수 있음
일반적으로 아래와 같은 특징들을 가지고 있는 데이터에 대해 캐시를 사용하면 좋음
- 도중에 변경될 일이 없는 데이터베이스 조회 값(캐시와 DB값이 다를 수 있는 경우가 있기 때문에)
- 자주 호출되는 데이터
스프링 부트에서 사용할 수 있는 캐시는 대부분 JSR-107을 따름
JSR
- Java Specification Requests의 줄임말, 자바 플랫폼에 대한 규격을 제안하거나 기술
- 그 중 JSR-107은 JCache에 관한 내용
JSR-107을 따르는 캐시를 사용하면 어떤 구현체 캐시를 사용하는지에 관계 없이 추상화를 지원
로컬 캐시
- 로컬(해당 서버)에서만 사용하는 캐시
- 외부 서버와 트랜잭션 비용이 들지 않기 떄문에 속도가 빠름
- 로컬에서만 사용하기 때문에 분산 서버의 구조에서 캐시를 공유하기 어려움
글로벌 캐시
- 여러 서버에서 접근할 수 있는 캐시 서버를 구축하여 사용하는 방식
- 네트워크를 통해 데이터를 가져오는 트랜잭션 비용이 있기 때문에 로컬 캐시에 비해 상대적으로 느림
- 별도의 서버로 운영 되기 때문에 서버 간 데이터 공유에 용이함
Redis
Remote Dictionary Server의 약자로 키-값 구조의 데이터를 저장하고 관리하기 위한 오픈소스 기반의 비관계형 데이터 관리 시스템
특징
- In-Memory data structure
- Programmability
- Extensibility
- Persistence
- Clustering
- High availability
의존성 추가 : Spring-boot-starter-data-redis
Redis Client는 크게 2가지가 있음 ( Jedis, Lettuce )
스프링 부트 2.0 이후로는 기본 클라이언트로 Lettuce를 사용
application.properties설정 추가
spring.redis.host=localhost
spring.redis.port=6379
RedisConfig 클래스 추가
@Configuration
public class RedisCacheConfig implements CacheConfig {
@Value("localhost")
private String host;
@Value("port")
private String port;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}
// redisTemplate을 이용할 경우에 추가, 이번에는 repository를 이용할 예정이라 사용안함
@Bean
public RedisTemplate<?, ?> redisTemplate() {
RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
return redisTemplate;
}
}
redis 사용방법
1. redisTemplate을 만들어서 사용하는 방법
// 간략한 RedisTemplate 사용법
@Component
public class Test {
private final RedisTemplate<String, String> redisTemplate;
@Autowired
public Test(RedisTemplate<String, String> redisTemplate) {
this.redisTemplate = redisTemplate;
}
public void test() {
ValueOperations<String, String> valueOperation = redisTemplate.opsForValue();
valueOperations.set(); // 등록
}
}
2. repository에 인터페이스를 만들어서 사용하는 방법
인터페이스
public interface RedisRepository extends CrudRepository<ResponseDto, String> {
}
Dto
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
@RedisHash(value = "shortUrl", timeToLive = 60) // 초 단위
public class ShortUrlResponseDto implements Serializable {
private static final long serialVersionUID = -2121332425235L;
@Id // 키
private String orgUrl;
private String shortUrl;
}
@RedisHash의 기능 : 키 값의 prefix로 붙을 수 있는 value를 지정하였음
// 저장
ResponseDto responseDto = new ResponseDto(orgUrl, shortUrl);
redisRepository.save(responseDto);
// 조회
Optional<ResponseDto> responseDto = repository.findById(orgUrl);
by 어라운드 허브 스튜디오