[ DB ] Redis


레디스

REDIS

키 밸류 스토리지라고도 불리는 NoSQL이다.

특이하게 마치 객체처럼 저장됨.



사람들이 보통 웹사이트를 구경하면서 게시판 혹은 상품목록 1페이지에는 어마무시하게 들어오기때문에

들어올때마다 mysql을 조회하게 만들면 속도도 그렇고 디비가 부하가 걸리므로

이 1페이지는 레디스에 저장해놓는다.

1페이지 10개를 레디스에 임시저장을 해놓고 100만명이 접속했을때는 레디스에 들어있는거 보내준다.

100만명에게 최상의 속도를 제공해줄 수 있다.

그 다음에는 mysql에서 제대로 꺼내주면 된다.

레디스의 목표는 mysql까지 가지 않도록 해주기 위함이라고 봐도 된다.




빠른검색용(Cache-Aside패턴) vs 임시저장용(Write-Back패턴)


빠른검색용(Cache-Aside) : MySQL보다 빠른 redis에서 가져오자 (캐싱)



Cache-Aside 패턴을 언제 사용할까?

  1. 게시판, 공지사항 등 1페이지 캐싱

  2. 한번 검색한 것 다음사람 검색 빠르게 하기 위해 cache-aside

  3. 등록 요청이 너무 많이 동시에 들어올 때, MYSQL 못버팀

    => Redis 먼저 저장, 천천히 꺼내서 옮기기(=write-back)


Redis에 데이터가 있을때 :

  1. 브라우저에서 백엔드에 검색요청을 날린다

  2. 백엔드 서버에서는 레디스에 ‘검색결과 있음?’ 이라고 물어본다 (=검색결과를 캐싱한다)

  3. 그럼 레디스가 ‘응 있음’ 이라고 하면 (=Cache-Hit)

  4. 검색결과를 브라우저에 되돌려 준다 (= 걸리는 속도를 TTL이라고 한다)



Redis에 데이터가 없을때 :

  1. 브라우저에서 백엔드에 검색요청을 날린다

  2. 백엔드 서버에서는 레디스에 ‘검색결과 있음?’ 이라고 물어본다

  3. 그럼 레디스가 ‘어 없는데’ 이라고 하면 (=Cache-Miss)

  4. MySQL에 다시 물어본다. ‘레디스에서는 없다는데 너는 있음?’

  5. MySQL이 ‘응 있어’ 라고 하면

  6. 백엔드 서버에서 레디스에게 ‘야 MySQL은 있대. 너도 잘 저장해놔’ 라고 함

  7. 그리고 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









© 2018. by sora

Powered by sora