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의 약자로 키-값 구조의 데이터를 저장하고 관리하기 위한 오픈소스 기반의 비관계형 데이터 관리 시스템

특징

  1. In-Memory data structure
  2. Programmability
  3. Extensibility
  4. Persistence
  5. Clustering
  6. 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 어라운드 허브 스튜디오