[ DB ] Redis
in BackEnd
REDIS
키 밸류 스토리지라고도 불리는 NoSQL이다.
특이하게 마치 객체처럼 저장됨.
사람들이 보통 웹사이트를 구경하면서 게시판 혹은 상품목록 1페이지에는 어마무시하게 들어오기때문에
들어올때마다 mysql을 조회하게 만들면 속도도 그렇고 디비가 부하가 걸리므로
이 1페이지는 레디스에 저장해놓는다.
1페이지 10개를 레디스에 임시저장을 해놓고 100만명이 접속했을때는 레디스에 들어있는거 보내준다.
100만명에게 최상의 속도를 제공해줄 수 있다.
그 다음에는 mysql에서 제대로 꺼내주면 된다.
레디스의 목표는 mysql까지 가지 않도록 해주기 위함이라고 봐도 된다.
빠른검색용(Cache-Aside패턴) vs 임시저장용(Write-Back패턴)
빠른검색용(Cache-Aside) : MySQL보다 빠른 redis에서 가져오자 (캐싱)
Cache-Aside 패턴을 언제 사용할까?
게시판, 공지사항 등 1페이지 캐싱
한번 검색한 것 다음사람 검색 빠르게 하기 위해 cache-aside
등록 요청이 너무 많이 동시에 들어올 때, MYSQL 못버팀
=> Redis 먼저 저장, 천천히 꺼내서 옮기기(=write-back)
Redis에 데이터가 있을때 :
브라우저에서 백엔드에 검색요청을 날린다
백엔드 서버에서는 레디스에 ‘검색결과 있음?’ 이라고 물어본다 (=검색결과를 캐싱한다)
그럼 레디스가 ‘응 있음’ 이라고 하면 (=Cache-Hit)
검색결과를 브라우저에 되돌려 준다 (= 걸리는 속도를 TTL이라고 한다)
Redis에 데이터가 없을때 :
브라우저에서 백엔드에 검색요청을 날린다
백엔드 서버에서는 레디스에 ‘검색결과 있음?’ 이라고 물어본다
그럼 레디스가 ‘어 없는데’ 이라고 하면 (=Cache-Miss)
MySQL에 다시 물어본다. ‘레디스에서는 없다는데 너는 있음?’
MySQL이 ‘응 있어’ 라고 하면
백엔드 서버에서 레디스에게 ‘야 MySQL은 있대. 너도 잘 저장해놔’ 라고 함
그리고 MySQL에서 받아온 결과를 브라우저에 되돌려줌
임시저장용(Write-Back패턴) : MySQL보다 빠른 redis에 임시저장하자
Redis와 프로젝트 연결하기
프로젝트에서 docker-compose.yaml
파일에 아래에 my-redis라고 추가해준다.
my-redis:
image: redis:latest #실무에서는 가장 최신으로 하지 않는다. 배포할때는 안전한 버전으로 진행함
ports:
- 6379:6379
만약 레디스설정만 올리고 싶다면
docker-compose build my-redis
docker-compose up my-redis
로 빌드해준다.
Redis 접속
redis에 접속해보자. 터미널에서 설정해준다.
docker ps
docker exec -it 레디스컨테이너아이디 /bin/bash
//root@b1051f38addd:/data#
redis-cli
//127.0.0.1:6379>
Cli 명령어는 제일 밑에 적어두었다.
Nest.js에서 Redis에 등록하는 법
NestJS에서 제공하는 모듈을 설치해주어야한다.
yarn add cache-manager
yarn add redis
yarn add cache-manager-redis-store@2.0.0
yarn add --dev @types/cache-manager-redis-store
app.module.ts
에서
CacheModule.register<RedisClientOptions>({
store: redisStore,
url: 'redis://my-redis:6379',
isGlobal: true,
}),
를 추가해준다.
그리고 레디스를 사용하고 싶은 ts파일에서
생성자 안에 CACHE_MANAGER를 주입해준다
@Inject(CACHE_MANAGER)
private readonly cacheManager: Cache,
) {}
// 원하는 함수 안에 redis로 설정해주기
//1. 캐시에서 설정
await this.cacheManager.set('aaa', createBoardInput, {
ttl: 0,
});
// 2. 캐시에서 조회
const mycache = await this.cacheManager.get('aaa');
console.log(mycache);
this.cacheManager.set
으로 설정해주고 나서는 터미널에서 redis에서 keys *
로 조회가 가능하다
$ set name(키) apple(값)
//OK
$ get name(키)
//"apple"(값)
$ ttl name //저장되는 시간
//(integer) -1 =>-1은 영구저장을 뜻한다. 근데 메모리저장이라 컴퓨터가 꺼지면 자동으로 날아감
$ expire name 20 //시간설정
//(integer) -2 => 시간만료
$ get name
//(nil) //20초 이후 시간이 만료되서 없어짐
$ keys * //모든 키 조회
//(empty array)
$ flushall //전체 삭제
//OK