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);
}
먼저, Spring Data Redis를 프로젝트에 추가
Gradle:
implementation ‘org.springframework.boot:spring-boot-starter-data-redis’
Redis를 사용하기 위해 application.properties 또는 application.yml 파일에서 Redis 연결 설정
application.properties:
spring.redis.host=localhost
spring.redis.port=6379
여기서 localhost와 6379는 Redis가 로컬에서 기본적으로 사용하는 설정이고 만약 Redis가 다른 서버에서 실행 중이라면 해당 정보를 여기에 넣어야 한다.
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
공부해서 추가할 예정입니다!