Radis는 NoSQL 데이터 베이스 중 하나로 In-memory라는 특징이 있다.
메모리 스토어는 서버를 재시작 하는 순간 모두 날아간다. 그렇기에 우리는 데이터베이스를 사용한다. 다만, 데이터베이스는 접근 및 커넥션을 유지하는데 비용이 많이 든다. 심지어 간단한 데이터를 데이터베이스에 저장하기에 비용이 많이 들고, 속도도 느리기에 나온 것이 Radis이다.
데이터베이스라 데이터가 어느 정도 유지가 되면서 데이터를 불러올 때 메모리에 로드하기 때문에 접근 속도가 매우 빠르다.
또한, Pub/Sub 서버로도 많이 사용하며, 알림 같은 것을 미리 받도록 신청하고 알림 상황이 발생하면 구독 했던 클라이언트들에게 알림을 전달하는 것으로 유용하다.
단점으로는 데이터가 항상 정확하게 유지됨을 보장하지 않음. 그렇기에 유지되면 좋지만 날아가도 서비스에 크게 문제 없는 데이터를 저장하는게 베스트이다.
express에서 사용하기에 아래와 같이 설치 및 설정한다.
npm i redis express-session connect-redis;
app.js
import session from 'express-session';
import connectRedis from 'connect-redis';
import redis from 'redis';
import express from 'express';
const client = redis.createClient(); // {port, url, hostname}, 기본포트 6379
const RedisStore = connectRedis(session);
const app = express();
app.use( session({...store: new RedisStore({client: client, logError: true}) );
express-session
의 store 옵션에 RedisStore
가 있으므로, 세션에 데이터가 저장될때 redis
에 key-value로 저장된다.
시작하기에 앞서 우선 redis가 설치 되어있어야하며, mac에서는 home brew로 설치 할 수 있다.
$brew install redis
설치가 완료되면 redis-server
로 실행이 된다.
실행시키면 아래에 도시락 같은 그림이 보일 것이다.
그 다음으로 redis-cli
를 실행시켜보자.
127.0.0.1:6379>
위에 처럼 커맨드 창이 나온다. 만약 다른 port로 접속한다면 redis-cli -p 3333
로 설정 할 수 있다.
외부 서버에 접속하기 위해서는 redis.conf
파일을 변경 해야하며, redis
접속 시 비밀번호 설정도 할 수 있다.
redis.conf
파일에 있는 requirepass를 찾아 foobared라고 되어있는 곳에 비밀번호를 입력하면 비밀번호 설정이 되며, bind를 찾아 127.0.0.1로 되어있는 부분을 지우고 0.0.0.0으로 수정한 뒤 redis.conf
파일을 저장 후 redis를 재 시작 해주면 끝이다.
커맨드 창에서 key들의 목록을 보려면 아래와 같이 작성하면 된다.
keys *
key-value를 보기 위해선 아래와 같이 작성하면 된다.
get key
key-value를 하나하나 삭제할 때 사용한다. get과 비슷하다.
del key
key-value 모두 삭제할 때는 아래와 같다.
127.0.0.1:6000> flushall
OK
(1.18s)
127.0.0.1:6000> flushall async
OK
or
127.0.0.1:6000> flushdb
OK
(1.18s)
127.0.0.1:6000> flushdb async
OK
둘다 비동기로 처리했을 때 걸리는 시간은 1ms미만으로 걸린다고 한다.
key-value으로 되어있는 문자열 자료구조이다. set
으로 설정하고 get
으로 가져온다. 세션과 동일하다.
client.set('name', 'heumheum2');
client.get('name', (err, reply) => {
console.log(reply); // heumheum2
});
key-hash로 되어있는 구조. hmset
으로 설정하고 hgetall
로 가져온다.
client.hmset('class', 'name', 'heumheum2', 'age', 26);
client.hgetall('class', (err, obj) => {
console.log(obj); // {name: 'heumheum2', age: 24}
});
키 - 셋으로 되어있는 구조. 배열과 비슷하지만 중복을 허용하지 않음.
client.sadd('phone', 'iphone', 'galaxy', 'iphone');
client.smembers('phone', (err, set) => {
console.log(set); // ['iphone', 'galaxy']
});
중복되는 값은 무시되는 것을 볼 수 있음.
키 - 정렬 셋으로 되어있는 구조. set이지만 순서를 정렬 할 수 있음. 오름차순이 기본값이며 내림차순으로 정렬하고 싶다면 zrevrange
를 이용하면 된다.
client.zadd('height', 181, 'heumheum2', 170, 'hello', 168, 'world');
client.zrange('height', 0, -1, (err, sset) => {
console.log(sset); // ['world', 'hello', 'heumheum2']
});
client.del('name');
client.exists('name'); // 있으면 1 없으면 0
client.rename('name', 'title');