SlideShare une entreprise Scribd logo
1  sur  30
박진호
 Node 및 Redis 시작
 게임 순위표 만들기
 메시지 큐 만들기
 Express 애플리케이션에 Stats 미들웨어 추
가
 메모리 내의 키/ 값 저장소로 유명
 Node는 Redis, Memcached,Cassandra 모두
지원
 빠른 액세스를 위해 데이터 쿼리를 메모리
상에 캐시하기 위해 사용
 분산 컴퓨팅에도 적합
 복잡한 데이터에 대해서는 제한된 지원만을
제공
 대량의 쿼리를 처리하는 애플리케이션에는
유용하지만, 데이터를 읽고 쓰는 것이 많은
애플리케이션에서는 유용성이 떨어짐
 http://memcached.org/
 MemCached 처럼 클러스터 지원
 MemCached와 마찬가지로 지원하는 데이
터 구조가 제한
 Redis에 적합하지 않은 임시 쿼리를 처리하
는데 알맞음
 http://cassandra.apache.org/
 데이터를 읽고 쓰는 것이 많은 곳에 사용
 영속적으로 저장 가능
 다양한 유형의 데이터를 지원.
(Memcached에 비해 더 많은 유연성 제공)
 Cassandra에 비해 빠름.
 단일 머신에서만 구동.
 Http://redis.io/
 https://github.com/dmajkic/redis/downloads
 데이터베이스를 이용하면 데이터를 영속적으
로 관리할 수 있지만, 입출력에 다소 시간이 걸
리기 때문에 실시간 서비스에서는 더 적합한
저장소를 사용할 필요
 Redis는 메모리 기반의 저장소이기 때문에 필
요한 정보를 빠르게 저장하고 가져올 수 있는
실시간 서비스에 적합한 저장소
 멤버 id, 플레이어 이름, 게임이름, 마지막 플레
이한 날짜, 점수, 나머지 관련 정보 저장.
 https://github.com/dmajkic/redis/downloads
 Redis를 사용하여 구현.
 npm install redis
 hiredis라는 공식적인 hiredis C 라이브러리를
바인딩하여 Non-Blocking의 빠른 모듈
 npm install hiredis redis
 Async 설치 (series 기능 사용하기 위함. 호출이
순서대로 호출되고 데이터 역시 순서대로 반환
보장)
 npm install async
 Redis 모듈 포함
 Var redis = require(‘redis’);
 Redis 클라이언트 생성
 Var client = redis.createClient();
 3개의 선택적인 파라미터
▪ Port : 6379
▪ Host : 127.0.0.1
▪ 옵션 : parser, return_buffers, detect_buffers, socket_nodelay,
no_ready_check
 연결 종료
 Client.quit();
 강제 종료
 Client.end();
 Redis 모듈 포함
 Var redis = require(‘redis’);
 Redis 클라이언트 생성
 Var client = redis.createClient();
 3개의 선택적인 파라미터
▪ Port : 6379
▪ Host : 127.0.0.1
▪ 옵션 : parser, return_buffers, detect_buffers, socket_nodelay,
no_ready_check
 연결 종료
 Client.quit();
 강제 종료
 Client.end();
 Redis 해시 속성 설정
Client.hset(“hashid”, “propname”, “propvalue”,
function(err, reply)
{
오류 혹은 응답에 대해 무엇인가를 수행
} );
 성공 확인 응답
 Rredis.print
▪ 에러나 응답을 콘솔에 출력 후 반환
 Client.hset (“hashid”, “propname”, “propvalue”,
redis.print);
var net = require('net');
var redis = require('redis');
var server = net.createServer(function(conn) {
console.log('connected');
// create Redis client
var client = redis.createClient();
client.on('error', function(err) {
console.log('Error ' + err);
});
// fifth database is game score database
client.select(5);
conn.on('data', function(data) {
console.log(data + ' from ' + conn.remoteAddress +
' ' +
conn.remotePort);
try {
var obj = JSON.parse(data);
// add or overwrite score
client.hset(obj.member, "first_name",
obj.first_name, redis.print);
client.hset(obj.member, "last_name",
obj.last_name, redis.print);
client.hset(obj.member, "score", obj.score,
redis.print);
client.hset(obj.member, "date", obj.date,
redis.print);
// add to scores for Zowie!
client.zadd("Zowie!", parseInt(obj.score),
obj.member);
} catch(err) {
console.log(err);
}
});
conn.on('close', function() {
console.log('client closed connection');
client.quit();
});
}).listen(8124);
console.log('listening on port 8124');
 var net = require('net');
var client = new net.Socket();
client.setEncoding('utf8');
// connect toTCP server
client.connect
('8124','examples.burningbird.net',
function () {
console.log('connected to server');
});
// prepare for input from terminal
process.stdin.resume();
// when receive data, send to server
process.stdin.on('data', function (data) {
client.write(data);
});
// when receive data back, print to console
client.on('data',function(data) {
console.log(data);
});
// when server closed
client.on('close',function() {
console.log('connection is closed');
});
 두개의 다른 데이터 저장소가 업데이트 됨.
 개별적인 점수 정보(이름, 점수, 날짜를 포
함)은 hash에 저장
 Client.hset ( obj.member, “first_name”,
obj.first_name, redis.print );
 멤버 id 와 점수는 sorted set에 저장
 Client.zadd( “Zowie!”, parseInt(obj.score),
obj.member );
 Score.jade
 Doctype 5  doctype html
 doctype html
html(lang="en")
head
title Zowie!Top Scores
meta(charset="utf-8")
| <style type="text/css">
include main.css
| </style>
body
table
caption Zowie!Top Scorers!
tr
th Score
th Name
th Date
if scores.length
each score in scores
if score
tr
td #{score.score}
td #{score.first_name} #{score.last_name}
td #{score.date}
 body {
margin: 50px;
}
table {
width: 90%;
border-collapse: collapse;
}
table,
td,
th,
caption {
border: 1px solid #000;
}
td {
padding: 20px;
}
 caption {
font-size: larger;
background-color: #ff0;
padding: 10px;
}
h1 {
font: 1.5em Georgia, serif;
}
ul {
list-style-type: none;
}
form {
margin: 20px;
padding: 20px;
}
 var http = require('http');
var async = require('async');
var redis = require('redis');
var jade = require('jade');
// set up Jade template
var layout =
require('fs').readFileSync(__dirname +
'/score.jade', 'utf8');
var fn = jade.compile(layout, {filename:
__dirname + '/score.jade'});
// start Redis client
var client = redis.createClient();
// select fifth database
client.select(5);
// helper function
function makeCallbackFunc(member) {
return function(callback) {
client.hgetall(member, function(err, obj) {
callback(err,obj);
});
};
}
 http.createServer(function(req,res) {
// first filter out icon request
if (req.url === '/favicon.ico') {
res.writeHead(200, {'Content-Type': 'image/x-
icon'} );
res.end();
return;
}
// get scores, reverse order, top five only
client.zrevrange('Zowie!',0,4, function(err,result) {
var scores;
if (err) {
console.log(err);
res.end('Top scores not currently available,
please check back');
return;
}
 // create array of callback functions for
Async.series call
var callFunctions = new Array();
// process results with
makeCallbackFunc, push newly returned
// callback into array
for (var i = 0; i < result.length; i++) {
callFunctions.push(makeCallbackFu
nc(result[i]));
}
 // using Async series to process each callback in
turn and return
// end result as array of objects
async.series(
callFunctions,
function (err, result) {
if (err) {
console.log(err);
res.end('Scores not available');
return;
}
// pass object array to template engine
var str = fn({scores : result});
res.end(str);
});
});
}).listen(3000);
console.log('Server running on 3000/');
 메시지 큐
 특정한 통신 형식을 입력으로 받아 큐에 저장하
는 애플리케이션
 메시지는 메시지 수신자가 가져갈 때 까지 저장
되었다가 해당 시점에 큐에서 뽑혀져서 수신자
에게 전송(한번에 하나씩 혹은 대량))
 통신은 비동기로 이루어짐
 메시지 큐를 보여주기 위해 여러 개의 다양한 하위
도메인에 대한 웹 로그 파일에 접근하는 애플리케이
션
 메시지 큐 애플리케이션이 수행하는 것은 3000번에
서 메시지를 수신대기하다가 전송된 항목을 Redis
데이터 저장소로 저장
 로그 항목을 받은 후 로그 데이터에서 이미지 리소
스(jpg, gif 등)가 접근되었는지를 찾아보는 정규식
검사를 수행. 일치하는 패턴이 발견되면 리소스 URL
을 메시지 큐 애플리케이션에 전송
 Redis 클라이언트를 만들어서 애플리케이션이 종료될
때 까지 지속?
 Redis 클라이언트를 만든 후 Redis 명령어를 실행하자 마
자 바로 해제?
 영구적이 좋은가? 즉시 해제하는 것이 좋은가?
 클라이언트 연결유지가 더 빠를것이라는 예상 맞음. 연결을
유지하는 경우를 테스트 하는 도중 애플리케이션이 잠시 동
안 상당히 느려졌다가 상대적으로 빠른 속도를 회복
 Redis 데이터베이스에 대해 대기 중인 요청들이 큐가 해제도
리 때 까지 Node 애플리케이션을 일시적으로 차단시켰기 때
문. 매번 요청할 때마다 연결을 열고 닫는 경우에는 동일한 상
황을 겪지 않았는데, 열고 닫는 과정에 들어가는 추가 오버헤
드가 애플리케이션의 성능을 저하시켜서 동시 사용자 상한선
에 도달하지 않았기 때문
 이전 장들에서 만들어본 위젯 애플리케이션
에 통계를 추가하기 위해 Redis를 사용
 통계는 위젯 애플리케이션의 페이지에 접근
하는 모든 ip 주소들의 집합과 각 리소스가
접근된 횟수라는 두개로 제한
 두 개의 분리된 데이터 컬렉션을 한번에 가
져오기 위해 redis 트랜잭션을 제어하는
multi 사용
 1. Redis 데이터 베이스에 접근 정보를 기록
하기 위한 새로운 미들웨어 추가
 Ip 주소를 추가
▪ Client.sadd(‘ip’, req.socket.remoteAddress);
 리소스 카운트 증가
▪ Client.hincrby(‘myurls’, req.url, 1);
 2. routes/index.js
 통계 애플리케이션에서 새로운 컨트롤러 코드를 가진 라우팅 색인 파일
 통계 인터페이스는 최상위 도메인에서 접근되므로 routes 폴더에 추가.
 Express 4에서 에러나는 부분들…. 좀 더 찾아봐야…
 app.use(express.favicon()); app.use(express.logger('dev'));
app.use(express.staticCache({maxObjects: 100, maxLength: 512}));
 app.use(express.bodyParser());
 app.use(express.methodOverride());
 app.use(app.router);
 app.use(express.directory(__dirname + '/public'));
 app.use(function(req, res, next){ throw new Error(req.url + ' not found'); });
app.use(function(err, req, res, next) { console.log(err);
res.send(err.message); });
감사합니다

Contenu connexe

Tendances

닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기흥배 최
 
Node.js 자바스크립트로 서버사이드 개발하기
Node.js 자바스크립트로 서버사이드 개발하기Node.js 자바스크립트로 서버사이드 개발하기
Node.js 자바스크립트로 서버사이드 개발하기JeongHun Byeon
 
Mongodb 특징 분석
Mongodb 특징 분석Mongodb 특징 분석
Mongodb 특징 분석Daeyong Shin
 
시간당 수백만 요청을 처리하는 node.js 서버 운영기 - Playnode 2015
시간당 수백만 요청을 처리하는 node.js 서버 운영기 - Playnode 2015시간당 수백만 요청을 처리하는 node.js 서버 운영기 - Playnode 2015
시간당 수백만 요청을 처리하는 node.js 서버 운영기 - Playnode 2015Goonoo Kim
 
형태소 분석기를 적용한 elasticsearch 운영
형태소 분석기를 적용한 elasticsearch 운영형태소 분석기를 적용한 elasticsearch 운영
형태소 분석기를 적용한 elasticsearch 운영창훈 정
 
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석smartstudy_official
 
Gradle & IntelliJ & Vert.x
Gradle & IntelliJ & Vert.xGradle & IntelliJ & Vert.x
Gradle & IntelliJ & Vert.xKwnaghwan Cho
 
Redis basicandroadmap
Redis basicandroadmapRedis basicandroadmap
Redis basicandroadmapDaeMyung Kang
 
아마존 Aws 서비스_연구
아마존 Aws 서비스_연구아마존 Aws 서비스_연구
아마존 Aws 서비스_연구knight1128
 
Big query at GDG Korea Cloud meetup
Big query at GDG Korea Cloud meetupBig query at GDG Korea Cloud meetup
Big query at GDG Korea Cloud meetupJude Kim
 
HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템박 민규
 
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...OpenStack Korea Community
 
Redis data design by usecase
Redis data design by usecaseRedis data design by usecase
Redis data design by usecaseKris Jeong
 
Redis trouble shooting
Redis trouble shootingRedis trouble shooting
Redis trouble shootingDaeMyung Kang
 
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'sung ki choi
 

Tendances (20)

닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기
 
Node.js 자바스크립트로 서버사이드 개발하기
Node.js 자바스크립트로 서버사이드 개발하기Node.js 자바스크립트로 서버사이드 개발하기
Node.js 자바스크립트로 서버사이드 개발하기
 
About memcached
About memcachedAbout memcached
About memcached
 
Mongodb 특징 분석
Mongodb 특징 분석Mongodb 특징 분석
Mongodb 특징 분석
 
시간당 수백만 요청을 처리하는 node.js 서버 운영기 - Playnode 2015
시간당 수백만 요청을 처리하는 node.js 서버 운영기 - Playnode 2015시간당 수백만 요청을 처리하는 node.js 서버 운영기 - Playnode 2015
시간당 수백만 요청을 처리하는 node.js 서버 운영기 - Playnode 2015
 
형태소 분석기를 적용한 elasticsearch 운영
형태소 분석기를 적용한 elasticsearch 운영형태소 분석기를 적용한 elasticsearch 운영
형태소 분석기를 적용한 elasticsearch 운영
 
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
 
Redis
RedisRedis
Redis
 
Gradle & IntelliJ & Vert.x
Gradle & IntelliJ & Vert.xGradle & IntelliJ & Vert.x
Gradle & IntelliJ & Vert.x
 
Node.js 기본
Node.js 기본Node.js 기본
Node.js 기본
 
Comet
CometComet
Comet
 
Redis basicandroadmap
Redis basicandroadmapRedis basicandroadmap
Redis basicandroadmap
 
아마존 Aws 서비스_연구
아마존 Aws 서비스_연구아마존 Aws 서비스_연구
아마존 Aws 서비스_연구
 
Big query at GDG Korea Cloud meetup
Big query at GDG Korea Cloud meetupBig query at GDG Korea Cloud meetup
Big query at GDG Korea Cloud meetup
 
HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템
 
Ansible
AnsibleAnsible
Ansible
 
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...
 
Redis data design by usecase
Redis data design by usecaseRedis data design by usecase
Redis data design by usecase
 
Redis trouble shooting
Redis trouble shootingRedis trouble shooting
Redis trouble shooting
 
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
 

En vedette

제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30Donghan Kim
 
Maven build for 멀티프로젝트 in jenkins
Maven build for 멀티프로젝트 in jenkins Maven build for 멀티프로젝트 in jenkins
Maven build for 멀티프로젝트 in jenkins Choonghyun Yang
 
NoSQL distilled.그래프 데이터베이스
NoSQL distilled.그래프 데이터베이스NoSQL distilled.그래프 데이터베이스
NoSQL distilled.그래프 데이터베이스Choonghyun Yang
 
Apache Spark Overview part2 (20161117)
Apache Spark Overview part2 (20161117)Apache Spark Overview part2 (20161117)
Apache Spark Overview part2 (20161117)Steve Min
 
NoSQL Database
NoSQL DatabaseNoSQL Database
NoSQL DatabaseSteve Min
 
Docker.소개.30 m
Docker.소개.30 mDocker.소개.30 m
Docker.소개.30 mWonchang Song
 
NoSQL distilled 왜 NoSQL인가
NoSQL distilled 왜 NoSQL인가NoSQL distilled 왜 NoSQL인가
NoSQL distilled 왜 NoSQL인가Choonghyun Yang
 
Do not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYDo not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYHyun-woo Park
 
NoSQL 동향
NoSQL 동향NoSQL 동향
NoSQL 동향NAVER D2
 
[NoSQL] 2장. 집합적 데이터 모델
[NoSQL] 2장. 집합적 데이터 모델[NoSQL] 2장. 집합적 데이터 모델
[NoSQL] 2장. 집합적 데이터 모델kidoki
 
NoSQL 분석 Slamdata
NoSQL 분석 SlamdataNoSQL 분석 Slamdata
NoSQL 분석 SlamdataPikdata Inc.
 
개인정보 비식별화 기술 동향 및 전망
개인정보 비식별화 기술 동향 및 전망 개인정보 비식별화 기술 동향 및 전망
개인정보 비식별화 기술 동향 및 전망 Donghan Kim
 
No sql 5장 일관성
No sql 5장   일관성No sql 5장   일관성
No sql 5장 일관성rooya85
 
정보사회학
정보사회학정보사회학
정보사회학Il-woo Lee
 
파이콘 한국 2017 키노트 : Back to the Basic
파이콘 한국 2017 키노트 : Back to the Basic파이콘 한국 2017 키노트 : Back to the Basic
파이콘 한국 2017 키노트 : Back to the BasicHyun-woo Park
 

En vedette (20)

TRIZ
TRIZTRIZ
TRIZ
 
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
 
Git
Git Git
Git
 
Maven build for 멀티프로젝트 in jenkins
Maven build for 멀티프로젝트 in jenkins Maven build for 멀티프로젝트 in jenkins
Maven build for 멀티프로젝트 in jenkins
 
NoSQL distilled.그래프 데이터베이스
NoSQL distilled.그래프 데이터베이스NoSQL distilled.그래프 데이터베이스
NoSQL distilled.그래프 데이터베이스
 
Apache Spark Overview part2 (20161117)
Apache Spark Overview part2 (20161117)Apache Spark Overview part2 (20161117)
Apache Spark Overview part2 (20161117)
 
NoSQL Database
NoSQL DatabaseNoSQL Database
NoSQL Database
 
Docker.소개.30 m
Docker.소개.30 mDocker.소개.30 m
Docker.소개.30 m
 
NoSQL distilled 왜 NoSQL인가
NoSQL distilled 왜 NoSQL인가NoSQL distilled 왜 NoSQL인가
NoSQL distilled 왜 NoSQL인가
 
Do not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYDo not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDY
 
No sql 분산모델
No sql 분산모델No sql 분산모델
No sql 분산모델
 
Big data
Big dataBig data
Big data
 
NoSQL 동향
NoSQL 동향NoSQL 동향
NoSQL 동향
 
[NoSQL] 2장. 집합적 데이터 모델
[NoSQL] 2장. 집합적 데이터 모델[NoSQL] 2장. 집합적 데이터 모델
[NoSQL] 2장. 집합적 데이터 모델
 
NoSQL 분석 Slamdata
NoSQL 분석 SlamdataNoSQL 분석 Slamdata
NoSQL 분석 Slamdata
 
개인정보 비식별화 기술 동향 및 전망
개인정보 비식별화 기술 동향 및 전망 개인정보 비식별화 기술 동향 및 전망
개인정보 비식별화 기술 동향 및 전망
 
No sql 5장 일관성
No sql 5장   일관성No sql 5장   일관성
No sql 5장 일관성
 
정보사회학
정보사회학정보사회학
정보사회학
 
Express 프레임워크
Express 프레임워크Express 프레임워크
Express 프레임워크
 
파이콘 한국 2017 키노트 : Back to the Basic
파이콘 한국 2017 키노트 : Back to the Basic파이콘 한국 2017 키노트 : Back to the Basic
파이콘 한국 2017 키노트 : Back to the Basic
 

Similaire à Node Js와 Redis를 사용한 구조화된 데이터

게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016Amazon Web Services Korea
 
7가지 동시성 모델 람다아키텍처
7가지 동시성 모델  람다아키텍처7가지 동시성 모델  람다아키텍처
7가지 동시성 모델 람다아키텍처Sunggon Song
 
막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js연웅 조
 
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)LanarkSeung
 
Browser Principle에 대해 알아보자.pdf
Browser Principle에 대해 알아보자.pdfBrowser Principle에 대해 알아보자.pdf
Browser Principle에 대해 알아보자.pdfHo Jeong Im
 
Node.js 시작하기
Node.js 시작하기Node.js 시작하기
Node.js 시작하기Huey Park
 
세션3 node.js의 의미와 자바의 대안
세션3 node.js의 의미와 자바의 대안세션3 node.js의 의미와 자바의 대안
세션3 node.js의 의미와 자바의 대안Lee Ji Eun
 
Node.js DBMS short summary
Node.js DBMS short summaryNode.js DBMS short summary
Node.js DBMS short summaryHoChul Shin
 
Vert.x
Vert.x Vert.x
Vert.x ymtech
 
Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나JeongHun Byeon
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용Jin wook
 
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST APIWooyoung Ko
 
파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄 파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄 SeongHyun Ahn
 
11_웹서비스활용
11_웹서비스활용11_웹서비스활용
11_웹서비스활용noerror
 
log-monitoring-architecture.pdf
log-monitoring-architecture.pdflog-monitoring-architecture.pdf
log-monitoring-architecture.pdfSungkyun Kim
 
빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.x빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.xTerry Cho
 

Similaire à Node Js와 Redis를 사용한 구조화된 데이터 (20)

게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
 
7가지 동시성 모델 람다아키텍처
7가지 동시성 모델  람다아키텍처7가지 동시성 모델  람다아키텍처
7가지 동시성 모델 람다아키텍처
 
Html5 performance
Html5 performanceHtml5 performance
Html5 performance
 
막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js
 
Redis 2017
Redis 2017Redis 2017
Redis 2017
 
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
 
Node.js 첫걸음
Node.js 첫걸음Node.js 첫걸음
Node.js 첫걸음
 
Browser Principle에 대해 알아보자.pdf
Browser Principle에 대해 알아보자.pdfBrowser Principle에 대해 알아보자.pdf
Browser Principle에 대해 알아보자.pdf
 
Node.js 시작하기
Node.js 시작하기Node.js 시작하기
Node.js 시작하기
 
세션3 node.js의 의미와 자바의 대안
세션3 node.js의 의미와 자바의 대안세션3 node.js의 의미와 자바의 대안
세션3 node.js의 의미와 자바의 대안
 
Node.js DBMS short summary
Node.js DBMS short summaryNode.js DBMS short summary
Node.js DBMS short summary
 
Vert.x
Vert.x Vert.x
Vert.x
 
Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용
 
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
 
파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄 파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄
 
4-2. ajax
4-2. ajax4-2. ajax
4-2. ajax
 
11_웹서비스활용
11_웹서비스활용11_웹서비스활용
11_웹서비스활용
 
log-monitoring-architecture.pdf
log-monitoring-architecture.pdflog-monitoring-architecture.pdf
log-monitoring-architecture.pdf
 
빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.x빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.x
 

Node Js와 Redis를 사용한 구조화된 데이터

  • 2.  Node 및 Redis 시작  게임 순위표 만들기  메시지 큐 만들기  Express 애플리케이션에 Stats 미들웨어 추 가
  • 3.  메모리 내의 키/ 값 저장소로 유명  Node는 Redis, Memcached,Cassandra 모두 지원
  • 4.  빠른 액세스를 위해 데이터 쿼리를 메모리 상에 캐시하기 위해 사용  분산 컴퓨팅에도 적합  복잡한 데이터에 대해서는 제한된 지원만을 제공  대량의 쿼리를 처리하는 애플리케이션에는 유용하지만, 데이터를 읽고 쓰는 것이 많은 애플리케이션에서는 유용성이 떨어짐  http://memcached.org/
  • 5.  MemCached 처럼 클러스터 지원  MemCached와 마찬가지로 지원하는 데이 터 구조가 제한  Redis에 적합하지 않은 임시 쿼리를 처리하 는데 알맞음  http://cassandra.apache.org/
  • 6.  데이터를 읽고 쓰는 것이 많은 곳에 사용  영속적으로 저장 가능  다양한 유형의 데이터를 지원. (Memcached에 비해 더 많은 유연성 제공)  Cassandra에 비해 빠름.  단일 머신에서만 구동.  Http://redis.io/
  • 8.
  • 9.  데이터베이스를 이용하면 데이터를 영속적으 로 관리할 수 있지만, 입출력에 다소 시간이 걸 리기 때문에 실시간 서비스에서는 더 적합한 저장소를 사용할 필요  Redis는 메모리 기반의 저장소이기 때문에 필 요한 정보를 빠르게 저장하고 가져올 수 있는 실시간 서비스에 적합한 저장소  멤버 id, 플레이어 이름, 게임이름, 마지막 플레 이한 날짜, 점수, 나머지 관련 정보 저장.  https://github.com/dmajkic/redis/downloads
  • 10.  Redis를 사용하여 구현.  npm install redis  hiredis라는 공식적인 hiredis C 라이브러리를 바인딩하여 Non-Blocking의 빠른 모듈  npm install hiredis redis  Async 설치 (series 기능 사용하기 위함. 호출이 순서대로 호출되고 데이터 역시 순서대로 반환 보장)  npm install async
  • 11.  Redis 모듈 포함  Var redis = require(‘redis’);  Redis 클라이언트 생성  Var client = redis.createClient();  3개의 선택적인 파라미터 ▪ Port : 6379 ▪ Host : 127.0.0.1 ▪ 옵션 : parser, return_buffers, detect_buffers, socket_nodelay, no_ready_check  연결 종료  Client.quit();  강제 종료  Client.end();
  • 12.  Redis 모듈 포함  Var redis = require(‘redis’);  Redis 클라이언트 생성  Var client = redis.createClient();  3개의 선택적인 파라미터 ▪ Port : 6379 ▪ Host : 127.0.0.1 ▪ 옵션 : parser, return_buffers, detect_buffers, socket_nodelay, no_ready_check  연결 종료  Client.quit();  강제 종료  Client.end();
  • 13.  Redis 해시 속성 설정 Client.hset(“hashid”, “propname”, “propvalue”, function(err, reply) { 오류 혹은 응답에 대해 무엇인가를 수행 } );  성공 확인 응답  Rredis.print ▪ 에러나 응답을 콘솔에 출력 후 반환  Client.hset (“hashid”, “propname”, “propvalue”, redis.print);
  • 14.
  • 15. var net = require('net'); var redis = require('redis'); var server = net.createServer(function(conn) { console.log('connected'); // create Redis client var client = redis.createClient(); client.on('error', function(err) { console.log('Error ' + err); }); // fifth database is game score database client.select(5); conn.on('data', function(data) { console.log(data + ' from ' + conn.remoteAddress + ' ' + conn.remotePort); try { var obj = JSON.parse(data); // add or overwrite score client.hset(obj.member, "first_name", obj.first_name, redis.print); client.hset(obj.member, "last_name", obj.last_name, redis.print); client.hset(obj.member, "score", obj.score, redis.print); client.hset(obj.member, "date", obj.date, redis.print); // add to scores for Zowie! client.zadd("Zowie!", parseInt(obj.score), obj.member); } catch(err) { console.log(err); } }); conn.on('close', function() { console.log('client closed connection'); client.quit(); }); }).listen(8124); console.log('listening on port 8124');
  • 16.  var net = require('net'); var client = new net.Socket(); client.setEncoding('utf8'); // connect toTCP server client.connect ('8124','examples.burningbird.net', function () { console.log('connected to server'); }); // prepare for input from terminal process.stdin.resume(); // when receive data, send to server process.stdin.on('data', function (data) { client.write(data); }); // when receive data back, print to console client.on('data',function(data) { console.log(data); }); // when server closed client.on('close',function() { console.log('connection is closed'); });
  • 17.  두개의 다른 데이터 저장소가 업데이트 됨.  개별적인 점수 정보(이름, 점수, 날짜를 포 함)은 hash에 저장  Client.hset ( obj.member, “first_name”, obj.first_name, redis.print );  멤버 id 와 점수는 sorted set에 저장  Client.zadd( “Zowie!”, parseInt(obj.score), obj.member );
  • 18.  Score.jade  Doctype 5  doctype html
  • 19.
  • 20.  doctype html html(lang="en") head title Zowie!Top Scores meta(charset="utf-8") | <style type="text/css"> include main.css | </style> body table caption Zowie!Top Scorers! tr th Score th Name th Date if scores.length each score in scores if score tr td #{score.score} td #{score.first_name} #{score.last_name} td #{score.date}
  • 21.  body { margin: 50px; } table { width: 90%; border-collapse: collapse; } table, td, th, caption { border: 1px solid #000; } td { padding: 20px; }  caption { font-size: larger; background-color: #ff0; padding: 10px; } h1 { font: 1.5em Georgia, serif; } ul { list-style-type: none; } form { margin: 20px; padding: 20px; }
  • 22.  var http = require('http'); var async = require('async'); var redis = require('redis'); var jade = require('jade'); // set up Jade template var layout = require('fs').readFileSync(__dirname + '/score.jade', 'utf8'); var fn = jade.compile(layout, {filename: __dirname + '/score.jade'}); // start Redis client var client = redis.createClient(); // select fifth database client.select(5); // helper function function makeCallbackFunc(member) { return function(callback) { client.hgetall(member, function(err, obj) { callback(err,obj); }); }; }  http.createServer(function(req,res) { // first filter out icon request if (req.url === '/favicon.ico') { res.writeHead(200, {'Content-Type': 'image/x- icon'} ); res.end(); return; } // get scores, reverse order, top five only client.zrevrange('Zowie!',0,4, function(err,result) { var scores; if (err) { console.log(err); res.end('Top scores not currently available, please check back'); return; }
  • 23.  // create array of callback functions for Async.series call var callFunctions = new Array(); // process results with makeCallbackFunc, push newly returned // callback into array for (var i = 0; i < result.length; i++) { callFunctions.push(makeCallbackFu nc(result[i])); }  // using Async series to process each callback in turn and return // end result as array of objects async.series( callFunctions, function (err, result) { if (err) { console.log(err); res.end('Scores not available'); return; } // pass object array to template engine var str = fn({scores : result}); res.end(str); }); }); }).listen(3000); console.log('Server running on 3000/');
  • 24.  메시지 큐  특정한 통신 형식을 입력으로 받아 큐에 저장하 는 애플리케이션  메시지는 메시지 수신자가 가져갈 때 까지 저장 되었다가 해당 시점에 큐에서 뽑혀져서 수신자 에게 전송(한번에 하나씩 혹은 대량))  통신은 비동기로 이루어짐
  • 25.  메시지 큐를 보여주기 위해 여러 개의 다양한 하위 도메인에 대한 웹 로그 파일에 접근하는 애플리케이 션  메시지 큐 애플리케이션이 수행하는 것은 3000번에 서 메시지를 수신대기하다가 전송된 항목을 Redis 데이터 저장소로 저장  로그 항목을 받은 후 로그 데이터에서 이미지 리소 스(jpg, gif 등)가 접근되었는지를 찾아보는 정규식 검사를 수행. 일치하는 패턴이 발견되면 리소스 URL 을 메시지 큐 애플리케이션에 전송
  • 26.  Redis 클라이언트를 만들어서 애플리케이션이 종료될 때 까지 지속?  Redis 클라이언트를 만든 후 Redis 명령어를 실행하자 마 자 바로 해제?  영구적이 좋은가? 즉시 해제하는 것이 좋은가?  클라이언트 연결유지가 더 빠를것이라는 예상 맞음. 연결을 유지하는 경우를 테스트 하는 도중 애플리케이션이 잠시 동 안 상당히 느려졌다가 상대적으로 빠른 속도를 회복  Redis 데이터베이스에 대해 대기 중인 요청들이 큐가 해제도 리 때 까지 Node 애플리케이션을 일시적으로 차단시켰기 때 문. 매번 요청할 때마다 연결을 열고 닫는 경우에는 동일한 상 황을 겪지 않았는데, 열고 닫는 과정에 들어가는 추가 오버헤 드가 애플리케이션의 성능을 저하시켜서 동시 사용자 상한선 에 도달하지 않았기 때문
  • 27.  이전 장들에서 만들어본 위젯 애플리케이션 에 통계를 추가하기 위해 Redis를 사용  통계는 위젯 애플리케이션의 페이지에 접근 하는 모든 ip 주소들의 집합과 각 리소스가 접근된 횟수라는 두개로 제한  두 개의 분리된 데이터 컬렉션을 한번에 가 져오기 위해 redis 트랜잭션을 제어하는 multi 사용
  • 28.  1. Redis 데이터 베이스에 접근 정보를 기록 하기 위한 새로운 미들웨어 추가  Ip 주소를 추가 ▪ Client.sadd(‘ip’, req.socket.remoteAddress);  리소스 카운트 증가 ▪ Client.hincrby(‘myurls’, req.url, 1);
  • 29.  2. routes/index.js  통계 애플리케이션에서 새로운 컨트롤러 코드를 가진 라우팅 색인 파일  통계 인터페이스는 최상위 도메인에서 접근되므로 routes 폴더에 추가.  Express 4에서 에러나는 부분들…. 좀 더 찾아봐야…  app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.staticCache({maxObjects: 100, maxLength: 512}));  app.use(express.bodyParser());  app.use(express.methodOverride());  app.use(app.router);  app.use(express.directory(__dirname + '/public'));  app.use(function(req, res, next){ throw new Error(req.url + ' not found'); }); app.use(function(err, req, res, next) { console.log(err); res.send(err.message); });