[Redis] Redis란 ?

resilient

·

2021. 8. 20. 14:38

728x90
반응형

 

최근 공부를 하면서 트래픽 관리를 어떻게 하는지 공부를 하던 도중, node.js 에서 트래픽 분산처리를 할 때 어떤 방식을 사용하는지 찾아보다가 redis를 이용한 방법을 알게 되었습니다

 

이번 게시물에서는 Redis에 대해서 공부한 내용을 정리해보려고 합니다.

 

Redis 란?

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams.

일반적으로 우리가 사용하는 MySQL이나 MongoDB같은 데이터 베이스는 접근하고, 커넥션을 유지하고 하는 데 비용이 많이 듭니다. 캐시나 세션은 간단한 데이터를 사용해서 저장해도 되는데, 데이터베이스에 저장하기에는 비용도 많이 들고 속도도 상대적으로 느립니다.

이를 해결하기위한(?) DB가 Redis 입니다!

 

Redis는 NoSQL 데이터 베이스의 한 종류로, 메모리 내 데이터 구조 저장소이고, 데이터 베이스, 캐시 및 메시지 중개인으로 사용됩니다. Redis는  MySQL이나 mongoDB 처럼 전체 데이터를 영구저장하기 보다는 캐시나 세션처럼 휘발성이나 임시성 데이터를 저장하는데 많이 사용됩니다. 디스크에 데이터를 주기적으로 저장하기는 하지만,  기능은 백업이나 복구용으로 주로 사용할뿐 데이타는 모두 메모리에 저장되기 때문에, 빠른 접근 속도를 가지고 있습니다.

 

Redis의 단점으로는 데이터가 항상 정확하게 유지된다고 보장할 수 없습니다.

따라서 데이터가 변형되고 사라져도 서비스 자체에 큰 지장이 없는 데이터를 Redis에 담아서 사용하는 것이 좋아요!

 

Node.js에서의 Redis

 

기본적으로 node.js는 하나의 코어만을 사용합니다.

하지만 트래픽이 증가하고 처리할 데이터의 양이 많아지면 코어 수만큼 프로세스를 생성해서 분산처리를 해야 합니다.

코어 수만큼 프로세스를 생성해주는 게 cluster라는 것입니다!

cluster을 구성하게 되면, 세션 간에 데이터가 공유되지 않아서 문제가 발생하게 되는데, 이를 해결하는 방법이 redis입니다.

 

또한 Redis는 발행/배포(Pub/Sub) 서버로도 많이 사용됩니다!

하나의 클라이언트가 다른 클라이언트로 메시지를 보내는 1대1 뿐만이 아니라, 하나의 클라이언트가 다수의 클라이언트에게 메세지를 발송하게 할 수 있습니다.


Redis의 자료구조


먼저 아래와 같이 Redis를 설치한 뒤 예시를 살펴볼까요?

 Redis도 DB의 종류이기 때문에 당연히 데이터베이스 프로그램을 따로 설치해서 실행해야 합니다.

npm install redis
const redis = require('redis');
const client = redis.createClient();

 

나머지 코드는 데이터베이스를 연결 한 뒤, 이어서 쓰면 됩니다!

 

Redis의 가장 기본이 되는 자료구조를 살펴봅시다. Redis는 다양한 자료구조를 지원하는데, 지원하는 자료구조형은 다음과 같습니다.

 

  • string
    • 먼저 가장 일반적인 key-value 문자열 구조입니다.. set으로 설정하고 get으로 가져옵니다.
    • client.set('name', 'skc'); 
      client.get('name', (err, reply) => { 
      console.log(reply); // skc 
      });
  • hash
    • key-hash 구조입니다. 객체를 저장한다고 생각하면 됩니다. hmset으로 설정하고 hgetall로 가져옵니다
    • client.hmset('myInformation', 'name', 'skc', 'age', 26);
      client.hgetall('myInformation', (err, obj) => {
        console.log(obj); // { name: 'skc', age: '26' }
      });
  • list
    • key-list(array) 구조입니다. . 중복 데이터를 허용합니다. rpush는 자바스크립트의 push랑 비슷하고, lpush는 unshift랑 비슷합니다. 가져올 때는 lrange 메서드를 이용하면 됩니다. 일반적인 자료구조에서 Linked List와 같은 자료구조라고 생각하면 됩니다.
    • client.rpush('fruits', 'apple', 'orange', 'apple');
      client.lpush('fruits', 'banana', 'pear');
      client.lrange('fruits', 0, -1, (err, arr) => {
        console.log(arr); // ['pear', 'banana', 'apple', 'orange', 'apple']
      });
  • set
    • key-set 구조입니다.  위에 list와 비슷하지만 집합 구조이기 때문에 중복을 허용하지 않습니다.
    • client.sadd('animals', 'dog', 'cat', 'bear', 'cat', 'lion');
      client.smembers('animals', (err, set) => {
        console.log(set); // ['cat', 'dog', 'bear', 'lion']
      });
  • sorted set
    • key-sortedset 구조입니다.  set구조와 같은데 순서를 정렬할 수 있습니다. 데이터를 저장할 때, value 이외에 score이라는 값을 같이 저장하고 score라는 값에 따라서 데이터를 정렬한다. 순차성이나 순서가 중요한 데이터를 저장할 때 유용합니다.
      예시에서 key 순으로 정렬 해볼까요?
    • client.zadd('height', 180, 'skc', 168, 'skd', 176, 'ske', 172, 'skf');
      client.zrange('height', 0, -1, (err, sset) => {
        console.log(sset); // ['skf', 'ske', 'skd', 'skc'
      });

 

 

더 많은 메서드들은 당연히 Redis 공식 홈페이지에 들어가서 찾아보면 많고, 더 자세하게 설명되어 있습니다!

반응형

'Back-end > DB' 카테고리의 다른 글

[MongoDB] Mongoose 사용시 ObjectId 와 String의 관계  (0) 2021.10.29
[MySQL]COALESCE  (0) 2021.05.06
[MySQL] like ('%',?,'%')  (0) 2021.03.19
[MySQL] group_concat  (0) 2021.03.01
[MySQL]이벤트스케줄러 생성 (Event Scheduler)  (0) 2021.03.01