Nodejs, MemCacheD 의 실제 프로젝트 에서 의 사용

4224 단어
오늘 은 MemCacheD 를 Nodejs 프로젝트 에 통합 해 보 았 지만 전반적 으로 순 조 롭 습 니 다.
최근 에 업 데 이 트 된 Cacher 라 이브 러 리 를 먼저 시 도 했 습 니 다. 작가 의 생각 이 아주 좋 습 니 다. express 미들웨어 형식 으로 Cache 의 모든 HTTP 요청 을 시 도 했 지만 실제 사용 해 보 니 오류 율 이 비교적 많 습 니 다.대충 보면 작가 의 소스 코드 는 사용자 정의 res. write 함 수 를 제공 하고 next rounter 가 생 성 한 response 내용 을 캡 처 한 다음 에 body, header 를 모두 cache 로 만 들 었 을 것 입 니 다. 그러나 그 작 가 는 key 2 개 를 사 용 했 습 니 다. 하 나 는 정상 적 인 stale 접미사 로 잘 모 르 고 이렇게 하면 문제 가 많아 서 더 이상 연구 하지 않 았 습 니 다.이 어 조금 성숙 한 memcached 라 이브 러 리 를 시도 했다.
이 라 이브 러 리 가 제공 하 는 기능 은 주로 get / set 작업 에 카 스, increase, decrease, create 입 니 다.작가 가 비교적 주도면밀 하 게 고려 한 것 은 connection 을 관리 한 것 이다.사용 해도 원활 하 지 는 않 지만 어쨌든 사용 할 수 있 습 니 다.(작가 원본 은 connection 관리 에 있어 중대 한 결함 이 있 습 니 다. 저 는 npm 가 설치 한 버 전 을 통 해 그 문 제 를 해결 하지 못 하고 나중에 github 에 달 려 갔습니다 (https://github.com/3rd-Eden/node-memcached), approved pull reqeust 2 개가 있 는 것 을 보고 다운로드 해서 업데이트 하면 훨씬 편 해 집 니 다.)
자, 이제 코드 를 보 겠 습 니 다. 코드 가 간단 합 니 다. 제 가 간단 한 wrapper 를 썼 습 니 다.
var Memcached = require('memcached');

dummy: function dummy(error, ok) { }

module.exports = {

    init: function ctor(server, opt) {
        console.log("memcached is initialized");
        memcached = new Memcached('localhost:11211', { debug: true });

        //memcached.on("failure", function (detail) {})
        //         .on('connect', function (detail) {})
        //         .on('reconnect', function (detail) {})
        //         .on('reconnecting', function (detail) {})
        //         .on('remove', function (detail) {})
        //         .on('issue', function (detail) {});
    },

    set: function addToCache(key, val, expire, callback) {
        if (!expire) expire = 5 * 60; //sec
        if (!callback) callback = dummy;
        memcached.set(key, val, expire, callback);
    },

    get: function getFromCache(key, callback) {
        if (!callback) callback = dummy;
        memcached.get(key, callback);
    },
};

주의 하 세 요. 위의 그 Dummy 는 생략 할 수 없습니다. 만약 에 쓰 지 않 으 면 set 는 작용 하지 않 을 것 입 니 다. 잘못 보고 하지 않 을 것 입 니 다. 처음에 이 문제 에 부 딪 혀 많은 시간 을 낭비 하 였 습 니 다.
위 에서 설명 한 것 은 작가 가 connection 상 태 를 감시 하 는 이벤트 로 요청 을 처리 할 때 server 가 끊 기 면 'issue' 이벤트 가 실 행 됩 니 다. 그리고 memcached server 를 다시 연결 하려 고 합 니 다. 그의 문서 에 따 르 면 최대 재 시도 횟수 를 초과 하면 failure 사건 이 발생 하지만 저 는 캡 처 하지 못 했 습 니 다.또 하나의 문 제 는 서비스 가 실 효 된 후 첫 번 째 요청 은 콜 백 이 실행 되 지 않 기 때문에 작은 문제 가 있 을 수 있다 는 것 이다.또한, 제 웹 서버 는 MemCacheD 가 설치 되 어 있 지 않 은 서버 에서 실 행 될 가능성 이 높 습 니 다. 그러면 매번 server 가 일어나 면 사용자 의 첫 번 째 요청 이 실패 하고 좋 지 않 습 니 다. 그래서 저 는 프로그램 에서 한 번 촉발 합 니 다. 코드 는 다음 과 같 습 니 다. 그 안의 5 는 대상 의 생존 기간 이 5 초 라 는 뜻 입 니 다.주의 하 세 요. 여 기 는 제 가 봉 인 된 memcached 대상 을 사용 합 니 다. 라 이브 러 리 에 있 는 것 이 아 닙 니 다.
http.createServer(app).listen(app.get('port'), function () {
    console.log('Express server listening on port ' + app.get('port'));

    // Trigger a MemCaheD to test the MemCacheD server
    memcahced.set("dummy", "dummy", 5);
});

실제 함수 에서 의 사용:
/*private*/
function getServiceData(partialUrl, params, useCache, callback) {
    assert(params.productId, "Missing parameter: productId");
    assert(params.weekId, "Missing parameter: weekId");
    var url = cerRestApi.getRequestUrl(partialUrl, params);
    console.log(url);

    if (!useCache) {
        cerRestApi.getCall(url, callback);
        return;
    }

    memcahced.get(url, function (errCache, result) {
        if (!result) {
            cerRestApi.getCall(url, function (err, data) {
                if (!err && !errCache) {
                    memcahced.set(url, data);
                }
                console.log(data);
                callback(err, data);
            });
        }
        else {
            callback(false, result);
        }
    });
}

먼저 cache 에서 데 이 터 를 가 져 오 려 고 시도 합 니 다. 실패 하면 result 가 false 또는 undefined 이면 backend 의 WebService 에서 데 이 터 를 가 져 오고 데이터 가 성공 하면 cache 에 기록 합 니 다.다음 에는 cache 에서 직접 데 이 터 를 얻 을 수 있 습 니 다.
전체적으로 말 하면 MemCacheD 는 사용 하기에 매우 편리 하 다. 바로 nodeJS 의 라 이브 러 리 가 그다지 힘 이 되 지 않 는 다 는 것 이다. 하하.

좋은 웹페이지 즐겨찾기