Redis 란?
메모리 기반의 데이터 저장소 휘발성을 가진 저장소이다. 비관계형 데이터베이스이자, key value 로 관리하는 cashe 같은 존재입니다.
- Disk 가 아닌 메모리에 데이터를 저장
- 싱글 스레드
- 초당 5만~25만 Request 실행가능
- key-value 형식으로 데이터 저장
Redis 구조
구조는 총 4가지로 나뉘게 된다. Stand Alone, Master-Slave, Sentinel, Cluster 가 있다. 아래의 사진으로 설명을 대신 하겠다.
Redis의 장단점
장점 : Read/ Write 속도
- Hardware 차이에서 오는 기본적인 performance gap
- 다양한 type의 아키텍쳐를 지원. ( Single, Master-Slave, Sentinel, Cluster)
- Partitioning
- Popular
단점 : 휘발성
- AOF, RDB Snapshot 을 통해 Disk 에 저장하여 휘발성 문제를 해소
- Single Thread
- Memory Fragmentation
- Big Size Data 에 적합하지 않다.
목적 : Caching
- 많은 데이터 중에 반복적으로 요구되거나, 특별히 빠른 입/출력이 필요한 데이터를 잘 선별하여 쓰는게 좋은 사용사례.
Redis 라이브러리 Lettuce vs Jedis
요약하자면,
Lettuce : 개발 복잡도가 낮다.
Jedis : 다양한 옵션이 존재한다.
개인적으로는 Lettucs 가 더 좋다는 게시글이 있기는 하다.
관련 블로그 : https://jojoldu.tistory.com/418
Redis Data Type
String : 1:1 관계
Lists : 순서존재, Queue와 Stack 으로 사용된.
Sets : 순서와 관계없이 저장, 중복 불가
Sorted Sets : ZSET 이라고 불리며, Score 개념이 존재 Set 과 같은데 정렬이 필요한곳에 쓴다.
Hashes : Field:Value 여러 커플이 존재하고 RDB 의 Tables 개념으로 많이 사용함.
Redis 사용 예시
Redis ( 기간한정, 빠른 반환 )
- 장바구니: 로그인 동시에 Caching 되거나 비 로그인시 임시로 저장되는 정보.
- temporary User 정보 : 로그인과 동시에 Caching 되는 정보
- 할인정보 : 특정기간 * 특정 상품의 할인정보
- 쿠폰정보 : 제품별 할인을 위한 정보
- 배송정보 : 배송현황 제공을 위한 정보
- 토큰정보, 세션정보 : 로그인 시, 로그인 상태 유지를 위함.
- 광고 : User별, 상품별, Seller 별
- 채팅정보 : 채팅시 ~ 채팅 종료까지
- 그 밖의 Cashe 들
Spring + redis / Spring Data Redis
Gradle
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-data-redis-reactive'
testImplementation 'io.projectreactor:reactor-test'
우선적으로는 Repository 를 이용하여 JPA 와 비슷하게 관리를 하게 된다.
TestRedis 를 만들고 TestRedisRepository 를 만들어 관리하게 된다. 먼저 Redis Config 해야 한다.
@Configuration
@RequiredArgsConstructor
public class RedisConfig {
private final RedisProperties redisProperties;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(
redisProperties.getHost(),
redisProperties.getPort()
);
}
@Bean
@Primary
public RedisTemplate<String, Object> redisTemplate(){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory()); //redis 연결
redisTemplate.setKeySerializer(new StringRedisSerializer()); //Key는 String 으로 하는데 Serializer 는 직렬화.
redisTemplate.setValueSerializer(new StringRedisSerializer()); //value 도 동일.
return redisTemplate;
}
}
@Getter
@RequiredArgsConstructor
@ToString
@RedisHash("test")
public class TestRedis {
@Id
private String id="test";
private String key;
private String value;
@TimeToLive
private int second=5;
public TestRedis(String key, String value) {
this.key = key;
this.value = value;
}
}
위와 같이 TimeToLive 를 쓰게 되면, 5초뒤에 사라지는 휘발성 기능을 이용하게 된다. 안쓸시에는 계속 캐쉬에 올려둘수가 있다.
@Repository
public interface TestRedisRepository extends CrudRepository<TestRedis, String> {
}
이제 한번 써보자.
@GetMapping("/test")
public void test(){
redisRepository.save(new TestRedis("키","값"));
}
@GetMapping("/test1")
public void test1(){
TestRedis testRedis = redisRepository.findById("test")
.orElseThrow();
System.out.println("t? : "+testRedis.toString());
redisRepository.delete(testRedis);
}
이런식으로 Id 의 값을 가져와서 삭제 또는 수정을 할수 있고 물론 추가도 가능하다.
@RedisHash("test")
'Spring' 카테고리의 다른 글
Validation 유효성 검증 (2) | 2023.06.02 |
---|---|
Redis (2) (0) | 2023.06.01 |
Spring ControllerAdvice, RestControllerAdvice, ExceptionHandler (0) | 2023.05.27 |
Lombok (0) | 2023.05.27 |
WebSocket(2) (0) | 2023.05.25 |