Redis 내가 아는 것 정리

Sun choi·2024년 9월 25일

NEW 지식

목록 보기
25/34

레디스는 빠르다⚡️

왜 빠르냐 3가지 이유

1 모든 데이터가 메모리에 저장된다
2 레디스가 모든 데이터를 아주 단순한 구조로 관리하기 때문
3 기본적으로 아주 단순하기 때문

하지만 휘발된다💨

만료시간을 설정하는 이유

레디스는 본래 캐싱 서버로 설계됨
특정 데이터를 특정 시간동안만 보관하다 필요하지 않게 되면 삭제한다

자동으로 새로운 피드를 레디스에 업데이트하지 않을 수 있다
왜냐면 레디스는 모든 데이터를 메모리에 저장하는데
메모리 용량이 부족하므로 레디스에 모든 피드를 저장할 수 없는것
그래서!!! 특정 피드가 마지막으로 액세스된 후 지정된 시간이 지나면
피드를 삭제하는 게 필요함

단순조회 할 때 많이 사용된다
잘 변경되지 않는 데이터에 쓴다
근데 조회하는데 좀 시간이 걸리는 데이터들

API가 레디스에 체크 -> 없다(캐시 미스라고 함)-> 기존 데이터베이스에서 가져옴
-> 레디스에 잠시 저장 -> API가 다시 그 피드가 필요-> 레디스에서 가져옴
-> 레디스 지정시간이후 만료 삭제-> API 레디스에 체크 … 반복

디자인 고려사항

1 어떤 타입 데이터를 저장하는지
2 데이터 크기 고려 (캐싱하며 데이터가 너무 큰 크기인지/
동일한 내용을 보면 내용이 많이 변하지 않은 페이지 들은 렌더링하면 잘 변하지 않음-회원가입, 로그인 페이지 등) -> 어떤 특정 페이지를 캐싱할지 말지 결정
커스텀 페이지를 렌더링하는건 크기가 너무 커서 비추다
3 데이터가 만료 시간
4 키 이름 명명 규칙
5 비즈니스 로직은 고려하지 않는다

키는 고유한 이름으로!

다른 엔지니어가 봤을때 어떤 역할을 하는지 이해하기 쉽게 단순한 이름X
바로 이해하기 쉬운 이름
users:posts:901 유저가 작성한 포스트 아이디 901번 # 사용 -> users:posts#901
pagecache#/auth/signup 이런 방식

해시를 사용해 여러 단계로 중첩된 키-값 쌍은 저장할 수 없다
제이슨 형태로 저장
해시의 키-값 쌍에서는 숫자 또는 문자열만 값이 될 수 있다.

HEXISTS 는 값이 있냐 없냐만 체크 있으면 1 반환( 그게 잘못된 값이어도 널이어도 그냥 1)

다른 데이터베이스나
데이터베이스 클라이언트를 사용할 때는
null이나 undefined 값을 저장해도 되지만 Redis에서는 할 수 없다!
그래서 owner: null || ‘ ‘ 이런 식으로 해줘야 정상 작동한다.

동기식으로 작동

레디스는 수신한 순서에 따라 명령어를 하나씩 수신한다

항상 동시성을 고려해야 한다
다양한 요청을 처리할 때 동시성을 고려해야 한다는 것을 알 수 있다.

레디스에 리스트 형태로 저장하는 로직

public void saveList(String key, List<String> list) {
        // 리스트 저장
        redisTemplate.opsForList().rightPushAll(key, list);
    }

    public List<String> getList(String key) {
        // 전체 리스트 조회
        return redisTemplate.opsForList().range(key, 0, -1);
    }

    public void addToList(String key, String value) {
        // 리스트에 값 추가
        redisTemplate.opsForList().rightPush(key, value);
    }

    public String popFromList(String key) {
        // 리스트에서 값 제거
        return (String) redisTemplate.opsForList().rightPop(key);
    }


Redis를 IntelliJ와 Spring 애플리케이션에서 사용하는 방법 🪐

1. Redis 의존성 추가

먼저, Spring Data Redis를 프로젝트에 추가
Gradle:

implementation ‘org.springframework.boot:spring-boot-starter-data-redis’

2. Redis 설정

Redis를 사용하기 위해 application.properties 또는 application.yml 파일에서 Redis 연결 설정

application.properties:
spring.redis.host=localhost
spring.redis.port=6379

여기서 localhost와 6379는 Redis가 로컬에서 기본적으로 사용하는 설정이고 만약 Redis가 다른 서버에서 실행 중이라면 해당 정보를 여기에 넣어야 한다.

3. Redis 설정 Bean 등록

Redis 템플릿을 사용하려면 RedisTemplate과 같은 Bean을 설정.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
  @Bean
  public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(connectionFactory);
    // Key serializer
    template.setKeySerializer(new StringRedisSerializer());
    // Value serializer
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    return template;
  }
}

이 설정으로 String 타입의 키와 JSON으로 직렬화된 값을 Redis에 저장하고 읽을 수 있다.

그리고 컨트롤러와 서비스 클래스를 구현하고 터미널 통해 레디스 서버 실행!

docker run --name redis -p 6379:6379 -d redis

  • 직렬화/역직렬화
    다른 데이터구조
    동시성 문제

공부해서 추가할 예정입니다!

profile
풀스택 개발자의 공부기록 📖

0개의 댓글